LDAP PAM 客户端错误“无法找到用户 ID 的名称”

LDAP PAM 客户端错误“无法找到用户 ID 的名称”

昨晚我的 ldap 身份验证运行良好,但今天似乎不起作用。我可以以用户身份进行身份验证,但客户端似乎无法查找信息关于用户:

以 ldap 用户“ts121207”身份登录的示例:

$ su - ts121207
Password:
$ id -u
5003
$ whoami
whoami: cannot find name for user ID 5003

我可以作为用户进行绑定并从客户端进行查询而不会出现问题:

$ ldapsearch -h ldap.example.org -D cn=ts121207,ou=students,ou=users,dc=example,dc=org -b ou=students,ou=users,dc=example,dc=org -w secret '(uid=ts121207)' uid givenName sn
# extended LDIF
#
# LDAPv3
# base <ou=students,ou=users,dc=example,dc=org> with scope subtree
# filter: (uid=ts121207)
# requesting: uid givenName sn 
#

# ts121207, students, users, example.org
dn: cn=ts121207,ou=students,ou=users,dc=example,dc=org
uid: ts121207
givenName: Test
sn: Student

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

我已尝试重新启动 sssd,以及清除/var/lib/sss/db/*

有趣的是,当我查看 ldap 服务器上的 slapd 日志时,它在查找信息时似乎没有绑定为用户。这是我运行时立即记录的内容whoami

Nov 19 17:57:52 example.org slapd[14150]: conn=1332 op=0 BIND dn="" method=128                                                                                                                                                                                                             
Nov 19 17:57:52 example.org slapd[14150]: conn=1332 op=0 RESULT tag=97 err=0 text=                                                                                                                                                                                                         
Nov 19 17:57:52 example.org slapd[14150]: conn=1332 op=1 SRCH base="dc=example,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=5003))"                                                                                                                             
Nov 19 17:57:52 example.org slapd[14150]: conn=1332 op=1 SRCH attr=uid userPassword uidNumber gidNumber cn homeDirectory loginShell gecos description objectClass                                                                                                                          
Nov 19 17:57:52 example.org slapd[14150]: conn=1332 op=1 SEARCH RESULT tag=101 err=0 nentries=0 text=                                                                                                                                                                                      

客户端难道不应该通过绑定为用户来执行该查询,以便读取属性吗?还是我误解了该日志行?

答案1

我找到了问题所在。我使用 Ubuntu 的软件包设置了 ldap 客户端ldap-auth-config。其中一个问题是“数据库是否需要登录?”:

在此处输入图片描述

如果你回答“否”,那么 ldap 客户端将匿名绑定(任何人都可以通过身份验证来获取用户/组信息。起初,任何人都可以看到用户信息,这对我来说似乎很奇怪,但后来我意识到,这类似于/etc/passwd和的/etc/group工作方式,它们是全世界可读的。

我的 ACL 阻止了这一点,因为我不想允许匿名连接枚举目录中的用户。因此,为了解决这个问题,我添加了一个系统用户:

dn: cn=auth,ou=system,dc=example,dc=org
cn: auth
objectclass: organizationalRole
objectclass: top
objectclass: simpleSecurityObject
userpassword: {SHA}---redacted----=

然后我添加了以下 ACL:

#
# System user "auth" can access user/group attrs needed by pam / nss             
olcAccess: {4}to dn.subtree="ou=users,dc=example,dc=org"                        
    attrs=entry,uid,userPassword,uidNumber,gidNumber,cn,homeDirectory,loginShell,gecos,description,objectClass
    by dn.exact="cn=auth,ou=system,dc=example,dc=org" read                      
    by self read                                                                 
    by * search                                                                  
olcAccess: {5}to dn.subtree="ou=groups,dc=example,dc=org"                       
    attrs=entry,cn,gidNumber,memberUid,objectClass                               
    by dn.exact="cn=auth,ou=system,dc=example,dc=org" read
#                                                                                
# Allow users to read any data on their own entries                              
olcAccess: {6}to *                                                               
    by self read                                                                 
    by * search         

最后,我运行了sudo dpkg-reconfigure ldap-auth-config,当系统提示“数据库是否需要登录?”时,我回答是的。在询问“非特权用户”的问题中,我提供了我创建的新系统用户:

在此处输入图片描述

请注意,这仍然会使用户帐户潜在可由在 Linux 系统上经过身份验证的任何用户枚举,因为该密码以纯文本形式存储在中/etc/ldap.conf,但其安全性并不低于/etc/passwd和的/etc/group工作方式。

答案2

如果您的 /etc/passwd 文件的权限为 0000,则 root 可以正常使用,而所有其他用户都会出现此错误。

相关内容