Kerberos&signle-sign-on for website

我有一个使用Apache在Linux计算机上运行的网站。 我已经使用mod_auth_kerb进行针对Windows Active Directory服务器的单点loginKerberos身份validation。

为了使Kerberos正常工作,我在Active Directory中创build了一个名为dummy的服务帐户。

我使用以下命令在Windows AD服务器上使用ktpass.exe生成了Linux Web服务器的密钥表:

ktpass /out C:\krb5.keytab /princ HTTP/[email protected] /mapuser [email protected] /crypto RC4-HMAC-NT /ptype KRB5_NT_PRINCIPAL /pass xxxxxxxxx

我可以使用以下命令成功从Linux Web服务器获取票据:

kinit -k -t /path/to/keytab HTTP/[email protected]

…并使用klist查看票证。

我还用这些Kerberos属性configuration了我的Web服务器:

 <Directory /> AuthType Kerberos AuthName "Example.com Kerberos domain" KrbMethodK5Passwd Off KrbAuthRealms EXAMPLE.COM KrbServiceName HTTP/[email protected] Krb5KeyTab /path/to/keytab Require valid-user SSLRequireSSL <Files wsgi.py> Order deny,allow Allow from all </Files> </Directory> 

但是,当我尝试login到该网站时(使用用户名Jeff的另一个桌面),我的Kerberos凭据不会被Web服务器自动接受。 之后它应该立即授予我访问权限,但是不会。 我从mod_auth_kerb日志得到的唯一信息是:

kerb_authenticate_user entered with user (NULL) and auth_type Kerberos

但是,当我将mod_auth_kerb设置KrbMethodK5Passwd更改为On时,会显示更多信息:

 [Fri Oct 18 17:26:44 2013] [debug] src/mod_auth_kerb.c(1939): [client xxx.xxx.xxx.xxx] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos [Fri Oct 18 17:26:44 2013] [debug] src/mod_auth_kerb.c(1031): [client xxx.xxx.xxx.xxx] Using HTTP/[email protected] as server principal for password verification [Fri Oct 18 17:26:44 2013] [debug] src/mod_auth_kerb.c(735): [client xxx.xxx.xxx.xxx] Trying to get TGT for user [email protected] [Fri Oct 18 17:26:44 2013] [debug] src/mod_auth_kerb.c(645): [client xxx.xxx.xxx.xxx] Trying to verify authenticity of KDC using principal HTTP/[email protected] [Fri Oct 18 17:26:44 2013] [debug] src/mod_auth_kerb.c(1110): [client xxx.xxx.xxx.xxx] kerb_authenticate_user_krb5pwd ret=0 [email protected] authtype=Basic 

我错过了什么? 我学习了很多在线教程,找不到Kerberos凭据不允许访问的原因。

在深入了解更多日志信息后,我发现客户端机器没有正确响应服务器的票证。 您可以在客户端计算机上告诉某事的方式是错误的,那就是您将看到Apache服务器的错误消息“未能validationkrb5凭证: 在Kerberos数据库中找不到服务器 ”。 在客户机上的/etc/krb5.conf文件中,您必须确保Web域名映射到正确的Kerberos领域:

 [domain_realm] example.com = REALM.EXAMPLE.COM .example.com = REALM.EXAMPLE.COM 

如果没有这个,客户端将拒绝服务器,因为Kerberos票据可能只来自明确允许的领域

我希望这些信息可以帮助其他人!