我在 RHEL 5.4 上设置了一个 OpenLDAP 服务器,并正在配置其他服务器以对其进行身份验证。我已配置并运行了带有 StartTLS 的 ldap 和 ldaps。
在我的客户端机器上,我的/etc/nsswitch.conf包括:
passwd: files ldap
shadow: files ldap
group: files ldap
我可以使用仅在 LDAP 中定义的用户成功登录到客户端(即,它未在 /etc/passwd 中找到它,并且成功向 LDAP 询问用户信息,并根据存储在 LDAP 中的密码哈希进行身份验证)。
我的问题是当我尝试锁定对 LDAP 服务器中的属性的访问时,具体来说,在/etc/openldap/slapd.conf,ldap用户无法再登录:
access to attrs=userpassword
by self write
by anonymous auth
by * none
我正在记录 slapd,看起来(我的理解,如果我错了请纠正我)pam_ldap 正在尝试读poxixAccount 对象类中的所有属性:
filter: (&(objectClass=posixAccount)(uid=cthompson))
attrs:
uid
userPassword
uidNumber
gidNumber
cn
homeDirectory
loginShell
gecos
description
objectClass
在我的 openldap 日志中,我没有收到任何访问或 acl 错误,但是我确实收到了:
access_allowed: search access to "uid=cthompson,ou=People,dc=domain,dc=com" "objectClass" requested
access_allowed: search access to "uid=cthompson,ou=People,dc=domain,dc=com" "uid" requested
是否需要进行某些配置,以便 pam_ldap 不读取 userPassword 属性,而是尝试对其进行“身份验证”(因此请求由“匿名身份验证”访问规则处理?
答案1
pam_ldap
不应该尝试读取用户密码值来让您登录——它通过使用检索到的 DN 进行 LDAP 绑定来让您登录。
pam_ldap 使用的搜索参数可能过于宽泛并且它会尝试提取用户密码,但如果您的 ACL 设置正确(对我来说看起来不错),它就不会在结果中获取该值。
以防万一你的 ACL不是很好(我以前总是错过一些明显的东西),这是我的生产 LDAP 环境中的有效 ACL 列表 :)
# Access and Security Restrictions
# (Most restrictive entries first)
access to attrs=userPassword
by self write
by dn.sub="ou=sync,dc=mydomain,dc=com" read
by anonymous auth
by users none
access to * by * read
尾随access to * by * read
很重要,我在您的例子中没有看到它,所以我不确定它是否缺失或者只是从您的代码片段中省略了。
此sync
行用于我的 LDAP 同步服务,如果您不进行复制则没有必要...