Kerberos Delegation이란?
개념
- Kerberos Delegation(이하 커버로스 위임)은, 프론트엔드 서비스(웹 서버 등)이 클라이언트를 대신해 백엔드 서비스(DB 서버 등)에 인증하고 접근하기 위해 설계된 인증 방식이다.
- 간단히 요약하면,
서버A가사용자(클라이언트)를 대신해백엔드 서버B에게 인증을 하기 위해 도입된 개념이다.
이게 왜 필요한가?
- 사용자(클라이언트)가
WEB01서버를 통해 백엔드 DB서버인FS01를 이용한다고 가정해 보자. - 사용자는 자신의 자격 증명을
WEB01서버에 전달한다. - 이 때 기본적으로
Kerberos인증은 보안을 위해 인증 정보가 다단계로 전달되는 것을 허용하지 않는다. - 즉, 사용자의 인증 정보가 첫 번째 서버(
WEB01)까지만 전달되므로,WEB01은 사용자의 자격으로FS01에 접근할 수 없다.(Double Hop 문제) - 이 문제를 해결하기 위해 커버로스 위임 개념이 만들어졌다. 커버로스 위임이 설정되어 있으면,
WEB01은 사용자를 대신해FS01에 대한 서비스 티켓을 요청하고 인증을 수행할 수 있다.
커버로스 위임(Kerberos Delegation) 방식
- 커버로스 위임 설정 상태는 다음과 같이 구분할 수 있다.
- None : 위임 사용 안함
- Unconstrained Delegation(UD) : 무제한 위임
- Constrained Delegation(CD): 제한적 위임 + Protocol Transition 확장
- Resource Based Contrained Delegation (RBCD) : 리소스 기반 제한적 위임
- 위 내용들은 전부
DC의 데이터베이스,NTDS.dit에 각 객체의 속성으로 저장되고 설정되는 내용들이다. - 하지만, 각 방식마다 설정하는 대상 객체가 다르다
- None, UD, CD : 프론트엔드 서버 객체의 속성에서 설정함
- RBCD : 백엔드 서버 객체의 속성에서 설정함
- None과 UD를 제외하고는 모두 독립적인 속성들이기 때문에, 동시에 설정할 수 있다. (즉, 어떤 호스트는 UD이면서 RBCD일 수도 있고, 어떤 호스트는 CD이면서 RBCD일수도 있다)
None (위임 없음)
설정
- 대상 객체(서버)의 속성
userAccountControl의 값들 중TRUSTED_FOR_DELEGATION = False로 설정된 경우, 위임 관련 속성이 없음(None)이라고 본다.
의미
- 이 호스트(서버 객체)는 다른 서비스에 사용자를 대신해서 서비스 티켓을 요청할 수 없다.
- TGT가 호스트의 메모리(
LSASS)에 캐싱되어 저장되지 않는다.
Unconstrained Delegation (UD, 무제한 위임)
설정
- 대상 객체(서버)의 속성
userAccountControl의 값들 중TRUSTED_FOR_DELEGATION = True로 설정된 경우, 무제한 위임(UD) 설정이라고 본다. (실제론 True, False가 아니라0x80000같은 값으로 저장된다.)
의미
- 이 호스트(서버 객체)는 다른 모든 서비스에 사용자를 대신해서 서비스 티켓을 요청할 수 있다.
- 이 호스트(서버)는 사용자가 인증을 했을 때, 그 TGT 티켓을 서버의 메모리,
LSASS에 캐싱해서 저장한다.
Constrained Delegation (CD, 제한적 위임)
설정
- 대상 객체(서버)의 속성
msDS-AllowedToDelegateTo에 특정 서비스(SPN)가 등록된 객체 - Protocol Transition(S4U2Self)까지 허용하려면,
TRUSTED_TO_AUTH_FOR_DELEGATION플래그가 추가로 필요하다.
의미
- 이 호스트는
msDS-AllowedToDelegateTo에 명시된 특정 서비스에 한해서 사용자를 대신해 서비스 티켓을 요청할 수 있다. - 호스트(서버)의 메모리,
LSASS에 TGT 티켓이 캐싱되어 저장되지 않는다. - 사용자의 TGT 없이도 delegation을 수행하기 위해,
S4U2Self / S4U2Proxy개념이 새로 등장한다
Resource Based Contrained Delegation (RBCD, 리소스 기반 제한적 위임)
설정
- 대상 객체(리소스 서버/백엔드 서비스)의 속성
msDS-AllowedToActOnBehalfOfOtherIdentity에 계정 목록을 등록하여 설정
의미
- 이 호스트는
msDS-AllowedToActOnBehalfOfOtherIdentity에 명시된 계정들이 나(호스트)한테 커버로스 위임하는 것을 특별히 허용한다. (특별 장부)
커버로스 위임 설정 예시
DC의 NTDS.dit 예시를 보자. (플래그는 이해를 위해 True, False로 표기하였다. 실제론 0x80000같은 값으로 저장된다.)
호스트 객체들 WEB01$, FS01$, FS02$, WK01$가 존재하며
도메인 사용자 계정은 John, Sarah가 존재하고
(John, Sarah는 SPN이 등록된 서비스 계정이라고 가정)
도메인은 domain.local 이라고 가정한다.
WEB01$ - 호스트 객체
userAccountControl - 속성
TRUSTED_FOR_DELEGATION = True
msDS-AllowedToDelegateTo
NULL
msDS-AllowedToActOnBehalfOfOtherIdentity
NULL
-> 다른 모든 객체에 커버로스 위임을 요청할 수 있다 (UD 설정됨)
-> 내(WEB01$)가 신뢰하는 커버로스 위임 특별 대상도 없다. (RBCD 설정 안됨)
FS01$ - 호스트 객체
userAccountControl - 속성
TRUSTED_FOR_DELEGATION = False
msDS-AllowedToDelegateTo
NULL
msDS-AllowedToActOnBehalfOfOtherIdentity
NULL
-> FS01$은 다른 모든 객체에 커버로스 위임을 요청할 수 없다 (None)
-> CD 설정도 명시된 게 없으므로, FS01$은 그 어떤 서비스에 대해서든 커버로스 위임요청을 할 수 없다.
-> RBCD 대상 객체도 명시된 게 없다.
FS02$ - 호스트 객체
userAccountControl - 속성
TRUSTED_FOR_DELEGATION = False
msDS-AllowedToDelegateTo
cifs/FS01.domain.local
msDS-AllowedToActOnBehalfOfOtherIdentity
WK01$
John
-> FS02$은 UD는 설정되어 있지 않지만, CD가 설정되어 있다.
-> FS02$은 cifs/FS01.domain.local 서비스에 한해서 커버로스 위임 요청을 수행할 수 있다.
-> FS02$은 WK01$,John이 자신에게 커버로스 위임 요청을 허용한다. (실제 티켓 발급 여부는 KDC의 최종 검증을 거친다.)
WK01$ - 호스트 객체
userAccountControl - 속성
TRUSTED_FOR_DELEGATION = True
msDS-AllowedToDelegateTo
cifs/FS02.domain.local
msDS-AllowedToActOnBehalfOfOtherIdentity
Sarah
-> WK01$는 다른 모든 객체에 커버로스 위임을 할 수 있다 (UD 설정됨)
-> WK01$는 cifs/FS02.domain.local에게 커버로스 위임을 할 수 있다 (CD 설정됨). 하지만 이미 더 폭넓은 제약인 UD가 설정되었기 때문에 의미는 없다.
-> WK01$는 Sarah가 자신에게 커버로스 위임 요청하는 것을 허용한다. (실제 티켓 발급 여부는 KDC의 최종 검증을 거친다.)FS01$ -> WK01$을 보면,FS01$은 기본적으로 커버로스 위임이 불가능하지만 대상 호스트WK01$에서 자신(FS01$)을 신뢰하기 때문에, 커버로스 위임이 가능하다. 이것이RBCD이다.