如何从 LDAP 目录确定 Kerberos 领域?

如何从 LDAP 目录确定 Kerberos 领域?

我有两个可以进行身份​​验证的 Kerberos 领域。其中一个我可以控制,另一个从我的角度来看是外部的。我在 LDAP 中还有一个内部用户数据库。假设领域是 INTERNAL.COM 和 EXTERNAL.COM。在 ldap 中我有这样的用户条目:

1054 uid=testuser,ou=People,dc=tml,dc=hut,dc=fi
shadowFlag: 0
shadowMin: -1
loginShell: /bin/bash
shadowInactive: -1
displayName: User Test
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uidNumber: 1059
shadowWarning: 14
uid: testuser
shadowMax: 99999
gidNumber: 1024
gecos: User Test
sn: Test
homeDirectory: /home/testuser
mail: [email protected]
givenName: User
shadowLastChange: 15504
shadowExpire: 15522
cn: User.Test
userPassword: {SASL}[email protected]

无论如何,我想要做的是指定每个用户使用哪个身份验证服务器/领域对用户进行身份验证。配置 kerberos 来处理多个领域很容易。

但是,如何配置其他实例(如 PAM)来处理某些用户来自 INTERNAL.COM 而某些用户来自 EXTERNAL.COM 的情况?需要进行某种 LDAP 查找,从中获取领域和身份验证名称,然后进行实际身份验证。

是否有标准化的方法将此信息添加到 LDAP 或查找它?对于多领域用户群,还有其他解决方法吗?我也可以接受单领域解决方案,只要我可以为用户单独指定用户名 - 领域组合即可。

答案1

我认为最好的方法是使用sssd。这为您提供了最大的灵活性,因为 sssd 支持它所称的域。请注意,较新的发行版已使用 sssd。这是一个梦想成真,没有理由使用 libpam_krb5.so 和 libpam_ldap.so 或其中任何一个。

最简单的方法是使用 ldap 过滤器来选择您需要进入的 tgts 领域,如下所示:

首先创建两个包含外部和内部领域的成员的安全组,以便能够获得正确的 kdc。

设置 sssd 并检查其文档,此代码片段是如何设置两个域的草图。

[domain/internal.com]
access_provider = ldap
id_provider = ldap
ldap_access_filter = memberOf=cn=allowedusersinternal,ou=Groups,dc=internal,dc=com
auth_provider = krb5 

[domain/external.com]
access_provider = ldap
ldap_access_filter = memberOf=cn=allowedusersexternal,ou=Groups,dc=internal,dc=com
id_provider = ldap
auth_provider = krb5

然后根据需要为两个领域配置 kerberos(但您已经这样做了)。

答案2

您正在寻找的设置位于 /etc/krb5.conf 中,您可以在此将多个领域存储在 [realms] 标签下,每个领域都指向自己的 LDAP 服务器。

[realms]
       INTERNAL.COM = {
               kdc = some.server.internal.com:88
               admin_server = some.server.internal.com:749
               default_domain = internal.com
       }
       EXTERNAL.COM = {
               kdc = some.server.external.com:88
               admin_server = some.server.external.com:749
               default_domain = external.com
       }  

答案3

pam_ldap
对于 ssh 密码/质询响应 LDAP 示例条目已经足够。
修改 中的相应文件/etc/pam.d以使用该pam_ldap库。
设置SASL 直通身份验证在您的 OpenLDAP 服务器上。RHEL
(CentOS): nss_ldap
Debian: libpam-ldap
Ubuntu:ldap-auth-client

krb5配置文件
auth_to_local应该适用于基于 GSSAPI 的身份验证。

[realms]
$LOCALREALM = {
auth_to_local = RULE:[1:$1]
auth_to_local = DEFAULT
}
这可能太宽松了。

!pam_krb5 alt_auth_map不应该像man之前页面中引用的那样工作OpenSSH will reject usernames that don't match local accounts

答案4

Windows 针对不同域进行身份验证的方式是除了登录名之外还指定域。那么,您是否可以做类似的事情并让人们以以下身份登录[电子邮件保护]或者[电子邮件保护]? 如果您只使用“user3”,您就可以登录到默认域。

根据 pam_krb5(5), 这是可能的:

如果提供给 PAM 的用户名包含“@”,并且 Kerberos 可以将用户名视为主体,将其映射到本地帐户名,则 pam_authenticate() 会将 PAM 用户更改为该本地帐户名。这允许用户使用其 Kerberos 主体登录,并让 Kerberos 映射到帐户。

不幸的是,它继续说道:

但请注意,此功能不能与 OpenSSH 一起使用。在完成重新映射之前,OpenSSH 将拒绝与本地帐户不匹配的用户名,并将无效密码传递给 PAM 模块。还请注意,其他几个常见的 PAM 模块(如 pam_securetty)需要能够使用 getpwnam() 查找用户,如果使用此功能,则不能在 pam_krb5 之前调用。

相关内容