ldapsearch 로는 계정이 잘 나오는데 getent passwd <user> 와 id <user> 에는 아무것도 나오지 않는다. sssctl config-check 는 문제 없음으로 나오고 sssctl domain-list 에도 도메인이 보인다.
도메인 로그에는 이런 경고가 남는다.
[common_parse_search_base] WARNING: Using a deprecated filter option for USER.
Please see the documentation on LDAP search bases to see how the obsolete option
can be migrated
| 원인 | 설명 |
|---|---|
| 스키마 불일치 | 엔트리가 posixAccount 가 아니라 inetOrgPerson + extensibleObject 인데 SSSD 는 기본 필터로 posixAccount 를 찾는다 |
| 필수 속성 누락 | uidNumber · gidNumber · homeDirectory · cn 중 하나라도 빠지면 조회 결과에서 빠진다 |
| 캐시 잔재 | 설정을 고쳐도 SSSD 가 이전 캐시를 계속 읽는다 |
ldapsearch 는 되는데 getent 가 안 된다는 것은 연결은 되지만 필터가 걸러 내고 있다는 뜻이다.
OpenLDAP 에 inetOrgPerson 으로 계정을 만들고 그룹을 groupOfUniqueNames 로 쓰는 경우다.
[sssd]
config_file_version = 2
domains = example.com
services = nss, pam
debug_level = 9
[nss]
[pam]
[domain/example.com]
id_provider = ldap
auth_provider = ldap
access_provider = permit
ldap_uri = ldap://<ldap-host>:<port>
ldap_search_base = dc=example,dc=com
ldap_user_search_base = ou=people,dc=example,dc=com
ldap_group_search_base = ou=groups,dc=example,dc=com
ldap_default_bind_dn = cn=admin,dc=example,dc=com
ldap_default_authtok = ${LDAP_BIND_PASSWORD}
ldap_schema = rfc2307bis
ldap_user_object_class = inetOrgPerson
ldap_user_name = uid
ldap_user_uid_number = uidNumber
ldap_user_gid_number = gidNumber
ldap_user_home_directory = homeDirectory
ldap_user_shell = /bin/bash
ldap_user_gecos = cn
ldap_group_object_class = groupOfUniqueNames
ldap_group_name = cn
ldap_group_member = uniqueMember
ldap_group_gid_number = gidNumber
use_fully_qualified_names = False
enumerate = true
override_homedir = /nfs/userhome/%u
요점은 셋이다.
ldap_schema = rfc2307bis 는 그룹 멤버십을 DN 으로 들고 있는 OpenLDAP 기본 배치에 맞는다. rfc2307 이면 멤버를 이름으로 찾으므로 어긋난다.
ldap_user_object_class 를 실제 엔트리의 objectClass 로 명시한다. 지정하지 않으면 기본값으로 필터가 만들어져 결과가 0 건이 된다.
cn 이 없는 엔트리는 조회 결과에서 빠진다. ldapmodify 로 채워 넣는다.
dn: uid=<user>,ou=people,dc=example,dc=com
changetype: modify
add: cn
cn: <user>
grep -E '^(passwd|group):' /etc/nsswitch.conf
passwd: files sss
group: files sss
SSSD 는 재시작만으로 캐시를 버리지 않는다. 설정을 바꾼 뒤에도 같은 경고가 계속 찍히면 캐시와 DB 를 지우고 올린다.
systemctl stop sssd
rm -rf /var/lib/sss/db/* /var/lib/sss/mc/*
systemctl start sssd
파일 권한이 600 이 아니면 SSSD 가 설정을 아예 읽지 않는다.
chmod 600 /etc/sssd/sssd.conf
sssctl config-check
원인을 못 찾으면 데몬을 포그라운드로 띄워 실시간으로 본다. 다른 터미널에서 getent passwd <user> 를 실행했을 때 LDAP 요청과 필터가 로그에 보여야 한다.
systemctl stop sssd
sssd -i -d9
oddjob-mkhomedir 를 쓰는 경우 생성 권한은 umask 가 정한다. PAM 스택에서 지정한다.
session optional pam_umask.so umask=0027
/etc/login.defs 의 UMASK 와 /etc/default/useradd 의 UMASK 도 함께 맞춘다.
호스트에서는 id 가 그룹 이름까지 보여 주는데 컨테이너 안에서는 숫자만 나오는 경우가 있다.
호스트 : uid=2001(<user>) gid=2000(<group>) groups=2000(<group>)
컨테이너 : uid=2001 gid=2000 groups=2000
컨테이너는 자체 /etc/passwd 와 /etc/group 을 쓰므로 호스트의 이름 해석 결과가 넘어가지 않는다. 숫자 UID·GID 만으로도 파일 권한은 정상 동작하므로 기능상 문제는 없다. 이름이 꼭 필요하면 이미지에 같은 UID·GID 로 계정을 만들어 두거나 두 파일을 읽기 전용으로 마운트한다.
enumerate 옵션과 그 부작용을 다룬다.