LDAP 을 붙인 뒤 id 를 실행했을 때 기대한 그룹이 아니라 사용자 이름과 같은 그룹이 나오는 일이 흔하다.
$ id appuser
uid=10001(appuser) gid=10001(appuser) groups=10001(appuser)
원인은 SSSD 설정이 아니라 LDAP 사용자 엔트리의 gidNumber 값이다. POSIX 의 기본 그룹(primary group)은 그룹 엔트리의 멤버 목록이 아니라 사용자 엔트리의 gidNumber 로 정해진다. 사용자마다 같은 번호의 개인 그룹을 만들어 두는 도구(ldapadd 템플릿, 일부 사용자 생성 스크립트)를 쓰면 이렇게 된다.
먼저 실제 값을 확인한다.
ldapsearch -x -LLL -H ldap://ldap.example.com -b "dc=example,dc=com" "(uid=appuser)" uid uidNumber gidNumber
ldapsearch -x -LLL -H ldap://ldap.example.com -b "dc=example,dc=com" "(cn=users)" cn gidNumber memberUid member
사용자의 gidNumber 를 원하는 그룹의 gidNumber 로 바꾸면 해결된다.
cat > /tmp/fix_gid.ldif <<'LDIF'
dn: uid=appuser,ou=people,dc=example,dc=com
changetype: modify
replace: gidNumber
gidNumber: 100
LDIF
ldapmodify -x -D "cn=admin,dc=example,dc=com" -W -f /tmp/fix_gid.ldif
사용자 엔트리를 건드릴 수 없다면 보조 그룹(supplementary group)으로 추가하는 방법도 있다. 다만 파일 생성 시 기본 그룹은 여전히 개인 그룹이 되므로, 공유 디렉터리에는 setgid 비트를 걸어 그룹을 강제하는 편이 안전하다.
chgrp users /data/share && chmod 2775 /data/share
보조 그룹이 전혀 잡히지 않으면 스키마와 SSSD 설정이 어긋난 것이다. posixGroup 은 멤버를 memberUid(사용자 이름)로, groupOfNames · AD 그룹은 member(전체 DN)로 담는다. ldap_group_member 가 실제 스키마와 같아야 한다.
[domain/example.com]
id_provider = ldap
ldap_schema = rfc2307 ; memberUid 를 쓰는 전통적인 스키마
; ldap_schema = rfc2307bis ; member(DN) 를 쓰는 스키마
ldap_group_member = memberUid
ldap_user_gid_number = gidNumber
ldap_schema 를 맞추면 ldap_group_member 기본값도 따라오므로 대개 스키마만 정확히 지정하면 된다.
SSSD 는 조회 결과를 로컬 캐시에 담아 두므로 LDAP 을 고쳐도 즉시 반영되지 않는다. 특정 항목만 무효화하는 명령을 먼저 쓰고, 그래도 남으면 캐시 파일을 지운다.
sss_cache -E
systemctl restart sssd
id appuser
systemctl stop sssd
rm -f /var/lib/sss/db/*
systemctl start sssd
AD 나 IPA 를 붙이면 기본적으로 user@domain 형태를 요구한다. 같은 조직의 서버끼리도 한쪽은 su - appuser 가 되고 다른 쪽은 su - appuser@example.com 이라야 되는 차이는 거의 전부 sssd.conf 의 다음 값 때문이다.
[sssd]
domains = example.com
[domain/example.com]
use_fully_qualified_names = False
fallback_homedir = /home/%u
default_shell = /bin/bash
use_fully_qualified_names = False 를 주면 짧은 이름으로 조회와 로그인이 된다. 도메인을 여러 개 붙였다면 짧은 이름이 어느 도메인으로 갈지 정해야 하므로 [sssd] 절의 default_domain_suffix 를 함께 지정한다.
fallback_homedir 은 sssd.conf 의 도메인 절에 두는 옵션이다. krb5.conf 의 [appdefaults] 에 적는 예시가 돌아다니지만 그 자리에서는 아무 효과가 없다. %u 는 짧은 이름, %f 는 전체 이름으로 치환되므로 use_fully_qualified_names 설정과 짝을 맞춰야 홈 디렉터리 경로가 흔들리지 않는다.
PAM 설정은 손댈 필요가 없다. 이름 형식을 결정하는 것은 SSSD 이고, pam_sss.so 는 넘겨받은 이름을 그대로 전달할 뿐이다.
systemctl restart sssd
getent passwd appuser
id appuser