我在Ubuntu 14.04上安装了ldap 2.4.3。我已经配置了pwdPolicy覆盖,它可以在用户更改自己的密码和管理员更改密码时起作用。问题是当管理员更改密码时,不遵守策略。因此,我创建了另一个名为usermanagement的帐户,并将dn添加到oclAccess。我可以使用usermanagement帐户修改我尝试过的所有字段,但userpassword除外。
运行ldappasswd时,我得到Insufficient access (50)
这是我的olcAccess:
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=zed,dc=com" write by dn="cn=usermanagement,dc=zed,dc=com" write by anonymous auth by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=zed,dc=com" write by dn="cn=usermanagement,dc=zed,dc=com" write by * read
修改
我启用了调试,然后执行了ldappasswd -H ldap://localhost -x -D "uid=luis,ou=users,dc=zed,dc=com" -W -S "uid=vixian,ou=users,dc=zed,dc=com"
。日志显示:
983c0f8 bdb_dn2entry("cn=passworddefault,ou=policies,dc=zed,dc=com")
5983c0f8 => bdb_entry_get: found entry: "cn=passworddefault,ou=policies,dc=zed,dc=com"
5983c0f8 bdb_entry_get: rc=0
5983c0f8 change password must use DELETE followed by ADD/REPLACE
5983c0f8 send_ldap_result: conn=1004 op=1 p=3
5983c0f8 send_ldap_result: err=50 matched="" text="Must supply old password to be changed as well as new one"
5983c0f8 send_ldap_extended: err=50 oid= len=0
5983c0f8 send_ldap_response: msgid=2 tag=120 err=50
然后我尝试使用ldapmodify删除userPassword并且它成功但是替换或添加产生了相同的结果权限被拒绝。
我已根据@ejp建议更新了olcAccess:
olcAccess: {0}to attrs=userPassword,shadowLastChange
by group/groupOfUniqueNames/uniqueMember.exact="cn=itinst,ou=groups,dc=zed,dc=com" write
by anonymous auth
by self write
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to *
by self write
by group/groupOfUniqueNames/uniqueMember.exact="cn=itinst,ou=groups,dc=zed,dc=com" write
by users read by anonymous search
答案 0 :(得分:1)
问题是当管理员更改密码时,不会遵守策略。
当 managerDN 更改密码时“不遵守政策”。您不应该将managerDN
用于任何内容。这是服务器运行的帐户,当然,它可以执行任何操作。您应该在DIT 中定义单独的admin
帐户,并为其提供相应的访问权限,就像我在下面的示例中对整个ldap admins
组一样。
它与您的olcAccess
没有任何关系。请查看有关如何正确执行此操作的文档。我有:
olcAccess {0}to attrs=userPassword
by dn.base="cn=replicator,dc=verismart,dc=com,c=us" write
by group/groupOfUniqueNames/uniqueMember.exact="cn=ldap admins,ou=groups,dc=verismartlabs,dc=com" write
by group/groupOfUniqueNames/uniqueMember.exact="cn=applications,ou=groups,dc=verismartlabs,dc=com" write
by anonymous auth by self write
olcAccess {1}to dn.base="" by * read
olcAccess {2}to *
by self write
by dn.base="cn=replicator,dc=verismart,dc=com,c=us" write
by group/groupOfUniqueNames/uniqueMember.exact="cn=ldap admins,ou=groups,dc=verismartlabs,dc=com" write
by group/groupOfUniqueNames/uniqueMember.exact="cn=applications,ou=groups,dc=verismartlabs,dc=com" write
by users read
by anonymous search
编辑当您使用ppolicy
叠加层时:
-e ppolicy
参数ldappasswd
,这样您就可以看到扩展响应了。-a
ldappasswd
选项来指定旧密码(如日志所示)或-A
以提示您输入密码。更改日志是change password must use DELETE followed by ADD/REPLACE
,这意味着您必须提供旧密码和新密码。 ldappasswd
将为旧值发送DELETE,为新值发送ADD或REPLACE。ldappasswd
完成。也许-e ppolicy
也是答案。 编辑2 这是因为您的密码政策中包含pwdSafeModify=TRUE
。这种相当无用的设置使管理员无法在不知道旧密码的情况下重置密码,如果知道旧密码则根本不需要管理重置。我把它关掉了,但是我的所有密码都只通过Java代码更改:一个用户自己,另一个用于管理员,所以我可以自己执行pwdSafeModify
。