커버로스(Kerberos)[1]는 "티켓"(ticket)을 기반으로 동작하는 네트워크 인증 프로토콜이다. 비보안 네트워크에서 통신하는 노드가 안전한 방식으로 서로를 식별할 수 있게 하며, 클라이언트-서버 모델에서 사용자와 서버가 서로를 확인하는 상호 인증을 제공한다. 메시지는 도청과 재전송 공격으로부터 보호된다. 대칭키 암호로 만들어졌고 신뢰된 제3자(KDC)를 요구하며, 기본 포트는 88 이다. 프로젝트 아테나의 네트워크 서비스를 보호할 목적으로 MIT 가 개발했다.
구현체는 MIT Kerberos(krb5, 현재 1.22.2[2]) · Heimdal · Microsoft Active Directory 가 있다. Hadoop · Cloudera 계열의 인증은 이 프로토콜 위에서 돌고, FreeIPA 는 MIT krb5 를 LDAP 과 묶어 제공한다.
| 구성 | 역할 |
|---|---|
| KDC (Key Distribution Center) | 인증 서버(AS)와 티켓 발급 서버(TGS)를 합친 것. krb5kdc 데몬. 88/tcp,udp |
| kadmind | 프린시펄 · 정책을 원격 관리하는 데몬. 749/tcp |
| Realm | 하나의 KDC 가 관장하는 인증 영역. 관례상 대문자 — EXAMPLE.COM |
| Principal | 사용자 또는 서비스의 이름 — user@EXAMPLE.COM · hdfs/host.example.com@EXAMPLE.COM |
| TGT (Ticket Granting Ticket) | 로그인(kinit)으로 받는 최초 티켓. 이걸로 서비스 티켓을 받는다 |
| Keytab | 서비스 · 배치 계정의 키를 담은 파일. 비밀번호 없이 인증한다 |
/etc/krb5.conf |
클라이언트 · 서버 공통 설정. realm 과 KDC 주소[3] |
/var/kerberos/krb5kdc/kdc.conf |
KDC 전용 설정. 포트 · DB 경로 · 암호화 종류 |
암호화 종류(enctype)는 aes256-cts-hmac-sha1-96 · aes128-cts-hmac-sha1-96 이 사실상 표준이다. 더 강한 aes256-cts-hmac-sha384-192(enctype 20) 은 Java 8 등 옛 클라이언트가 지원하지 않는다 — Kerberos Encryption type Unknown (20).
공식 설치 문서[4]의 절차를 RHEL 패키지 경로로 옮긴 것이다. realm 은 EXAMPLE.COM, KDC 호스트는 kdc.example.com 으로 둔다.
dnf install -y krb5-server krb5-workstation krb5-libs
클라이언트에도 같은 파일을 배포한다.
[libdefaults]
default_realm = EXAMPLE.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
EXAMPLE.COM = {
kdc = kdc.example.com
admin_server = kdc.example.com
}
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
/var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
EXAMPLE.COM = {
master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal
max_life = 24h
max_renewable_life = 7d
}
-s 로 마스터 키 stash 파일을 만들어 데몬이 비밀번호 없이 기동하게 한다.
kdb5_util create -r EXAMPLE.COM -s
# Enter KDC database master key: (마스터 키 — 잃어버리면 복구할 수 없다)
kadmin.local -q "addprinc admin/admin@EXAMPLE.COM"
echo '*/admin@EXAMPLE.COM *' > /var/kerberos/krb5kdc/kadm5.acl
systemctl enable --now krb5kdc kadmin
systemctl status krb5kdc kadmin
firewall-cmd --permanent --add-service=kerberos # 88/tcp,udp
firewall-cmd --permanent --add-service=kadmin # 749/tcp
firewall-cmd --permanent --add-service=kpasswd # 464/tcp,udp
firewall-cmd --reload
kadmin.local -q "addprinc haedong@EXAMPLE.COM"
kinit haedong@EXAMPLE.COM
klist
# Ticket cache: KEYRING:persistent:1000:1000
# Default principal: haedong@EXAMPLE.COM
# krbtgt/EXAMPLE.COM@EXAMPLE.COM ...
kdestroy
다른 호스트에서 kadmin -p admin/admin 으로 원격 관리가 되면 749 포트와 ACL 까지 맞은 것이다.
서비스(HDFS · NiFi · 웹 서버)는 사람 대신 keytab 으로 인증한다. KDC 에서 프린시펄을 만들고 keytab 으로 내보내 해당 호스트에 둔다.
kadmin.local -q "addprinc -randkey HTTP/web.example.com@EXAMPLE.COM"
kadmin.local -q "ktadd -k /etc/httpd/http.keytab HTTP/web.example.com@EXAMPLE.COM"
klist -kte /etc/httpd/http.keytab
kinit -kt /etc/httpd/http.keytab HTTP/web.example.com@EXAMPLE.COM
KDC 에 접근할 수 없고 계정 비밀번호만 있을 때(Active Directory 계정 등) ktutil[5] 로 만든다. kvno(-k)와 enctype 은 KDC 에 등록된 값과 같아야 한다.
ktutil
ktutil: addent -password -p ID_ACCOUNT@AD.AD_SERVER.COM -k 1 -e aes256-cts
Password for ID_ACCOUNT@AD.AD_SERVER.COM:
ktutil: addent -password -p ID_ACCOUNT@AD.AD_SERVER.COM -k 1 -e aes128-cts
Password for ID_ACCOUNT@AD.AD_SERVER.COM:
ktutil: wkt account.keytab
ktutil: q
kinit -kt account.keytab ID_ACCOUNT@AD.AD_SERVER.COM && klist
default_ccache_name 종류에 따라 Hadoop 클라이언트가 티켓을 찾지 못하는 경우.RFC 4120 — The Kerberos Network Authentication Service (V5). 2026-09-20 확인. https://www.rfc-editor.org/rfc/rfc4120.html ↩︎
최신 버전 krb5-1.22.2 (2026-01-29) — 2026-09-20 확인. https://web.mit.edu/kerberos/ ↩︎
krb5.conf 참조. 2026-09-20 확인. https://web.mit.edu/kerberos/krb5-latest/doc/admin/conf_files/krb5_conf.html ↩︎
Installing KDCs. 2026-09-20 확인. https://web.mit.edu/kerberos/krb5-latest/doc/admin/install_kdc.html ↩︎
ktutil. 2026-09-20 확인. https://web.mit.edu/kerberos/krb5-latest/doc/admin/admin_commands/ktutil.html ↩︎