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

mar*_*ark 21 ldap groups apache-2.2

我已经使用以下设置进行 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
Run Code Online (Sandbox Code Playgroud)

这有效,但是我必须将所有要进行身份验证的用户放入MySpecificGroup. 但是在我配置的 LDAP 服务器上,MySpecificGroup它还包含MyOtherGroup具有另一个用户列表的组。

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

有没有办法配置 Apache LDAP 来做到这一点?或者是否存在可能无限递归的问题,因此不允许?

Mir*_*ici 36

此外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
Run Code Online (Sandbox Code Playgroud)

该字符串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)

来自微软文档:

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

也可以看看:


Bar*_*Vos 20

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

将此添加到您的配置中:

AuthLDAPSubGroupDepth 1
Run Code Online (Sandbox Code Playgroud)

更多信息:这里这里

  • Apache HTTPd 2.4 中不存在 AuthLDAPSubGroupDepth。AuthLDAPMaxSubGroupDepth 是要使用的正确指令。 (3认同)
  • 我正在运行 Debian Squeeze,我更喜欢使用来自稳定发行版的软件包:经过良好测试的定期安全更新。Apache 2.3 仍然是测试版,它不会很快出现在稳定版或稳定版中。我现在已经通过使用 `AuthnProviderAlias` 解决了这个问题。如果没有人会为 Apache 2.2 提供解决方案,那么赏金就是你的:) (2认同)

Jef*_*unk 7

看起来您在 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
Run Code Online (Sandbox Code Playgroud)

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


跨 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"
Run Code Online (Sandbox Code Playgroud)

然后,您的 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
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*ris 5

虽然@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>
Run Code Online (Sandbox Code Playgroud)

关键部分是以下配置:

AuthLDAPSubGroupClass group
Run Code Online (Sandbox Code Playgroud)

AuthLDAPMaxSubGroupDepth 不能单独工作,也不能与 AuthLDAPSubgroupAttribute 结合使用。只有当我使用 AuthLDAPSubGroupClass 时,针对子组的身份验证才开始工作......至少对我和我的情况是这样。