我pipe理的应用程序使用有效的AD用户进行单点login,并在当前的IIS上运行。 为了提高性能,我有一个任务将Web层迁移到Linux上的Apache / Php。
我在CentOS上有Win2012 Server和Apache的AD。 我已经成功join了域名(TEST.COM),并可以通过windows用户帐户login到centos。
我还configuration了Kerberos和Samba以及SSO,但有一个问题。
来自AD的用户将被导入到没有域名前缀/后缀的应用程序中。 因此,如果我的用户是AD中的TEST \ myUser,那么在应用程序中,用户只是myUser。
应用程序从REMOTE_USERvariables中读取用户名,但是用户名附加了@DOMAINstring,导致完整的用户名为[email protected]。 当然,应用程序认为它不是一个有效的用户,因为它期望它只是myUSer。 如果我在名为[email protected]的应用程序中添加新用户,则SSO可以正常工作。
有没有办法放弃REMOTE_USERvariables中的@DOMAIN属性? 你会怎么做,哪些文件需要configuration?
mod_auth_kerb是特定于Kerberos的:它通过HTTP Negotiate实现Kerberos身份validation。 在REMOTE_USER环境variables中,它会报告已validation客户端的Kerberos标识(“主体名称”)。 Kerberos主体名称写成foo / bar / baz /…@REALM; 主要组件被称为“实例”(最常见的只有一个或两个),“领域”是Kerberos系统内部的一个信任域,一个内置的联合机制。 在AD中,Kerberos领域与AD“域名”相同,大写。
mod_auth_kerb(一个足够新的版本)有一个叫做KrbLocalUserMapping的特性。 这将调用Kerberos库函数krb5_aname_to_localname()将主体名称转换为“本地名称” 那就是在本地主机上有意义的东西。 这个函数的function取决于Kerberos的实现。 在MIT Kerberos中,您可以使用krb5.conf中的“auth_to_local”规则自定义映射。 默认规则只是转换foo @ [default realm] – > foo,在简单的情况下,只有一个领域和用户名与Kerberos主体名称相同。 但是,您可能需要更复杂的规则。 例如,我们有一个约定,Windowspipe理员除了拥有“用户”帐户之外,还拥有一个具有域pipe理员权限的“用户pipe理员”帐户。 当login到他们的“pipe理员”帐户时,他们将被拒绝,当validation在Unix上运行的Web服务,因为“用户pipe理”无法识别。 我们只是添加了一个映射,以便像user @ REALM那样将user-admin @ REALM映射到“user”,并立即为所有Web应用程序修复。 这样做的另一个好处是,它适用于使用krb5_aname_to_localname()的任何kerberized服务,而不是使用只适用于Apache的mod_map_user。
有些人build议只要将所有user @ REALM名称映射到“user”,而不考虑域(这就是build议的mod_map_user解决scheme所要做的)。 请注意,这是一个潜在的安全问题:如果您有多个Kerberos领域通过跨领域信任连接,则领域部分变得有意义; 它是用户标识的一部分。 如果你把它剥离,这意味着另一个领域的pipe理员可以通过创build一个具有相同名字的帐户来模仿本地用户到Apache。
我最近使用https://github.com/Legrandin/PyAuthenNTLM2和web浏览器提供的ntlmv2头文件在本地networking环境中成功实现了类似的function。
它使用mod_python而不是将samba作为附加包安装。
希望这可以帮助
过去有一个名为mod_map_user的Apache模块。 在你的Apacheconfiguration你会说:
MapUsernameRule (.*)@(.*) "$1"
但是:根据这篇文章,mod_auth_kerb(如果这是你正在使用的)现在为你做这个: Apache mod_auth_kerb和LDAP用户组