我正在加入域的 RHEL 服务器上设置内部 Web 服务器,通过 GSS 代理进行 Kerberos 身份验证,并使用 LDAP 进行分层授权,其中 Active Directory 是真实来源。Kerberos 和身份验证部分运行良好,但我无法使授权正常工作,我没有任何主意。
以下是目录配置:
<Directory /var/www/nietools.elsinor.net/html/>
AuthType GSSAPI
AuthName "GSSAPI Login"
Require valid-user
</Directory>
<Directory /var/www/nietools.elsinor.net/html/tools/config_grep/>
AuthType GSSAPI
AuthName "GSSAPI Login"
#GssapiConnectionBound On
#GssapiSignalPersistentAuth On
#GssapiUseSessions On
#Session On
#SessionCookieName gssapi_session path=/private;httponly;secure;
AuthLDAPUrl "ldaps://ad.elsinor.net:636/OU=People,DC=ad,DC=elsinor,DC=net/?sAMAccountName?sub"
AuthLDAPBindDN "CN=nietools,OU=Services,DC=ad,DC=elsinor,DC=net"
AuthLDAPBindPassword "exec:/bin/cat /etc/httpd/conf.d/pw"
Require ldap-group "CN=NIE,OU=Groups,DC=ad,DC=elsinor,DC=net"
</Directory>
第一个目录配置完全按照预期工作。如果您从域笔记本电脑连接,它会透明地进行身份验证。如果不是,它会提示登录。一切都很好。
第二个目录不授权任何人。注释掉的参数都是我为了解决这个问题而弄乱的东西。我之所以关注这些参数,是因为 Apache 错误日志中的消息。经过身份验证的用户尝试访问第二个目录会产生以下错误:
2023-08-07 15:40:27.893785 clientip=10.61.3.159:41364, hdr_referer="https://nietools.elsinor.net/", servername=nietools.elsinor.net, pid=45071, tid=140289914160704, module=authz_core, loglevel=error, message="AH01631: user [email protected]: authorization failure for "/tools/config_grep": "
2023-08-07 15:40:27.992661 clientip=10.61.3.159:41364, hdr_referer="https://nietools.elsinor.net/", servername=nietools.elsinor.net, pid=45071, tid=140289905768000, module=auth_gssapi, loglevel=error, message="INTERNAL ERROR Mechanism needs continuation but neither GssapiConnectionBound nor GssapiUseSessions are configured"
这些错误消息始终出现,似乎无论我如何配置 GssapiConnectionBound 和 GssapiUseSessions——在我发现的与此类设置相关的任何配置参考中都没有出现。
顺便说一句,如果我从等式中删除 LDAP 并将用户放入手动定义的组,则身份验证将按预期工作,如下所示:
<Directory /var/www/nietools.elsinor.net/html/tools/config_grep/>
AuthType GSSAPI
AuthName "GSSAPI Login"
AuthGroupFile "/etc/httpd/conf.d/groups"
Require group nie
</Directory>
内部错误消息是否可能是良性的,而真正的问题更普通——例如使用 SamAccountName 以外的属性?(我已经尝试过 UserPrincipalName。)
顺便说一下,这是 RHEL 9 和 Apache 2.4。
编辑:我在 Apache 调试日志中注意到了一些内容:Kerberos 模块通过了[电子邮件保护]到 LDAP 模块,但 UserPrincipalName 是[电子邮件保护]。这可能是问题所在。我怀疑我必须以某种方式使用 UserPrincipalName 属性和别名“AD.ELSINOR.NET”来代替“elsinor.net”。
编辑2:不是。我实施了 user1686 的建议,Apache 日志现在表明用户身份应该与 sAMAccountName 匹配。不幸的是,他们仍然没有获得授权。我怀疑有以下两种情况之一:
还有一些更基本的问题,我就是找不到。我检查了 AuthLDAPUrl、AuthLDAPBindDN 和 Require 值大约 20 次。
“需要继续”错误实际上是相关的,我还没有正确解决它,因为我不知道它是什么意思。
我应该补充的是,我已经执行过sudo setsebool -P httpd_can_connect_ldap 1
,并且 SELinux 审核是干净的,即使在禁用令人讨厌的静默拒绝之后也是如此semodule -DB
。
编辑3:gssproxy 配置:
[service/HTTP]
mechs = krb5
cred_store = keytab:/etc/krb5.keytab
cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U
euid = 48
krb5_principal = HTTP
[service/ldap]
mechs = krb5
cred_store = keytab:/etc/krb5.keytab
cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U
euid = 55
krb5_principal = ldap
[service/imap]
mechs = krb5
cred_store = keytab:/etc/krb5.keytab
cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U
euid = 76
krb5_principal = imap
答案1
Kerberos 主体名称与 Active Directory UPN 并不完全相同。您从 GSSAPI 收到的主体看起来喜欢UPN(令人困惑的是,两者都被命名为“主体名称”)但实际上与它根本没有直接关系。
sAMAccountName
AD 中的 Kerberos 主体由 NT 用户名( )加上域的 Kerberos 领域(始终是域的大写版本,无论任何 UPN 后缀)组成。
我可能会使用GssapiLocalName On
Krb5 库尝试将主体转换为“本地帐户名称”;在默认配置中,此转换始终只会剥离系统默认领域。也就是说,[email protected]
变为user
,然后适合针对 sAMAccountName 的 LDAP 查询(而来自外部领域的主体保持原样)。