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


21

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

 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

这可行,但是我必须将所有要认证的用户放入MySpecificGroup。但是,在LDAP服务器上,我已配置为MySpecificGroup也包含MyOtherGroup带有另一个用户列表的组。

但是其中的那些用户MyOtherGroup未通过身份验证,我必须将它们全部手动添加到它们,MySpecificGroup并且基本上不能使用嵌套分组。我正在使用Windows SBS 2003。

有没有一种方法可以配置Apache LDAP?还是存在无限递归从而不允许的问题?

Answers:


19

您需要进行设置AuthLDAPSubGroupDepth以使其工作。您在此处提供的整数指定在中断用户搜索之前将评估的最大子组嵌套深度。

将此添加到您的配置:

AuthLDAPSubGroupDepth 1

更多信息:这里这里


我运行的Apache 2.2,它的mod_authnz_ldap模块还没有AuthLDAPSubGroupDepth指令:httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html
Selivanov帕维尔·

那么,为什么不更新呢?
Bart De Vos

2
我正在运行Debian Squeeze,我更喜欢使用来自稳定发行版的软件包:经过严格测试的定期安全更新。Apache 2.3仍是beta版,它将很快以稳定或稳定反向的形式出现。我现在已经解决了这个问题AuthnProviderAlias。如果没有人将提供针对Apache 2.2的解决方案,那么赏金由您承担:)
Selivanov Pavel

考虑到组位于不同服务器上的新信息,我认为这种方法仍然行不通。
Jeff Strunk

3
AuthLDAPSubGroupDepth在Apache HTTPd 2.4中不存在。AuthLDAPMaxSubGroupDepth是要使用的正确指令。
克里斯·哈里斯

33

此外AuthLDAPSubGroupDepth,仅在Apache 2.4中可用,使用Microsoft AD LDAP时,可以通过使用LDAP_MATCHING_RULE_IN_CHAIN匹配规则使用嵌套组进行授权。这比在客户端上搜索子组要快得多,因为它是在DC服务器上通过网络进行较少查询的操作。

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

该字符串1.2.840.113556.1.4.1941是一个名为的OIDLDAP_MATCHING_RULE_IN_CHAIN。此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的过滤器。这是一个特殊的“扩展”匹配运算符,它将对象中的祖先链一直走到根,直到找到匹配项。

也可以看看:


如果可以的话,我会推荐这个10倍。对于运行RHEL 5的人们来说,这是一个很好的解决方案。编译供应商资源以获得最新功能并不总是理想的解决方案!
亚伦·科普利2012年

我很高兴它有所帮助。我认为这是apache中LDAP_MATCHING_RULE_IN_CHAIN的第一个记录的用法。
Mircea Vutcovici 2012年

有没有一种方法可用于LDAP_MATCHING_RULE_IN_CHAIN检索递归组成员身份并将其作为标头传递给后端服务器(使用Apache作为反向代理)?
Gershon Papi

mod_authnz_ldap没有提供这个。但是,您可以LDAP_MATCHING_RULE_IN_CHAIN在应用程序中使用LDAP过滤器。请参阅:stackoverflow.com/a/34075052/290087
Mircea Vutcovici

6

看起来在Apache 2.2中,您唯一的选择是列出您的主要授权组所包括的每个组。

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 来代理身份验证。

/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

这需要进行一些按摩才能使其正常工作,但是我认为这是普遍的想法。


1
不幸的是,当组位于不同的AD域中(Domain1_DomainLocal_Group包括Domain2_Global_Group)时,这将不起作用。这是我尝试的第一件事:)
Selivanov Pavel

这是否意味着这些组之一在另一台服务器上?如果是这样,我怀疑AuthLDAPSubGroupDepth也不适合您。
杰夫·斯特伦克

是的,两个服务器,两个域。我考虑过将Linux box集成到AD中并使用PAM身份验证,但是不支持mod-auth-pam,因为apache 2.0,mod-authnz-external + pwauth不支持组。这一切都是可悲的:(
Selivanov Pavel

1
哦,我还没有注意到您更新了答案。使用OpenLDAP slapd_meta可能是解决方案,但它扼杀了此配置的要点:通过在组中添加/删除用户并互相包括组来在单个点(Active Directory)中管理用户权限。这是我在没有附加OpenLDAP服务的情况下使用AuthnProviderAlias的模拟解决方案:<AuthnProviderAlias ldap first-ldap> AuthLDAPURL ... </ AuthnProviderAlias> <AuthnProviderAlias ldap second-ldap> AuthLDAPURL ... </ AuthnProviderAlias> ... AuthBasicProvider first-ldap第二-ldap
Pavel

1
我决定赏金给Bart De Vos:这不是我的问题;对于原始问题(没有我自己的特定问题),他的解决方案很简单并且会起作用
Selivanov Pavel

4

@Mircea_Vutcovici提供的解决方案为我工作时,我唯一的批评是,人们看到使用按位运算符时,可能会变得拥挤。

例如,我将把Apache Bloodhound安装交给一组开发人员,该安装使用Apache HTTPd作为AD组auth的前端。他们将遇到按位运算符的问题。管理员当然不会那么胆怯……我希望。

就是说,我有一个不使用按位运算符并且不使用多个ldap-group定义的解决方案。

以下配置适用于我:

<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>

关键部分是以下配置:

AuthLDAPSubGroupClass group

AuthLDAPMaxSubGroupDepth不能单独使用,也不能与AuthLDAPSubgroupAttribute一起使用。只有当我使用AuthLDAPSubGroupClass时,对子组的身份验证才开始起作用……至少对于我自己和我的情况而言。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.