我已经研究这个问题大约一个星期了,但似乎无法弄清楚为什么会发生这种情况。
我已经开始passwd
工作,让用户从客户端机器更改自己的 ldap 密码,并且它与 ppolicy 覆盖一起工作:
$ passwd
Current Password:
New password:
BAD PASSWORD: The password is shorter than 8 characters
New password:
BAD PASSWORD: The password is a palindrome
New password:
BAD PASSWORD: The password is the same as the old one
passwd: Have exhausted maximum number of retries for service
passwd: password unchanged
然而,当我使用ldappasswd
它来更改密码时,它允许我创建一个字母密码和回文密码,但是不是我的历史记录中的密码:
$ ldappasswd -H ldap://**** -x -D "uid=test,ou=Users,dc=***,dc=***,dc=***" -W -A -S
Old password:
Re-enter old password:
New password:
Re-enter new password:
Enter LDAP Password:
$
# no issues entering "a" as the password (this is bad)
$ ldappasswd -H ldap://**** -x -D "uid=test,ou=Users,dc=***,dc=***,dc=***" -W -A -S
Old password:
Re-enter old password:
New password:
Re-enter new password:
Enter LDAP Password:
Result: Constraint violation (19)
Additional info: Password is in history of old passwords
$
# entered "password" as the password and it doesn't let me change it
理想情况下,我希望两者passwd
并ldappasswd
遵循密码策略。
以下是 slapd 配置中的访问规则:
/etc/ldap/slapd.d/cn=config/olcDatabase={1}mdb.ldif
...
# manager is the root bind dn, with password in /etc/ldap.secret
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn.base="uid=manager,ou=Users,dc=***,dc=***,dc=***" write by anonymous auth by * none
olcAccess: {1}to * by * read by dn.base="uid=manager,ou=Users,dc=***,dc=***,dc=***" write
...
在我看来,这就像passwd
绑定到根 DN,因为删除管理员帐户的访问权限会导致passwd
完全停止工作,并且ldappasswd
不受影响。
任何帮助都将受到赞赏。
答案1
那些来自passwd
看起来根本不像是来自政策覆盖。 他们来自当地的最有可能的是,其他 PAM 模块所做的检查pam_cracklib
。当然,本地 PAM 配置对直接联系 LDAP 服务器的工具没有影响。
换句话说,听起来您的本地工具运行良好,但是策略覆盖不是工作正常(即,它没有正确执行最小长度限制;而是由您的本地配置来执行该限制)。
(另外,如果你的 PAM LDAP 配置设置为使用“管理员”DN 进行绑定……那就有点坏的。这意味着任何服务器上获得 root 权限(甚至只是“文件读取”漏洞)的人都可以立即从 /etc/ldap.conf 获取管理员密码并获得对 LDAP 目录的完全访问权限。)