我正在研究一些 ldap 身份验证,我需要做的一件事是要求用户属于特定组。为了最好地复制该功能,我可以使用此查询
ldapsearch -x -H "ldap://ldap.server.edu:389" -P 3 -LLL -b "dc=something,dc=something" "(&(|(objectclass=inetOrgPerson)(objectclass=person)(objectclass=umichPerson))(uid=theuid)(memberOf=cn=groupname,ou=User Groups,ou=Groupsdc=something,dc=something))"
我删除了一些标识部分。让我困惑的是,我是 LDAP 新手,但从搜索来看,“memberof”部分听起来应该可以正常工作。
如果我运行此查询,我就能毫无问题地拉出该组
ldapsearch -x -H "ldap://ldap.server.edu:389" -P 3 -LLL -b "cn=groupname,ou=User Groups,ou=Groupsdc=something,dc=something"
回到最初的问题,代码似乎搜索基本 DN,然后使用过滤器。绑定发生在用户凭据上,所以我知道他们是组织的用户,但我无法正确使用过滤器来确认他们是应该被允许访问的用户。如果 member/memberof/ismemberof 不起作用,还有其他方法可以使用此过滤器吗?或者是否有人可以建议另一个可能获得相同结果的过滤器?
我已经联系了我的 IT 团队,但已经一周没有收到任何回复,所以我想我要自己解决这个问题了。
答案1
我是 LDAP 的新手,但通过搜索,“memberof”部分听起来好像应该可以工作。
是的,但是这确实需要:
- LDAP 目录实际上会填充
memberOf
属性。LDAP
服务器需要一定的额外开销和复杂性,以确保某个地方的组成员更改也会触发其他位置memberOf
添加/删除的成员属性的相互更新。
例如,在 OpenLDAP 中,需要激活单独的覆盖(请参阅§12.8. 反向组成员身份维护手册)。
解构你的 LDAP 过滤器:
"(
& # Logical AND : match all requirements
( # Requirement 1
| # Logical OR match 1 or more
(objectclass=inetOrgPerson)
(objectclass=person)
(objectclass=umichPerson)
)
( # Requirement 2
uid=theuid
)
( # Requirement 3
memberOf=cn=groupname,ou=User Groups,ou=Groups,dc=example,dc=edu
)
)"
我将从一个更有限的过滤器开始,仅测试要求 2,以查看是否:
- 你确实找到了一个用户
- 该用户具有
memberOf
属性
即进行简单的搜索,例如
ldapsearch -x -H "ldap://ldap.example.edu:389" -P 3 -LLL -b "dc=example,dc=edu" "(uid=theuid)" memberOf
并确认它返回一些有用的信息,例如:
dn: uid=theuid,ou=People,dc=example,dc=edu
memberOf: cn=groupname,ou=User Groups,ou=Groups,dc=example,dc=edu
然后通过在过滤器中添加更多条件和要求进行测试。
您的“要求 1”(|(objectclass=inetOrgPerson)(objectclass=person)(objectclass=umichPerson))
似乎是一个测试,以确保只有人员才允许进行身份验证。根据您的搜索基础和 LDAP 目录布局,这可能是或不是必要的步骤,例如,防止服务帐户进行身份验证。
如果该memberOf
属性不可用,您可以使用不同的方法:
使用如下过滤器检查用户是否属于 该组
member
或该组的属性:uniqueMember
(&(objectclass=groupOfNames)(member=uid=theuid,ou=People,dc=example,dc=edu))
请注意,当使用嵌套组时,这将不起作用。
ldapsearch -x -H "ldap://ldap.example.edu:389" -P 3 -LLL -b "cn=groupname,ou=User Groups,ou=Groups,dc=example,dc=edu" "(&(objectclass=groupOfNames)(member=uid=theuid,ou=People,dc=example,dc=edu))"