操作系统:Ubuntu 17.10
我目前在 Ubuntu 上安装了 ldap 来访问 ldap 服务器。我按照许多教程中提供的方法配置了 nls、pam 和 ldap。所以它起作用了,但现在任何 ldap 用户都可以登录系统。因此我想使用属性限制对系统的访问
pam_groupdn
或者
pam_filter
在 /etc/ldap.conf 中(注意,系统中不存在 pam_ldap.conf,并且也无法创建)
当我这样做的时候
ldapsearch -x -H ldaps://ldap.domain.local:636 -b "cn=users,dc=ldap,dc=mydomain,dc=local" uid="someuser"
我在这个例子中得到了结果
memberOf: cn=users,cn=groups,cd=ldap,dc=domain,dc=local
memberOf: cn=lindev,cn=groups,cd=ldap,dc=domain,dc=local
因此我的过滤器应该包含用于访问系统的 cn 用户和 lindev。首先,我尝试在 /etc/ldap.conf 中设置一个过滤器,如下所示
pam_filter &((member=cn=lindev,dc=ldap,dc=domain,dc=local)(member=cn=lindev,dc=ldap,dc=domain,dc=local))
我现在切换到 nslcd 的调试模式
sudo service nslcd stop
sudo nslcd -d
控制输出。不幸的是,一旦使用定义的过滤器,它就不会起作用。它只接受 binddn 的值(也在 /etc/ldap.conf 和 /etc/nslcd.conf 中配置)
binddn cn=users,dc=ldap,dc=domain,dc=local
实际上,用户的 uid 被粘贴在 nslcd 的输出中,然后进行了比较,但从未应用过滤器。似乎 /etc/ldap.conf 的这些 pam_xyz 属性被完全忽略了。我还在 Google 上搜索了几个解决方案,这些解决方案讨论了修改 /etc/pam.d 中的文件,尤其是文件 common-account,如下所示:
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
account requisite pam_deny.so
account required pam_permit.so
account [success=ok new_authtok_reqd=done ignore=ignore user_unknown=ignore authinfo_unavail=ignore default=bad] pam_ldap.so minimum_uid=1000
互联网上有很多提示可以调整这些文件以及文件 common-account、common-auth、common-password 和 common-session。我尝试了几乎所有的提示,但问题仍然存在。客户端对服务器进行的查询中根本没有应用任何过滤器。
因此,我的问题是,在 /etc/ldap.conf 中哪里可以激活此属性?
答案1
我放弃了考虑 /etc/ldap.conf 中的 pam_filter 和 pam_groupdn 属性。/etc/nslcd.conf 中有两个选项可以执行相同的操作(根据 https://arthurdejong.org/nss-pam-ldapd/nslcd.conf.5)
- pam_authc_search
- pam_authz_search
文档显示 authz 比 authc 稍微复杂一点。就我的目的而言,采用变体 authc 就足够了。
我的方法是首先使用 ldapsearch 生成有效的搜索过滤器:
ldapsearch -x -H ldaps://ldap.domain.local -b "dc=ldap,dc=domain,dc=local" "(&(memberUid=loginName)(|(cn=sudogroup)(cn=lindev)))"
过滤器检查用户是否确实属于组 sudogroup 和 lindev。
现在我准备将内容粘贴到 /etc/nslcd.conf:
pam_authc_search (&(memberUid=$username)(|(cn=sudogroup)(cn=lindev)))
目标达成:我现在仅使用 sudogroup 和 Linux 开发组 (lindev) 的成员即可登录。