pipe理没有pam_groupdn的机器的LDAPlogin:允许多个组

我相信你们中的一些人已经处理了同样的问题。 我希望有人比我现在做的有更好的答案。

所以,你在LDAP目录中有一些用户,有一天你会说:“嗨!我可以通过SSHvalidation这个东西!” 这很好。

然后有一天,你意识到你只想要某些用户能够进入一台机器。 比方说,开发者应该只能进入开发箱,而不是产品。 你做一些search,find你的LDAPconfiguration( /etc/ldap.conf )中的pam_groupdn ,如下所示:

 pam_groupdn CN=developers,OU=groups,DC=yourcompany 

而且,这又是好事。 你制造另一组产品,另一组作为质量保证等。也许有一天,你有第二个产品开发组,所以他们得到自己的组。 随你。

然后有一天,你有一个服务器,开发人员和QA都需要能够login。 呃…事实certificate, pam_groupdn不会取多个值。 你是做什么? 那么,如果你没有多想,你会说:“哦,我只是做一个开发者和QA团队!”。

 pam_groupdn CN=developers-and-QA,OU=groups,DC=yourcompany 

这是…不好,但没关系,对吧?

那么有一天,你会得到另一个开发人员,你意识到你需要把他们添加到15个组,因为有developers-and-QAproduct1-and-product2developers-who-have-access-to-prod等等。 废话。

有一个更好的方法来做到这一点,对吧? 我发邮件给pam_ldap的开发者,他们说,不幸的是,没有办法让pam_groupdn取得多个值(而不需要在代码中pam_groupdn )。

任何人都希望分享他们如何pipe理LDAP中的组,而不诉诸复制/粘贴?

如果您使用的是NSS,则可以在/etc/ssh/sshd_config设置AllowGroups参数。 如果没有,你应该看看dynamic列表 :

 dn: cn=devandqa,ou=groups,dc=company,dc=com cn: devandqa objectClass: groupOfNames labeledURI: ldap:///ou=groups,dc=company,dc=com?memberUid?one?(|(cn=developers)(cn=qa)) 

就是这样 你还需要包括架构,并包括覆盖等….所以这是一个开始。

一个pam_filter解决scheme是在/etc/ldap.conf应用pam_filter而不是pam_groupdn

 # Filter to AND with uid=%s pam_filter |(member=CN=developers,OU=groups,DC=yourcompany)(member=CN=QA,OU=groups,DC=yourcompany) 

“过滤到与uid =%s”意味着发送到LDAP服务器的filter将如下所示: &(uid=<your username>)(<your pam_filter>)

用户必须是developersQA成员。 如果他不是其中一个组的成员,则来自LDAP服务器的响应中会有一条错误消息,并且密码甚至不会被发送到LDAP服务器。

适用于我的RHEL 5.8环境。

对于不同的filter变体,请检查谷歌的“ldapfilter语法”…

我的解决scheme相当丑陋,但比上面描述的稍微难看一点:我在pam_groupdn指定的组是一个“机器类”组,例如cn=database,ou=NY,dc=mydomain,dc=com

这些小组限定谁应该访问某个特定站点上的特定系统类(在上面的例子中是NY database服务器)。

这仅仅是因为在我的环境中授予用户访问特定类中的一台机器的事实是非常没有意义的(因为它们都是完全相同的),所以如果我让某人login到db01那么就没有原因他们不应该也被允许login到db02 。 (“网站”资格是由我可能聘请某人pipe理加州的逻辑产生的,但我可能不希望他们login纽约州的机器。)

这种devise确实涉及到一些重复的组织,这使全球撤销访问变得更加困难(例如,我的账户被列在每个站点的每个组中:要locking我的用户,你将不得不编辑每个组并撤销我的成员资格)这些组是一个逻辑/可pipe理的结构,只有当新的站点/机器类被添加时才会增长。

假设你有一些像puppet这样的configurationpipe理系统,你可以通过使用pam_listfile来devise一个基于PAM的解决scheme(所以它比sshd_config中的AllowGroups更普遍)。 让puppet为每个服务器/服务器组pipe理类似/etc/allowed_groups的内容并添加到您的PAMconfiguration中:

 required pam_listfile.so onerr=fail item=group sense=allow file=/etc/allowed_groups 

就像SSH解决scheme一样,它假设你有LDAP连接到NSS。

如果您使用的是RHEL6 +,conf文件位于/etc/pam_ldap.conf而不是/etc/openldap/ldap.conf 。 如果您将pam_groupdn条目放在那里,那么它将按照devise工作。 最好的方法是将你的ldap.conf复制到pam_ldap.conf或创build一个符号链接。