使用机器帐户通过 Kerberos 进行 Apache SSO

使用机器帐户通过 Kerberos 进行 Apache SSO

我正在尝试让 Ubuntu 12.04 上的 Apache 通过 Kerberos SSO 向 Windows 2008 Active Directory 服务器验证用户身份。以下几点使我的情况有所不同:

  1. 我没有 Windows Server 的管理权限(也永远不会有权限)。我也不能让任何人以我的名义对服务器进行任何更改。

  2. 我已使用 PBIS open 将 Ubuntu 服务器加入到 Active Directory。

  3. 用户可以使用他们的 AD 凭据登录 Ubuntu 服务器。kinit 也适用于每个用户。

  4. 由于我无法更改 AD(除了添加新机器和 SPN),因此我无法在 Ubuntu 上为 Apache 添加服务帐户。

  5. 由于我无法添加服务帐户,因此我必须使用计算机密钥表 (/etc/krb5.keytab),或者至少在另一个密钥表中使用计算机密码。现在我正在使用计算机密钥表并授予 Apache 只读访问权限(我知道这是个坏主意)。

  6. 我已经使用 net ads keytab add HTTP -U 添加了 SPN

  7. 由于我使用的是 Ubuntu 12.04,因此在“net ads keytab add”期间添加的唯一编码类型是 arcfour-hmac、des-cbc-crc 和 des-cbc-md5。PBIS 在加入域时将 AES 编码类型添加到主机和 cifs 主体,但我尚未使用“net ads keytab add”来执行此操作。

  8. 由于上述#1的原因,ktpass 和 setspn 是不可能的。

  9. 我已经配置(针对 Kerberos SSO)并测试了 IE 8 和 Firefox。

  10. 我在我的 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

这意味着模块将搜索密钥表并使用找到的所有密钥,直到其中一个密钥可用。

相关内容