OpenLDAP升级至2.4版本后非管理员用户认证失败(Error 49)求助
解决OpenLDAP 2.4迁移后普通用户绑定失败(Error 49)的问题
这问题我之前帮不少人排查过,核心原因是缺少允许普通用户访问自身userPassword属性的ACL访问控制规则——LDAP认证的前提是用户能读取自己的密码属性来完成凭据验证,而你当前的配置完全没覆盖这个场景。
问题根源分析
从你贴出的olcDatabase={-1}frontend.ldif配置和slapd日志来看:
你现有的ACL规则只处理了三类场景:
- 外部系统管理员(
gidNumber=0+uidNumber=0,cn=peercred,...)拥有全量管理权限 - 根DN(
dn.exact="")允许所有主体读取 - 子模式(
cn=Subschema)允许所有主体读取
但完全没有针对普通用户认证的规则,日志里的这条信息直接点明了问题:
5ab4a590 => slap_access_allowed: auth access denied by none(=0)
当普通用户尝试绑定(需要访问自己的userPassword)时,没有匹配到任何允许的ACL规则,直接被拒绝。
具体解决方案
你需要添加一条ACL规则,允许用户自身对userPassword进行认证访问,同时禁止其他用户查看该属性(符合LDAP安全原则)。
方法1:通过ldapmodify动态添加推荐方式,避免直接编辑配置文件出错
- 创建一个名为
add-user-acl.ldif的文件,内容如下:
dn: olcDatabase={-1}frontend,cn=config changetype: modify add: olcAccess olcAccess: {3}to attrs=userPassword by self auth by * none
- 执行以下命令应用配置(用外部管理员身份修改,无需输入密码):
ldapmodify -Y EXTERNAL -H ldapi:/// -f add-user-acl.ldif
方法2:直接编辑slapd配置文件不推荐,可能导致配置损坏
如果你确认要直接编辑/etc/ldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif,在现有olcAccess规则后添加:
olcAccess: {3}to attrs=userPassword by self auth by * none
添加后重启slapd服务生效:
systemctl restart slapd
验证修复效果
用普通用户测试绑定:
ldapwhoami -x -D cn=user2,dc=mydomain,dc=com -W
如果返回dn:cn=user2,dc=mydomain,dc=com,说明绑定成功。
额外注意事项
- 如果你的LDAP业务数据库(比如
olcDatabase={1}mdb.ldif)有单独的ACL规则,需要确保这些规则没有覆盖frontend的全局规则,避免权限冲突。 - 可以验证用户的
userPassword属性是否用LDAP支持的加密方式存储(比如SSHA),ldappasswd默认会用合适的加密方式,也可以通过以下命令确认:ldapsearch -x -D cn=admin,dc=mydomain,dc=com -W -b cn=user2,dc=mydomain,dc=com userPassword
内容的提问来源于stack exchange,提问作者Cozzamara
相关产品推荐
相关产品推荐

