我已经使用以下设置进行 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
答案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 时,针对子组的身份验证才开始起作用……至少对我和我的情况而言是这样。