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

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

我已经使用以下设置进行 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 来执行此操作?还是存在可能无限递归的问题,因此不允许?

答案1

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

将其添加到您的配置中:

AuthLDAPSubGroupDepth 1

更多信息:这里这里

答案2

此外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对象标识符称为LDAP_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)

来自微软文档:

此规则仅限于适用于 DN 的过滤器。这是一个特殊的“扩展”匹配运算符,它会沿着对象中的祖先链一直走到根,直到找到匹配项。

也可以看看:

答案3

看起来您在 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 服务器)

您可以使用slapd_meta在您的网络服务器上运行的覆盖来代理您的身份验证。

/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

这需要一些按摩才能使其起作用,但我认为这是总体思路。

答案4

虽然@Mircea_Vutcovici 提供的解决方案对我来说很有用,但我唯一的批评是,当人们看到使用按位运算符时可能会感到不安。

例如,我将把一个 Apache Bloodhound 安装(使用 Apache HTTPd 作为具有 AD 组身份验证的前端)移交给一组开发人员。他们将在掌握位运算符方面遇到问题。当然,管理员不会那么拘谨……我希望如此。

话虽如此,我有一个不使用按位运算符并且不使用多个 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 时,针对子组的身份验证才开始起作用……至少对我和我的情况而言是这样。

相关内容