不带 @DOMAIN 后缀的 REMOTE_USER 变量

Neb*_*vic 2 linux active-directory single-sign-on

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

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

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

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

应用程序从 REMOTE_USER 变量中读取用户名,但用户名附加了 @DOMAIN 字符串,导致完整的用户名是 myUser@TEST.COM。应用程序自然会认为它不是有效用户,因为它希望它只是 myUSer。如果我在名为 myUser@TEST.COM 的应用程序中添加一个新用户,则 SSO 可以正常工作。

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

Ric*_*man 5

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@[defaultrealm] -> foo,这在只有一个领域且您的用户名与 Kerberos 主体名称相同的简单情况下就足够了。但是,您可能需要更复杂的规则。例如,我们有一个约定,即 Windows 管理员除了“用户”帐户之外,还拥有一个具有域管理员权限的“用户管理”帐户。当登录到他们的“admin”帐户时,他们在访问在 Unix 上运行的经过身份验证的 Web 服务时会被拒绝,因为“user-admin”无法识别。我们刚刚添加了一个映射,以便 user-admin@REALM 映射到“user”,就像 user@REALM 一样,并且立即针对所有 Web 应用程序透明地修复了此问题。这样做的另一个好处是它适用于任何使用 krb5_aname_to_localname() 的 Kerberized 服务,而不是使用仅适用于 Apache 的 mod_map_user 。

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