ldapsearch 如何查找具有特定组的特定用户?

ldapsearch 如何查找具有特定组的特定用户?

我正在研究一些 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,以查看是否:

  1. 你确实找到了一个用户
  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))"

相关内容