"KDC 를 두 개 넣는다" 는 말에는 성격이 다른 두 가지가 섞여 있다.
| 상황 | 설정 위치 |
|---|---|
| 한 realm 에 KDC 가 여러 대 — 이중화 | [realms] 안에 kdc 줄을 여러 개 |
| realm 자체가 둘 — 서로 다른 인증 영역 | [realms] 에 블록을 둘, [domain_realm] 에 매핑 추가 |
[libdefaults] 에는 KDC 를 적지 않는다. 여기는 기본값을 두는 곳이고, KDC 주소는 realm 마다 정해진다.
[realms]
EXAMPLE.COM = {
kdc = kdc1.example.com
kdc = kdc2.example.com
admin_server = kdc1.example.com
}
클라이언트는 위에서부터 순서대로 시도하고, 응답이 없으면 다음으로 넘어간다. 부하 분산이 아니라 장애 대비다.
기존 설정을 지우지 않고 블록을 더한다. realm 이름은 관례상 대문자로 쓰고, 이름이 겹치지만 않으면 충돌하지 않는다.
[libdefaults]
default_realm = AD.EXAMPLE.COM
dns_lookup_realm = false
dns_lookup_kdc = true
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
udp_preference_limit = 1
[realms]
AD.EXAMPLE.COM = {
kdc = dc01.ad.example.com
kdc = dc02.ad.example.com
admin_server = dc01.ad.example.com
}
HADOOP.EXAMPLE.COM = {
kdc = kdc1.hadoop.example.com
kdc = kdc2.hadoop.example.com
admin_server = kdc1.hadoop.example.com
}
[domain_realm]
.ad.example.com = AD.EXAMPLE.COM
ad.example.com = AD.EXAMPLE.COM
.hadoop.example.com = HADOOP.EXAMPLE.COM
hadoop.example.com = HADOOP.EXAMPLE.COM
default_realm 은 realm 을 생략한 프린시펄이 어디에 속하는지 정한다. kinit user 라고만 치면 user@<default_realm> 이 된다.
따라서 이 값을 바꾸면 다음이 함께 흔들린다.
kinit -kt 는 대개 괜찮지만, 이름만 쓰는 곳은 깨진다.auth_to_local 규칙. 기본 realm 의 사용자만 짧은 이름으로 변환하도록 돼 있는 경우가 많아, 기본 realm 이 바뀌면 다른 realm 사용자가 매핑되지 않는다.바꾸기 전에 어느 쪽이 주된 인증 영역인지 정하고, 나머지는 항상 FQDN 형태의 프린시펄로 쓰도록 통일하는 편이 안전하다.
[domain_realm] 은 호스트 이름을 realm 에 연결한다. 클라이언트가 host/web01.hadoop.example.com 같은 서비스 티켓을 요청할 때 어느 KDC 에 물어볼지를 여기서 정한다.
점으로 시작하는 줄은 해당 도메인의 하위 전체, 점 없는 줄은 도메인 자체다. 둘 다 적어야 한다.
매핑이 없으면 클라이언트는 호스트 이름의 도메인 부분을 대문자로 바꿔 realm 으로 가정한다. 도메인과 realm 이름이 다른 환경에서는 이 추측이 틀리므로 반드시 명시한다.
realm 을 둘 적어 두는 것만으로 한쪽 사용자가 다른 쪽 서비스를 쓸 수 있게 되지는 않는다. 그러려면 두 realm 사이에 신뢰 관계가 설정돼 있어야 하고, 경로가 직접 연결돼 있지 않으면 [capaths] 로 경로를 알려 준다.
[capaths]
HADOOP.EXAMPLE.COM = {
AD.EXAMPLE.COM = .
}
AD.EXAMPLE.COM = {
HADOOP.EXAMPLE.COM = .
}
. 은 중간 realm 없이 직접 연결된다는 뜻이다.
kinit user@AD.EXAMPLE.COM
klist -e
kvno host/web01.hadoop.example.com
klist -e 는 티켓의 암호화 유형까지 보여 준다. kvno 로 실제 서비스 티켓을 받아 보면 realm 매핑과 신뢰 관계까지 한 번에 검증된다.
동작이 이해되지 않을 때는 추적을 켠다.
KRB5_TRACE=/dev/stderr kinit user@AD.EXAMPLE.COM
어느 KDC 에 어떤 요청을 보냈고 무엇이 돌아왔는지 그대로 나온다. 원인을 가장 빨리 찾는 방법이다.
allow_weak_crypto = true 와 rc4-hmac 은 오래된 환경과 붙기 위한 설정이다. 필요 없다면 넣지 않는다. 최신 KDC 는 RC4 를 아예 거부하기도 한다.dns_lookup_kdc = true 로 두면 [realms] 에 적지 않은 realm 도 SRV 레코드로 찾는다. 편하지만 DNS 가 흔들리면 인증도 흔들린다. 운영에서는 명시적으로 적는 편이 예측 가능하다.udp_preference_limit = 1 은 TCP 를 우선 쓰게 한다. 티켓이 커서 UDP 로 잘리는 환경(AD 의 PAC 포함 티켓) 에서 필요하다.