ldap oclAccess似乎不适用于pwdPolicy

时间:2017-08-03 01:33:12

标签: openldap

我在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

1 个答案:

答案 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叠加层时:

  1. 您应该使用-e ppolicy参数ldappasswd,这样您就可以看到扩展响应了。
  2. 用户还必须使用-a ldappasswd选项来指定旧密码(如日志所示)或-A以提示您输入密码。更改日志是change password must use DELETE followed by ADD/REPLACE,这意味着您必须提供旧密码和新密码。 ldappasswd将为旧值发送DELETE,为新值发送ADD或REPLACE。
  3. 如何让管理员在不知道旧密码的情况下执行此操作是另一个问题,看起来......通过应用程序为我工作,但我从未通过ldappasswd完成。也许-e ppolicy也是答案。
  4. 编辑2 这是因为您的密码政策中包含pwdSafeModify=TRUE。这种相当无用的设置使管理员无法在不知道旧密码的情况下重置密码,如果知道旧密码则根本不需要管理重置。我把它关掉了,但是我的所有密码都只通过Java代码更改:一个用户自己,另一个用于管理员,所以我可以自己执行pwdSafeModify