kinit 과 klist 는 정상인데 hdfs dfs -ls / 가 Cannot authenticate via KERBEROS 나 GSS initiate failed 로 실패한다. klist 의 캐시 이름이 KCM:0 처럼 나온다.
| 타입 | 형태 | 특징 |
|---|---|---|
| FILE | FILE:/tmp/krb5cc_1000 |
파일. Java · Hadoop 클라이언트가 읽는 전통 방식 |
| KCM | KCM:1000 |
SSSD sssd-kcm 데몬이 메모리에서 관리. RHEL 8 기본. Java 기반 Hadoop 클라이언트가 읽지 못하는 경우가 있다 |
| KEYRING | KEYRING:persistent:1000 |
커널 keyring |
| DIR / MEMORY | — | 특수 용도 |
RHEL 8 은 /etc/krb5.conf.d/kcm_default_ccache 로 KCM 을 기본으로 둔다. Hadoop 클라이언트는 KCM 소켓에 접근하지 못해 티켓이 있어도 인증에 실패한다.
# /etc/krb5.conf
[libdefaults]
default_ccache_name = FILE:/tmp/krb5cc_%{uid}
/etc/krb5.conf.d/kcm_default_ccache 에 default_ccache_name = KCM: 이 남아 있으면 그쪽이 우선하므로 주석 처리하거나 파일을 지운다. %{uid} 는 Kerberos 라이브러리가 치환한다.
# /etc/profile.d/krb5cc.sh 또는 ~/.bashrc
export KRB5CCNAME=FILE:/tmp/krb5cc_$(id -u)
$(id -u) 는 셸이 해석한다. 환경변수는 krb5.conf 보다 우선하며 그 셸의 자식 프로세스에만 적용된다. 데몬과 cron 에는 적용되지 않으므로 운영 서버는 krb5.conf 쪽을 고친다.
kinit user@EXAMPLE.COM
klist # Ticket cache: FILE:/tmp/krb5cc_1000 이어야 한다
ls -la /tmp/krb5cc_$(id -u) # 600 권한
hdfs dfs -ls /
kinit -kt /etc/security/keytabs/svc.keytab svc@EXAMPLE.COM
# crontab
*/30 * * * * KRB5CCNAME=FILE:/tmp/krb5cc_$(id -u) kinit -R || kinit -kt /etc/security/keytabs/svc.keytab svc@EXAMPLE.COM