不带 @DOMAIN 后缀的 REMOTE_USER 变量

不带 @DOMAIN 后缀的 REMOTE_USER 变量

我管理一个应用程序,该应用程序支持使用有效 AD 用户进行单点登录,目前在 IIS 上运行。为了提高性能,我有一个任务是将 Web 层迁移到 Linux 上的 Apache/Php。

我在 Win2012 Server 上有一个 AD,在 CentOS 上有一个 Apache。我已成功加入域 (TEST.COM),并且可以使用 Windows 用户帐户登录 centos。

我还配置了 Kerberos 和 Samba,并且 SSO 可以运行,但有一个问题。

AD 中的用户导入到应用程序中时不带域名前缀/后缀。因此,如果我的用户在 AD 中是 TEST\myUser,那么在应用程序中该用户就是 myUser。

应用程序从 REMOTE_USER 变量读取用户名,但用户名附加了 @DOMAIN 字符串,导致完整用户名[电子邮件保护]。应用程序自然认为这不是有效用户,因为它认为它只是 myUSer。如果我在应用程序中添加一个名为[电子邮件保护],则 SSO 可以正常工作。

有没有办法丢弃 REMOTE_USER 变量中的 @DOMAIN 属性?您将如何做以及需要配置哪些文件?

答案1

mod_auth_kerb 是 Kerberos 特有的:它通过 HTTP Negotiate 实现 Kerberos 身份验证。因此,在 REMOTE_USER 环境变量中,它报告已验证客户端的 Kerberos 标识(“主体名称”)。Kerberos 主体名称写作 foo/bar/baz/...@REALM;主要组件称为“实例”(通常只看到一个或两个),“领域”是 Kerberos 系统内的信任域,是一种内置联合机制。在 AD 中,Kerberos 领域与 AD“域”名称相同,但采用大写形式。

mod_auth_kerb(一个足够新的版本)具有一个名为 KrbLocalUserMapping 的功能。这会调用 Kerberos 库函数 krb5_aname_to_localname() 将主体名称转换为“本地名称”,即本地主机上有意义的名称。此函数的作用取决于 Kerberos 实现。在 MIT Kerberos 中,您可以使用 krb5.conf 中的“auth_to_local”规则自定义映射。默认规则只是将 foo@[default realm] -> foo 进行转换,这在简单情况下就足够了,在这种情况下,只有一个领域,并且您的用户名与您的 Kerberos 主体名称相同。但是,您可能需要更复杂的规则。例如,我们有一个惯例,即 Windows 管理员除了他们的“用户”帐户外,还拥有一个具有域管理员权限的“用户管理员”帐户。当登录到他们的“管理员”帐户时,他们在访问在 Unix 上运行的经过身份验证的 Web 服务时会被拒绝,因为无法识别“用户管理员”。我们只是添加了一个映射,以便 user-admin@REALM 可以像 user@REALM 一样映射到“user”,并且这个问题立即被透明地修复,适用于所有 Web 应用程序。这样做的另一个好处是,它适用于使用 krb5_aname_to_localname() 的任何 Kerberized 服务,而不是使用仅适用于 Apache 的 mod_map_user 来执行此操作。

有人建议将所有 user@REALM 名称一律映射到“user”,而不管领域如何(建议的 mod_map_user 解决方案就是这样做的)。请注意,这是一个潜在的安全问题:如果您有多个通过跨领域信任连接的 Kerberos 领域,那么领域部分就会变得有意义;它是用户标识的一部分。如果您只是将其剥离,这意味着另一个领域的管理员只需创建一个具有相同名称的帐户即可在 Apache 中模拟本地用户。

答案2

我最近在本地网络环境中成功实现了类似的东西https://github.com/Legrandin/PyAuthenNTLM2以及 Web 浏览器提供的 ntlmv2 标头。

它使用 mod_python,而不是将 samba 作为附加包安装。

希望这可以帮助

答案3

以前有一个名为 mod_map_user 的 Apache 模块用于此目的。在您的 Apache 配置中,您可以这样写:

MapUsernameRule (.*)@(.*) "$1"

但是:根据这篇文章,mod_auth_kerb(如果您正在使用)现在可以为您执行此操作:Apache mod_auth_kerb 和 LDAP 用户组

相关内容