我已经能够设置 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
答案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)cn
(loginShell
只需将它们从第一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
行删除。