使用 SSSD 的 LDAP 客户端身份验证:组问题

使用 SSSD 的 LDAP 客户端身份验证:组问题

我已经能够设置 389 LDAP 服务器和 SSSD 客户端身份验证。但是,每当我使用 ldap 用户登录时,每次登录后都会显示错误

ttt@dsl's password: 
Last login: Thu Dec  6 12:52:06 2012
id: cannot find name for group ID 6006

我尝试了多个不同的用户和多种类型。我在服务器和客户端都使用 Centos 6。getent shadow 不返回 ldap 用户,并且 Redhat 拒绝了此功能请求。https://bugzilla.redhat.com/show_bug.cgi?id=751291

或者我应该切换回 nss_ldap/pam_ldap,但可能无法获得 sssd 提供的密码缓存。

更新:

root@dsl etc]# cat /etc/sssd/sssd.conf 
[domain/default]
ldap_tls_reqcert = never
ldap_id_use_start_tls = True
cache_credentials = True
ldap_search_base = dc=ma,dc=net
#krb5_realm = EXAMPLE.COM
#krb5_server = kerberos.example.com
ldap_group_member = uniquemember
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldaps://ldap.ma.net
ldap_tls_cacertdir = /etc/openldap/cacerts
krb5_realm = EXAMPLE.COM
krb5_server = kerberos.example.com
enumerate = false
[sssd]
services = nss, pam
config_file_version = 2

#domains = LDAP
domains = 
[nss]
filter_users = root,ldap,named,avahi,haldaemon,dbus,radiusd,news,nscd
[pam]
reconnection_retries = 3
offline_credentials_expiration = 2
offline_failed_login_attempts = 3
offline_failed_login_delay = 5
[sudo]

[autofs]

[ssh]

[root@dsl etc]# 

以用户身份登录后,我可以成功执行 id 命令,但仍然想知道为什么它总是说没有这样的组。

[root@ldap02 ~]# ssh ttt@dsl
ttt@dsl's password: 
Last login: Thu Dec  6 13:18:16 2012 from 10.2.3.69
id: cannot find name for group ID 6006
[ttt@dsl ~]$ id ttt
uid=6006(ttt) gid=6006 groups=6006

[root@dsl ~]# groups ttt
ttt : groups: cannot find name for group ID 6006
6006
[root@dsl ~]# groups ttt

答案1

最后我终于解决了它。本文对我帮助很大。

这是我所做的。在 SSSD 端,一切都配置得很好,但是,我没有配置 LDAP 端。为了让 Unix 用户(posix 用户)正常工作,我们必须创建 posix 组并分配适当的值。

对于每个用户,除了分配 posix 组 ID 和用户 ID 之外,您还需要将他们附加到 posix 组。您也可以从 389 管理控制台添加它。创建组时,只需单击“posix 组”部分。或者从命令提示符使用本文

答案2

我的情况有同样的症状,但原因更复杂。我遵循了这一点指导,建议配置 LDAP 访问控制确保没有人可以从 LDAP 服务器读取(加密的)密码,但仍允许用户编辑他们自己选择的一些属性(例如自己的密码和照片),通过导入以下 LDIF:

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=cn,givenName,sn,userPassword,shadowLastChange,mail,loginShell,photo by self write by anonymous auth by dn.base="cn=Manager,dc=example,dc=org" write by * none
olcAccess: {1}to * by self read by dn.base="cn=Manager,dc=example,dc=org" write by * read

当 sssd 在 LDAP 中搜索组 ID 时,它会使用以下过滤器(摘自 sssd 日志,v. 1.16.5)发出匿名搜索请求:

(&(memberuid=test)(objectClass=posixGroup)(cn=*)(&(gidNumber=*)(!(gidNumber=0))))

此搜索请求需要对属性的读取权限cn,但只有匿名用户才有auth访问权限,因此搜索失败,sssd 无法知道组 ID。loginShell另一个搜索请求中的属性也发生了同样的情况,因此已登录的 LDAP 用户具有默认 shell(恰好是 csh 而不是 bash)。修复方法是将 LDAP 数据库中的属性设置为读取权限(而不是 auth)cnloginShell只需将它们从第一attrs行中删除):

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=givenName,sn,userPassword,shadowLastChange,mail,photo by self write by anonymous auth by dn.base="cn=Manager,dc=example,dc=org" write by * none
olcAccess: {1}to * by self read by dn.base="cn=Manager,dc=example,dc=org" write by * read

也许其他属性(例如 givenName)也应该从第一attr行删除。

相关内容