如何在Apache LDAP中对嵌套组中的用户进行身份validation?

我正在使用以下设置进行LDAP身份validation

AuthName "whatever" AuthType Basic AuthBasicProvider ldap AuthLDAPUrl "ldap://server/OU=SBSUsers,OU=Users,OU=MyBusiness,DC=company,DC=local?sAMAccountName?sub?(objectClass=*)" Require ldap-group CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local 

这工作,但是我已经把我想要authentication到MySpecificGroup所有用户。 但是,在LDAP服务器上,我已经configuration了MySpecificGroup还包含MyOtherGroup和另一个用户列表。

MyOtherGroup中的用户没有通过身份validation,我必须手动将它们全部添加到MySpecificGroup ,基本上不能使用嵌套分组。 我正在使用Windows SBS 2003。

有没有办法configurationApache LDAP来做到这一点? 还是有可能无限recursion的问题,因此不允许?

    你需要设置AuthLDAPSubGroupDepth来完成这个工作。 您在此提供的整数指定在用户search停止之前将要评估的最大子组嵌套深度。

    添加到你的configuration:

     AuthLDAPSubGroupDepth 1 

    更多信息: 这里和这里 。

    除了AuthLDAPSubGroupDepth ,仅在apache 2.4中可用,使用Microsoft AD LDAP时,可以使用LDAP_MATCHING_RULE_IN_CHAIN匹配规则使用嵌套组进行授权。 这比在客户端上search子组要快得多,因为它是在DC服务器上完成的,并且在networking上查询的次数较less。

     Require ldap-filter memberof:1.2.840.113556.1.4.1941:=CN=Access to Apache,OU=My Organization Unit,DC=company,DC=com 

    string1.2.840.113556.1.4.1941是一个名为LDAP_MATCHING_RULE_IN_CHAIN的OID 。 这个OID由Microsoft分配用于其LDAP实现(Active Directory的一部分)。 您不能将其与其他LDAP服务器一起使用。 人的可赎回格式是: iso(1).member_body(2).us(840).microsoft(113556).ad(1).as_schema(4).LDAP_MATCHING_RULE_IN_CHAIN(1941)

    从Microsoft文档:

    此规则仅限于适用于DN的filter。 这是一个特殊的“扩展”匹配运算符,它将祖先的链条一直延伸到根,直到find匹配。

    也可以看看:

    看起来你在Apache 2.2中的唯一select是列出你的主授权组中包含的每个组。

     Require ldap-group CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local Require ldap-group CN=MyOtherGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local 

    如果你的嵌套组不太复杂,这应该是合理的。


    跨越AD域(使用两个LDAP服务器)

    您可以使用在您的Web服务器上运行的slapd_meta覆盖来设置OpenLDAP来代理您的身份validation。

    /etc/ldap/slapd.conf应该是这样的:

     database meta suffix "DC=company,DC=local" uri "ldap://a.foo.com/OU=MyBusiness,DC=company,DC=local" uri "ldap://b.foo.com/OU=otherdomainsuffix,DC=company,DC=local" 

    然后,你的mod_authnz_ldap节会看起来像这样:

     AuthName "whatever" AuthType Basic AuthBasicProvider ldap AuthLDAPUrl "ldapi:///DC=company,DC=local?sAMAccountName?sub?(objectClass=*)" Require ldap-group CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local Require ldap-group CN=MyOtherGroup,OU=Security Groups,OU=otherdomainsuffix,DC=company,DC=local 

    这将需要一些按摩,以使其工作,但我认为这是一般的想法。

    虽然@Mircea_Vutcovici提供的解决scheme为我工作,但我唯一的批评是,当人们看到按位运算符被使用时,人们可能会感到不可思议。

    例如,我将把一个Apache Bloodhound安装交给一组开发人员,它使用Apache HTTPd作为AD组auth的前端。 他们将会遇到一些问题,需要按位运算符来处理。 pipe理员当然不会那么愚蠢,我希望。

    这就是说,我有一个解决scheme,不使用按位运算符,并且不使用多个ldap组定义。

    以下configuration适用于我:

     <Location /protected> # Using this to bind AuthLDAPURL "ldap://<MY_SERVER>:3268/<MY_SEARCH_BASE>?sAMAccountName?sub?(objectClass=user)" AuthLDAPBindDN "<MY_BIND_DN>" AuthLDAPBindPassword "<MY_PASSWORD>" LDAPReferrals Off AuthType Basic AuthName "USE YOUR AD ACCOUNT" AuthBasicProvider ldap Require ldap-group <MY_PARENT_GROUP> AuthLDAPMaxSubGroupDepth 1 AuthLDAPSubgroupAttribute member AuthLDAPSubGroupClass group AuthLDAPGroupAttribute member AuthLDAPGroupAttributeIsDN on </Location> 

    关键部分是以下configuration:

     AuthLDAPSubGroupClass group 

    AuthLDAPMaxSubGroupDepth本身不起作用,也不与AuthLDAPSubgroupAttribute结合使用。 只有当我使用AuthLDAPSubGroupClass时,对子组的validation开始工作…至less对我和我的情况。