Windows 도메인 네트워크 인증 프로토콜
Windows 도메인을 사용할 때 모든 자격증명은 Domain Controller(DC)에 저장된다. 사용자가 도메인 자격증명을 사용하여 서비스에 인증하려고 할 때마다, 서비스는 도메인 컨트롤러에 자격증명이 올바른지 확인하도록 요청한다.
Windows 도메인에서 네트워크 인증에는 다음 두 가지 프로토콜을 사용할 수 있다.
Kerberos
Kerberos는 최신 버전 Windows에서 사용되는 인증 프로토콜로, 최신 도메인에서 디폴트로 설정되어 있다.
Kerberos의 방식은 Needham-Schroeder (NS) 프로토콜에서 영감을 받았다.
Needham-Schroeder protocol
Needham-Schroeder 프로토콜은 신뢰된 서버를 사용하는 프로토콜 중 하나로 잘 알려져 있다.
1978년에 개발되었으며, 키 교환에서 매우 중요한 프로토콜이다.
A는 서버 S에 A의 아이디, B의 아이디, $N_A$ 라는 A의 nonce값을 전송한다.
서버 S는 $K_{AS}$ 로 대칭키 암호화하여, $N_A$, B의 아이디, AB의 세션키 $K_{AB}$, 그리고 $K_{BS}$로 A의 아이디와 $K_{AB}$ 를 암호화 한 값을 전송한다.
A는 $K_{AS}$를 통해 세션키 $K_{AB}$를 얻을 수 있고, $SKE_{K_{BS}}(K_{AB}, A)$ 는 그대로 전송한다.
B는 $K_{BS}$를 통해 이를 복호화하여 $K_{AB}$와 A의 아이디를 확인할 수 있다.
이후, B는 A에게 세션키 $K_{AB}$를 잘 가지고있음을 확인하고자 $N_B$를 암호화하여 보내고
A는 $K_{AB}$로 $N_B-1$을 전송하여 서로 세션키를 확인할 수 있게 된다.
해당 Needham-Schroeder 프로토콜에서는 B의 입장에서 $K_{AB}$의 freshness가 보장되지 않는다는 문제가 존재한다.
Kerberos 동작 과정
이에 Kerberos에서는 timestamp와 lifetime을 사용하여 이를 해결하였다.
사용자는 이름과 타임스탬프를 Key Distribution Center(KDC)로 보낸다. KDC는 Windows 도메인 네트워크에서 Domain Controller에 설치되는 서비스가 된다.
KDC는 Ticket Granting Ticket(TGT)를 생성하여 사용자에게 보낸다. 이때 세션 키(TGS 세션키)도 함께 제공한다.
TGT는 krbtgt 계정의 비밀번호 해시를 사용하여 암호화된다. TGT에는 유저 아이디, 세션키가 들어있다.
사용자가 네트워크 서비스에 연결하려고 할 때, TGT를 사용하여 KDC에 Ticket Granting Service(TGS)를 요청해야 한다. TGS를 요청하려면 TGT, Service Principal Name (SPN), 세션 키로 암호화된 사용자 이름, 타임 스탬프를 보내야 한다.
SPN은 액세스하려는 서비스, 서버 이름을 나타낸다. 위 그림에서는 MSSQL 서비스, SRV 서버에 접근하려고 나타낸다.
TGS를 요청하면 KDC는 서비스 세션 키, TGS를 보낸다. 이는 서비스 소유자 해시에서 파생된 키를 사용하여 암호화된다. TGS에는 서비스 세션 키가 들어있다.
이후, TGS를 원하는 서비스로 보내어 인증하고 연결을 설정한다. 서비스는 Owner Hash를 이용하여 TGS를 해독하고 서비스 세션 키를 검증한다.
NetNTLM(NT LAN Manager)
NetNTLM은 호환성을 위해 유지되는 레거시 인증 프로토콜이다. Challenge-response authentication 메커니즘을 사용하여 작동한다.
- 클라이언트가 액세스하고자 하는 서버에 인증 요청을 보낸다.
- 서버에서는 난수를 생성하여 클리어인트에게 Challenge로 전송한다.
- 클라이언트는 NTLM 비밀번호 해시를 Challenge와 결합하여 서버로 보낸다.
- 서버는 Domain Controller에 전달한다.
- DC에서는 전달 받은 Challenge와 알고 있는 NTLM 비밀번호 해시를 가지고 계산해보고, 전달 받은 Response와 비교한다. 인증 결과를 서버에 전송한다
- 서버는 클라이언트에 인증 결과를 전송한다.
보다 정확히는 다음과 같이 response를 구성한다.
SC = 8-byte server challenge, random
CC = 8-byte client challenge, random
CC* = (X, time, CC2, domain name)
v2-Hash = HMAC-MD5(NT-Hash, user name, domain name)
LMv2 = HMAC-MD5(v2-Hash, SC, CC)
NTv2 = HMAC-MD5(v2-Hash, SC, CC*)
response = LMv2 | CC | NTv2 | CC*
NT 해시는 Security Account Manager(SAM) 또는 Active Directory(AD)에 저장되어있으며, 위에서 언급한 NTLM 비밀번호 해시는 보다 쉬운 이해를 위하여 사용된 용어이다.