我正在尝试让 Ubuntu 12.04 上的 Apache 通过 Kerberos SSO 向 Windows 2008 Active Directory 服务器验证用户身份。以下几点使我的情况有所不同:
我没有 Windows Server 的管理权限(也永远不会有权限)。我也不能让任何人以我的名义对服务器进行任何更改。
我已使用 PBIS open 将 Ubuntu 服务器加入到 Active Directory。
用户可以使用他们的 AD 凭据登录 Ubuntu 服务器。kinit 也适用于每个用户。
由于我无法更改 AD(除了添加新机器和 SPN),因此我无法在 Ubuntu 上为 Apache 添加服务帐户。
由于我无法添加服务帐户,因此我必须使用计算机密钥表 (/etc/krb5.keytab),或者至少在另一个密钥表中使用计算机密码。现在我正在使用计算机密钥表并授予 Apache 只读访问权限(我知道这是个坏主意)。
我已经使用 net ads keytab add HTTP -U 添加了 SPN
由于我使用的是 Ubuntu 12.04,因此在“net ads keytab add”期间添加的唯一编码类型是 arcfour-hmac、des-cbc-crc 和 des-cbc-md5。PBIS 在加入域时将 AES 编码类型添加到主机和 cifs 主体,但我尚未使用“net ads keytab add”来执行此操作。
由于上述#1的原因,ktpass 和 setspn 是不可能的。
我已经配置(针对 Kerberos SSO)并测试了 IE 8 和 Firefox。
我在我的 Apache 站点配置中使用以下配置:
<Location /secured> AuthType Kerberos AuthName "Kerberos Login" KrbMethodNegotiate On KrbMethodK5Passwd On KrbAuthRealms DOMAIN.COM Krb5KeyTab /etc/krb5.keytab KrbLocalUserMapping On require valid-user </Location>
当 Firefox 尝试连接时,Apache 的 error.log (LogLevel debug) 中会显示以下内容:
[Wed Oct 23 13:48:31 2013] [debug] src/mod_auth_kerb.c(1628): [client 192.168.0.2] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Wed Oct 23 13:48:31 2013] [debug] mod_deflate.c(615): [client 192.168.0.2] Zlib: Compressed 477 to 322 : URL /secured
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(1628): [client 192.168.0.2] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(994): [client 192.168.0.2] Using HTTP/[email protected] as server principal for password verification
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(698): [client 192.168.0.2] Trying to get TGT for user [email protected]
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(609): [client 192.168.0.2] Trying to verify authenticity of KDC using principal HTTP/[email protected]
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(652): [client 192.168.0.2] krb5_rd_req() failed when verifying KDC
[Wed Oct 23 13:48:37 2013] [error] [client 192.168.0.2] failed to verify krb5 credentials: Decrypt integrity check failed
[Wed Oct 23 13:48:37 2013] [debug] src/mod_auth_kerb.c(1073): [client 192.168.0.2] kerb_authenticate_user_krb5pwd ret=401 user=(NULL) authtype=(NULL)
[Wed Oct 23 13:48:37 2013] [debug] mod_deflate.c(615): [client 192.168.0.2] Zlib: Compressed 477 to 322 : URL /secured
当 IE 8 尝试连接时,我得到:
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1628): [client 192.168.0.2] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Wed Oct 23 14:03:30 2013] [debug] mod_deflate.c(615): [client 192.168.0.2] Zlib: Compressed 477 to 322 : URL /secured
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1628): [client 192.168.0.2] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1240): [client 192.168.0.2] Acquiring creds for HTTP@apache_server
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1385): [client 192.168.0.2] Verifying client data using KRB5 GSS-API
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1401): [client 192.168.0.2] Client didn't delegate us their credential
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1420): [client 192.168.0.2] GSS-API token of length 9 bytes will be sent back
[Wed Oct 23 14:03:30 2013] [debug] src/mod_auth_kerb.c(1101): [client 192.168.0.2] GSS-API major_status:000d0000, minor_status:000186a5
[Wed Oct 23 14:03:30 2013] [error] [client 192.168.0.2] gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information (, )
[Wed Oct 23 14:03:30 2013] [debug] mod_deflate.c(615): [client 192.168.0.2] Zlib: Compressed 477 to 322 : URL /secured
如果您需要额外的日志和配置文件,请告诉我——最初的问题已经够长了。
答案1
我没有在 Apache 中设置 kerberos 委派的丰富经验,但我很确定 apache 中定义的服务名称需要与 keytab 文件中的服务名称匹配。
像这样明确设置服务名称:
<Location /secured>
AuthType Kerberos
AuthName "Kerberos Login"
KrbMethodNegotiate On
KrbMethodK5Passwd On
KrbAuthRealms DOMAIN.COM
Krb5KeyTab /etc/krb5.keytab
KrbLocalUserMapping On
KrbServiceName HTTP/apache_server.DOMAIN.com
require valid-user
</Location>
AD 中的机器帐户需要设置 SPN HTTP/apache_server.DOMAIN.com
,但听起来你已经设置好了
答案2
就目前而言,上面的答案是正确的,但不幸的是,你必须使用 keytab 中的服务名称
sudo ktutil list
据我所知,AD SPN 是别名,当客户端请求 HTTP/apache_server.com 时,它实际上会获取 host/apache_server.com 的 kerberos 服务票证。
Unix 方面的 Kerberos 对这些别名一无所知,因此您必须明确说明密钥表中的内容。
有一件事可能会有所帮助,那就是获取支持使用 Any 关键字的最新版本的 mod_auth_kerb
KrbServiceName Any
这意味着模块将搜索密钥表并使用找到的所有密钥,直到其中一个密钥可用。