使用 GSS 代理身份验证和 LDAP 授权对 Apache 进行故障排除

使用 GSS 代理身份验证和 LDAP 授权对 Apache 进行故障排除

我正在加入域的 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 匹配。不幸的是,他们仍然没有获得授权。我怀疑有以下两种情况之一:

  1. 还有一些更基本的问题,我就是找不到。我检查了 AuthLDAPUrl、AuthLDAPBindDN 和 Require 值大约 20 次。

  2. “需要继续”错误实际上是相关的,我还没有正确解决它,因为我不知道它是什么意思。

我应该补充的是,我已经执行过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(令人困惑的是,两者都被命名为“主体名称”)但实际上与它根本没有直接关系。

sAMAccountNameAD 中的 Kerberos 主体由 NT 用户名( )加上域的 Kerberos 领域(始终是域的大写版本,无论任何 UPN 后缀)组成。

我可能会使用GssapiLocalName OnKrb5 库尝试将主体转换为“本地帐户名称”;在默认配置中,此转换始终只会剥离系统默认领域。也就是说,[email protected]变为user,然后适合针对 sAMAccountName 的 LDAP 查询(而来自外部领域的主体保持原样)。

相关内容