适用于多个 Windows 域的 Linux SSO

适用于多个 Windows 域的 Linux SSO

我已成功在 apache 上为与 apache 服务器位于同一 AD 域中的 Windows 用户实现了 SSO:AD 域 = example.com Linux 服务器 = linux.example.com KDC = ad.example.com

我在 httpd.conf 中将 KrbLocalUserMapping 设置为 ON,因为用户登录的应用程序需要删除用户名的 @example.com 部分。

现在我想让分支机构的用户也能登录应用程序,但他们来自不同的域 = branch.example.com。这两个域之间存在信任关系。

当来自 branch.example.com 的用户尝试登录时,他们会收到“内部服务器错误”,并且 apache 错误日志显示“Krb5_aname_to_localname() 未找到主体映射[电子邮件保护]

我的猜测是,来自子域 branch.example.com 的用户的用户名的域部分没有被剥离。

我需要更改什么以及在哪里更改(可能是 krb5.conf?)。我是否需要为分支子域生成单独的密钥表?

另外,由于它是一台我无法任意重启的生产服务器,在 krb5.conf 中更改内容后我需要重启哪些服务?

答案1

我刚刚遇到了和你一样的问题,感谢此主题在这里,我找到了答案!

在我的设置中打开第二个(受信任的)领域mod_auth_kerb,并在密钥表中添加正确的内容后,如果我尝试使用第二个域中的用户登录,则会在 httpd 日志中收到如下错误:

[auth_kerb:notice] [pid 1234] [client X.X.X.X:12345] krb5_aname_to_localname() found no mapping for principal [email protected]

好消息是,我已经解决了!详情如下....


首先,在您的 Apache HTTPD 配置中,您需要类似这样的内容:

# Use this one for both Examples and Branches together
KrbAuthRealms EXAMPLE.COM BRANCHES.EXAMPLE.COM

# Strip the realm from the username
KrbLocalUserMapping On

这告诉mod_auth_kerb您接受来自主域领域或分支领域的用户,并从用户名中剥离领域。这意味着[email protected]转到管理员,而[email protected]转到guest

接下来,假设使用 MIT kerberos,您需要编辑文件/etc/krb5.conf,并告诉它如何将主体映射到用户名。由于各种历史原因,这并非libdefaults如您所期望的那样在部分中完成。它也不是在每个领域部分中完成的,这让我很困惑。相反,它是使用默认领域部分auth_to_local中的条目完成的。[realm]

默认情况下,krb5_aname_to_localname()libkrb5 函数会从默认领域中删除该领域,否则将其保留在那里。因此,我们必须添加一个条目来告诉它也从分支领域中删除该领域。(也可能有更复杂的规则,krb5.conf有关更多信息,请参阅手册页)

因此,我们希望我们的配置是这样的:

[libdefaults]
  default_realm = EXAMPLE.COM

[realms]
   EXAMPLE.COM = {
     kdc = dc.example.com
     admin_server = dc.example.com
     auth_to_local = RULE:[1:$1@$0](^.*@BRANCHES\.EXAMPLE\.COM)s/@.*//
     auth_to_local = DEFAULT
   }
   BRANCHES.EXAMPLE.COM = {
     kdc = dc.branches.example.com
     admin_server = dc.branches.example.com
   }

请注意,BRANCHES.EXAMPLE.COM映射规则不存在于其领域中,而是存在于主EXAMPLE.COM领域(即默认领域)中。


另外,由于它是一台我无法任意重启的生产服务器,在 krb5.conf 中更改内容后我需要重启哪些服务?

更改后只需重新启动 Apache HTTPD 服务

答案2

只需添加@Gragravarr 的答案(效果很好,非常感谢!),如果你的KrbServiceName PROTOCOL/domain.of.your.serviceapache 配置中有一个指令,则需要将其替换为KrbServiceName Any(否则你会收到错误,因为 Kerb/Apache 会根据每个领域检查你的 ServiceName……)

相关内容