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

我有两个Kerberos领域,我可以进行身份​​validation。 其中一个是我可以控制的,另外一个是我的观点。 我在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] 

我想在某种程度上做的是指定每个用户的基础上authentication服务器/领域的用户进行身份validation。 configurationKerberos来处理多个领域很容易。

但是,如何configuration其他实例,如PAM,来处理一些用户来自INTERNAL.COM和一些来自EXTERNAL.COM的事实? 需要进行某种types的LDAP查找,其中领域和身份validation名称是从中获取的,然后是实际身份validation。

有没有一种标准的方式来将这些信息添加到LDAP,或查找? 是否有一些多领域用户群的其他解决方法? 我也可以使用单一领域解决scheme,只要我可以分别为用户指定用户名 – 领域组合。

我认为最好的方法是使用sssd 。 由于sssd支持它所谓的域名,这给了你最大的灵活性。 请注意,较新的Distros已经使用sssd。 这是一个梦想成真,没有任何借口使用libpam_krb5.so和libpam_ldap.so或任何这些。

最简单的方法是使用ldapfilter来select你需要去哪个领域,像这样:

首先创build两个包含外部和内部领域成员的安全组,以便能够获得正确的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 

然后根据需要configuration你的Kerberos为这两个领域(但你已经得到了)。

您正在查找的设置位于/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 } 

pam_ldap的
对于ssh密码/质询 – 响应LDAP示例条目已经足够了。
修改/etc/pam.d相应文件以使用pam_ldap库。
在您的OpenLDAP服务器上安装SASL通行authentication 。
RHEL(CentOS): nss_ldap
Debian: libpam-ldap
Ubuntu: ldap-auth-client

的krb5.conf
auth_to_local应该适用于基于GSSAPI的身份validation。

[领域]
$ 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

对不同域进行身份validation的Windows方法是除了login名之外还指定域。 那么,是否可以接受类似的做法,让用户login为[email protected][email protected]? 如果你只是使用“user3”,你可以login到默认域。

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

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

不幸的是,它继续:

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