getent passwd 를 인자 없이 실행하면 로컬 계정만 나오고 LDAP 계정이 보이지 않는다. 그런데 이름을 지정하면 나온다.
getent passwd # LDAP 사용자 없음
getent passwd haedong # 정상 출력
이것은 정상 동작이다. SSSD 의 enumerate 는 기본값이 꺼짐이며, 꺼져 있으면 "전체 목록"을 만들지 않고 이름 · UID 로 물어볼 때만 조회한다.
두 결과가 어떻게 나오느냐에 따라 원인이 갈린다.
getent passwd |
getent passwd <이름> |
판단 |
|---|---|---|
| 로컬만 | 정상 | enumerate 가 꺼져 있을 뿐. 연동은 정상 |
| 로컬만 | 없음 | 실제 연동 문제. 아래 절차로 확인 |
systemctl status sssd
sss_cache -E # 캐시 무효화
systemctl restart sssd
# SSSD 를 거치지 않고 서버에 직접 물어 본다
ldapsearch -x -H ldap://ldap.example.com -b "dc=example,dc=com" "(uid=haedong)"
# nsswitch 가 sss 를 보고 있는지
grep -E '^(passwd|group|shadow):' /etc/nsswitch.conf
# 로그
journalctl -u sssd -n 100 --no-pager
ls /var/log/sssd/
nsswitch.conf 에 sss 가 없으면 SSSD 가 아무리 정상이어도 getent 에는 나오지 않는다.
passwd: files sss
group: files sss
shadow: files sss
ldapsearch 는 되는데 SSSD 만 안 되면 대개 ldap_search_base · 필터 · TLS 설정 차이다. SSSD 는 id_provider 가 ldap 인지 ad 인지에 따라 기본 속성 매핑이 달라진다.
전체 열거가 필요한 상황(계정 목록을 보는 도구, 일부 백업 · 감사 스크립트)이라면 켠다.
# /etc/sssd/sssd.conf
[domain/example.com]
enumerate = true
chmod 600 /etc/sssd/sssd.conf
systemctl restart sssd
켠 직후에는 바로 나오지 않는다. 백그라운드 열거가 끝나야 목록이 채워지므로 잠시 기다린 뒤 다시 확인한다.
관련 설정의 기본값은 다음과 같다.
| 설정 | 기본값 | 뜻 |
|---|---|---|
enumerate |
꺼짐 | 전체 열거 여부 |
ldap_enumeration_refresh_timeout |
300초 | 열거 캐시를 갱신하기 전 대기 시간 |
ldap_enumeration_search_timeout |
60초 | 열거 검색이 취소되기까지의 제한 시간 |
사용자 · 그룹 수가 많은 조직에서는 권장되지 않는다.
ldap_enumeration_search_timeout 안에 끝나지 않아 검색이 취소되고 오프라인 모드로 빠질 수 있다. 이때는 이름 조회까지 느려진다.AD 연동(id_provider = ad)에서는 특히 권장하지 않는다. 필요한 것이 "특정 사용자가 보이느냐"라면 enumerate 없이 이름으로 조회하면 된다.
getent passwd haedong
id haedong
getent group developers
# SSSD 캐시에 무엇이 들어 있는지
sssctl user-checks haedong
sssctl domain-status example.com
sssctl user-checks 는 NSS 조회와 PAM 접근 판정을 함께 보여 주므로, "이름은 보이는데 로그인이 안 되는" 경우를 구분하는 데 유용하다.
접근 제어를 걸어 두었다면 그쪽도 본다. access_provider 와 ldap_access_filter 가 조건을 좁히고 있으면 조회는 되어도 로그인이 거부된다.