암호학: Kerberos KDC 기반 키 분배 방식
Kerberos KDC 기반 키 분배 방식입니다. KDC, master key, session key, ticket, authenticator, AS/TGS 흐름과 kinit/klist 검증을 정리했습니다.
암호학: Kerberos KDC 기반 키 분배 방식
Kerberos는 비밀번호를 네트워크에 직접 보내지 않고, 중앙의 KDC(Key Distribution Center)가 ticket과 session key를 발급해 client와 service가 서로 인증하도록 만드는 프로토콜이다. 설명의 A, B, KDC, master key, session key 흐름은 Kerberos의 기본 키 분배 구조를 이해하는 데 좋은 출발점이다.
구성 요소
| 요소 | 역할 |
|---|---|
| Client A | 서비스 B에 접근하려는 사용자 또는 프로그램 |
| Service B | 접근 대상 서비스 |
| KDC | Authentication Server와 Ticket Granting Server 역할 |
| Master key | KDC가 각 principal과 공유하는 장기 key |
| Session key | 특정 통신 세션에 사용하는 임시 key |
표기 정리
| 표기 | 의미 |
|---|---|
Eka[...] | A와 KDC가 공유하는 key로 보호된 데이터 |
Ekb[...] | B와 KDC가 공유하는 key로 보호된 데이터 |
Esk[...] | session key SK로 보호된 데이터 |
T | nonce 또는 timestamp 성격의 신선도 확인 값 |
1. A가 KDC에 service key 요청
A -> KDC:
Request || ID(A) || A || BA는 B와 통신하기 위한 session key를 KDC에 요청한다. 여기서 KDC는 A와 B가 등록된 principal인지 확인한다.
2. KDC가 A와 B를 위한 값 생성
KDC -> A:
Eka[ SK || ID(B) || T ]
KDC -> B 또는 A가 B에게 전달할 ticket:
Ekb[ SK || ID(A) || T ]A는 자기 master key로 보호된 부분을 풀어 session key와 대상 B 정보를 얻는다. B를 위한 ticket은 B의 key로 보호되어 있으므로 A가 내용을 임의로 바꿀 수 없어야 한다.
3. A가 B에게 authenticator 전달
A -> B:
Ekb[ SK || ID(A) || T ] || Esk[ ID(A) || T ]B는 자신의 master key로 ticket을 풀어 session key를 얻고, 그 session key로 authenticator를 확인한다. 이때 A의 신원과 timestamp 또는 nonce가 맞아야 한다.
4. B가 A에게 응답
B -> A:
Esk[ ID(B) || f(T) ]실습에서 T+1은 실제 숫자 1을 더한다는 뜻보다, 미리 약속된 변환을 적용해 상대가 같은 session key를 알고 있음을 증명한다는 의미로 이해하는 편이 좋다.
실제 Kerberos 흐름과 연결
실제 Kerberos V5는 보통 두 단계로 본다.
- AS exchange: client가 KDC에서 TGT(Ticket Granting Ticket)를 받는다.
- TGS exchange: client가 TGT를 사용해 특정 service ticket을 받는다.
Linux client에서 확인하는 명령
이미 Kerberos realm과 client 설정이 되어 있는 환경에서는 다음 명령으로 ticket 흐름을 볼 수 있다.
kinit user01@LAB.LOCAL
klist
kvno host/server01.lab.local
klist -e
kdestroy
klist