SSSD(System Security Services Daemon)는 LDAP · AD · FreeIPA 같은 원격 디렉터리를 리눅스의 사용자 · 그룹 · 인증 체계에 붙여 주는 데몬이다. 모니터 프로세스가 도메인별 백엔드(Data Provider)와 기능별 Responder 를 띄우고, 조회 결과를 로컬 캐시에 담아 디렉터리가 끊겨도 로그인이 되게 한다.
getpwnam / PAM 인증 요청
↓
NSS / PAM 모듈 (sss)
↓
Responder (nss / pam / sudo / ssh)
↓
Data Provider (도메인별 백엔드)
↓
LDAP · Kerberos · AD 서버 ←→ 로컬 캐시(/var/lib/sss/db)
[sssd]
services = nss, pam, sudo, ssh # 활성화할 Responder
domains = EXAMPLE.COM
config_file_version = 2
[nss]
filter_users = root # 로컬 파일 우선 처리할 계정
filter_groups = root
entry_cache_nowait_percentage = 75 # 캐시 TTL 75% 경과 후 조회 시 캐시를 즉시 돌려주고 뒤에서 갱신
[pam]
offline_credentials_expiration = 7 # 오프라인 상태에서 캐시 자격증명 허용 일수(0=무제한)
offline_failed_login_attempts = 3
offline_failed_login_delay = 5
[domain/EXAMPLE.COM]
id_provider = ad # 또는 ldap / ipa
auth_provider = ad
access_provider = ad
ldap_uri = ldap://dc1.example.com
cache_credentials = true
krb5_realm = EXAMPLE.COM
krb5_store_password_if_offline = true
override_homedir = /home/%u
default_shell = /bin/bash
ldap_id_mapping = true # AD SID → POSIX UID 자동 매핑
id_provider = ad 는 LDAP 조회 · Kerberos 인증 · 바인드를 한 번에 처리하며, realm join 으로 도메인에 가입하면 바인드용 keytab 이 자동 생성된다. id_provider = ldap 로 수동 구성할 때는 ldap_default_bind_dn 과 ldap_default_authtok 을 반드시 넣어야 하고, 빠지면 SSSD 가 offline 으로 떨어져 id <user> 가 실패한다.
/etc/nsswitch.conf 의 passwd · group 행에 sss 가 있어야 조회가 SSSD 로 간다.
1. AS-REQ 클라이언트 → KDC(AS) : 나 user@REALM 이다
2. AS-REP KDC → 클라이언트 : TGT (사용자 키로 암호화)
3. TGS-REQ 클라이언트 → KDC(TGS) : 이 TGT 로 host/svc@REALM 서비스 티켓 달라
4. TGS-REP KDC → 클라이언트 : 서비스 티켓
5. AP-REQ 클라이언트 → 서비스 : 서비스 티켓 제시
6. AP-REP 서비스 → 클라이언트 : 상호 인증 완료
비밀번호 자체는 네트워크로 흐르지 않는다. 티켓은 캐시(KRB5CCNAME)에 저장되며, 서비스 계정은 비밀번호 대신 keytab 으로 kinit -kt 한다. principal 은 user@REALM(1 컴포넌트)과 service/host@REALM(2 컴포넌트) 두 형태가 있고, Hadoop 계열은 auth_to_local 규칙으로 이를 짧은 OS 이름으로 바꾼 뒤 권한을 판단한다.
시계 오차가 기본 5 분(clockskew)을 넘으면 인증이 실패하므로 chrony 등으로 시간을 맞춘다.
systemctl status sssd
sssctl domain-status EXAMPLE.COM
sssctl user-checks <user>
id <user>; getent passwd <user>
sss_cache -E # 캐시 무효화
klist; klist -kt /path/to.keytab
KRB5_TRACE=/dev/stdout kinit <user>@EXAMPLE.COM
로그는 /var/log/sssd/ 아래 도메인별로 쌓이며, debug_level = 6 이상으로 올려 재현한다.