我确信你们中的一些人也遇到过同样的问题。我希望有人能给出比我现在更好的答案。
因此,您在 LDAP 目录中有一些用户,有一天您说“嘿!我可以针对这个东西进行 SSH 身份验证!”这很好。
然后有一天你意识到你只希望某些用户能够进入机器。比如说,开发人员只能进入开发机,而不能进入生产机。你四处搜索,找到pam_groupdn
你的 LDAP 配置 () 中的内容,/etc/ldap.conf
如下所示:
pam_groupdn CN=developers,OU=groups,DC=yourcompany
再次强调,这很好。您可以为产品部门再设立一个小组,为 QA 部门再设立一个小组,等等。也许有一天您会有第二个产品开发部门,这样他们就有了自己的小组。随便吧。
然后有一天,您有了一个需要开发人员和 QA 都能够登录的服务器。呃……事实证明,这pam_groupdn
不需要多个值。您会怎么做?好吧,如果您没有多想,您会说“哦,我只需要创建一个开发人员和 QA 组!”。
pam_groupdn CN=developers-and-QA,OU=groups,DC=yourcompany
这……不太好,不过还可以,对吧?
然后有一天你又来了一位开发人员,你意识到你需要将他们添加到 15 个组中,因为有developers-and-QA
、product1-and-product2
等等developers-who-have-access-to-prod
。糟糕。
一定有更好的方法来实现这一点,对吧?我给 的开发人员发了电子邮件pam_ldap
,他们说很遗憾,没有办法让pam_groupdn
接受多个值(除非修改代码)。
有人想分享他们如何管理 LDAP 中的组群而不诉诸复制/粘贴吗?
答案1
如果您使用的是 NSS,则可以AllowGroups
在 中设置参数/etc/ssh/sshd_config
。如果没有,您应该查看动态列表:
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))
类似的东西。您还需要包括架构和覆盖等...所以这是一个开始。
答案2
一个可行的解决方案是应用pam_filter
而pam_groupdn
不是/etc/ldap.conf
:
# Filter to AND with uid=%s
pam_filter |(member=CN=developers,OU=groups,DC=yourcompany)(member=CN=QA,OU=groups,DC=yourcompany)
“Filter to AND with uid=%s” 表示发送到 LDAP 服务器的过滤器将如下所示:&(uid=<your username>)(<your pam_filter>)
用户必须是developers
或的成员QA
。如果他不是其中一个组的成员,LDAP 服务器的响应中会出现错误消息,并且密码甚至不会发送到 LDAP 服务器。
适用于我的 RHEL 5.8 环境。
对于不同的过滤器变化,请在 Google 上搜索“ldap 过滤器语法”...
答案3
我在这里的解决方案非常丑陋,但比你上面描述的稍微不那么丑陋:我指定的组pam_groupdn
是“机器类”组,例如cn=database,ou=NY,dc=mydomain,dc=com
这些组限定了谁应该有权访问特定站点上的特定类别的系统(在上面的例子中database
为中的服务器NY
)。
这实际上只是因为在我的环境中授予用户访问特定类别中的一台机器的权限几乎毫无意义(因为它们实际上都是相同的),所以如果我允许某人登录,那么db01
没有理由不允许他们登录db02
。(“站点”资格源于这样的逻辑:我可能会雇用某人来管理加利福尼亚,但我可能不希望他们登录纽约的机器。)
这种设计确实涉及组中的一些重复,这使得全局撤销访问权限更加困难(例如,我的帐户列在每个站点的每个组中:要锁定我的用户,您必须编辑每个组并撤销我的会员资格),但它为组提供了一个逻辑/可管理的结构,只有在添加新站点/机器类时,该结构才会增长。
答案4
如果您使用的是 RHEL6+,conf 文件位于/etc/pam_ldap.conf
而不是/etc/openldap/ldap.conf
。如果您将pam_groupdn
条目放入其中,它将按设计工作。最好的方法是将您的复制ldap.conf
到pam_ldap.conf
或创建符号链接。