核心是分清认证与授权阶段,并用RequireAll/RequireNone嵌套实现布尔逻辑:必须启用mod_ldap和mod_authnz_ldap,AuthLDAPURL需严格匹配baseDN、attribute、scope、filter,组比对须设AuthLDAPGroupAttribute member且开启AuthLDAPGroupAttributeIsDN on。
要在虚拟主机中用
实现复杂组权限控制,核心不是堆叠更多指令,而是理清“认证”和“授权”两个阶段的分工,并精准控制
块的嵌套逻辑。apache 本身不支持 ldap 层面的布尔表达式(如
、
),必须靠
和
组合实现。
确保模块已启用且依赖完整
Apache 默认不加载 LDAP 相关模块,缺一不可:
必须同时启用
(负责连接与缓存)和
(提供认证与授权接口)
Debian/Ubuntu:运行
,注意顺序——先
,再
CentOS/RHEL:确认
中两行已取消注释:
重启前务必执行
;若报
,说明系统缺少
(RHEL)或
(Debian)
AuthLDAPURL 必须严格匹配目录结构
这个 URL 是 LDAP 搜索语句,不是普通链接,格式固定为:
baseDN
必须是用户实际所在 OU,例如
,不能填根域
(性能差且易匹配失败)
attribute
要与登录名字段一致:AD 用
或
,OpenLDAP/FreeIPA 通常用
scope
推荐
(子树搜索),
只查一级,
只查节点自身
filter
不可省略,AD 常用
,OpenLDAP 推荐
组权限逻辑必须用 RequireAll/RequireNone 显式构造
默认是“或”语义,要实现“且”“非”,必须嵌套:
“属于 A 组
且
属于 B 组” → 外层
,内含两个
“属于 A 组
但不属于
B 组” →
“禁止 C 组所有成员” → 单独用
注意:
在 Apache 2.4.10+ 才完整支持;旧版本需升级或改用数据库映射方案
组成员比对必须启用 DN 级别匹配
LDAP 组成员关系靠
(或
)属性存储的是用户完整 DN,不是用户名字符串:
必须设置
(AD 常用)或
(FreeIPA/389DS)
必须开启
,否则 Apache 会把登录名当字符串去比对
值,永远失败
验证方法:用
,检查返回值是否包含目标用户的完整 DN,如
mod_authnz_ldaprequireandnotmod_ldapmod_authnz_ldapa2enmod ldap authnz_ldapldapauthnz_ldap/etc/httpd/conf.modules.d/LoadModule ldap_module modules/mod_ldap.soLoadModule authnz_ldap_module modules/mod_authnz_ldap.soapachectl -tCannot load mod_ldap.soopenldap-clientslibldap2-devprotocol://host:port/baseDN?attribute?scope?filterOU=Employees,DC=example,DC=comDC=example,DC=comsAMAccountNameuserPrincipalNameuidsubonebase(objectClass=user)(objectClass=inetOrgPerson)Require ldap-groupRequire ldap-groupRequireNonememberuniqueMemberAuthLDAPGroupAttribute memberuniqueMemberAuthLDAPGroupAttributeIsDN onmemberldapsearch -x -H ldaps://ldap.example.com -b "cn=admins,ou=groups,dc=example,dc=com" memberuid=john,ou=Users,dc=example,dc=com