Apache, Nginx 등 많은 Linux 서비스는 keytab(키 탭) 파일을 활용하면 비밀번호를 직접 입력하지 않고도 Active Directory에서 Kerberos 인증을 수행할 수 있습니다. keytab 파일에는 Kerberos 주체(principal) 이름과 이에 대응하는 암호화된 키(Kerberos 비밀번호에서 파생됨)가 저장됩니다. 이 글에서는 ktpass 도구를 사용해 Active Directory 계정에 연결된 SPN의 keytab 파일을 만드는 과정을 단계별로 살펴봅니다.
1. 서비스 계정 생성
keytab 파일이 필요한 서비스에는 일반적으로 별도의 AD 사용자 계정을 만들어 할당하지만, 컴퓨터 개체(computer object)를 사용할 수도 있습니다. 이때 서비스 이름은 계정에 바인딩되며 이를 SPN(ServicePrincipalName)이라고 합니다. Kerberos 인증은 SPN을 통해 서비스 인스턴스를 AD 계정에 매핑하기 때문에, 애플리케이션은 사용자 이름을 몰라도 서비스 자격으로 인증할 수 있습니다.
먼저 AD에서 서비스 계정을 생성하고 비밀번호를 설정합니다. ADUC 콘솔(dsa.msc)의 그래픽 인터페이스 또는 PowerShell Active Directory 모듈의 New-ADUser cmdlet을 사용할 수 있습니다.
New-ADUser -Name "web" -GivenName "nginx web app" -SamAccountName "web" -UserPrincipalName "web@test.com" -Path "OU=Services,OU=Munich,OU=DE,DC=test,DC=com" –AccountPassword (ConvertTo-SecureString "Sup6r!Pa$s" -AsPlainText -force) -Enabled $true
서비스 계정에는 반드시 '사용자가 암호를 변경할 수 없음'과 '암호 만료 없음' 옵션을 활성화하세요. 그래픽 콘솔 또는 PowerShell에서 설정할 수 있습니다.
Get-ADUser web | Set-ADUser -PasswordNeverExpires:$True -CannotChangePassword:$true

2. SPN을 계정에 바인딩
다음 단계는 서비스 주체 이름(SPN)을 사용자 계정에 바인딩하는 것입니다. 참고로 이 작업은 생략해도 됩니다. ktpass가 keytab 파일을 생성할 때 자동으로 처리하기 때문입니다. 여기서는 전체 흐름에 대한 이해를 돕기 위해 수동으로 진행해 보겠습니다.
web 계정에 다음과 같이 SPN 레코드를 바인딩합니다.
setspn -A HTTP/www.test.com@test.com web
AD 사용자와 연결된 SPN 레코드 목록은 아래 명령으로 확인할 수 있습니다.
setspn -L web

3. ktpass로 keytab 파일 생성
keytab 파일은 다음 명령으로 생성합니다.
ktpass -princ HTTP/www.test.com@TEST.COM -mapuser web -crypto ALL -ptype KRB5_NT_PRINCIPAL -pass Sup6r!Pa$s -target mundc01.test.com -out c:\share\web.keytab

Successfully mapped HTTP/www.test.com to web.
Password successfully set!
Key created.
Output keytab to c:\share\webt.keytab:
Keytab version: 0x502
keysize 53 HTTP/www.test.com@test.com ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x1 (DES-CBC-CRC) keylength 8 (0x73f868856e046449)
이 명령을 실행하면 HTTP/www@test.com 서비스의 SPN 레코드에 대한 keytab 파일(c:\share\web.keytab)이 생성되며, 지정된 비밀번호로 web 계정에 바인딩됩니다.
SPN을 수동으로 생성하지 않았다면, 레코드가 정상적으로 만들어졌는지 아래 명령으로 확인합니다.
setspn -Q */www.test.com@test.com
실행 결과에서 SPN 레코드가 검색되고(Existing SPN found!), web 계정에 바인딩된 것을 확인할 수 있습니다.

4. keytab 파일 내용 확인
Windows에는 keytab 파일 내용을 조회하는 기본 도구가 없습니다. 하지만 Java JRE가 설치되어 있다면 Java 배포판에 포함된 klist.exe를 활용할 수 있습니다.
cd "c:\Program Files\Java\jre1.8.0_181\bin"
klist.exe -K -e -t -k c:\PS\web_host.keytab
Key tab: c:\PS\web_host.keytab, 5 entries found.

keytab 파일 내용에는 SPN, 키 값, 타임스탬프, 암호화 알고리즘, 그리고 키 버전 번호(KVNO — Key Version Number)가 포함되어 있습니다.
5. KVNO와 비밀번호 변경 시 주의사항
keytab 파일을 생성하면 ktpass는 해당 사용자 계정의 msDS-KeyVersionNumber 특성 값을 증가시키고(AD 특성 편집기에서 확인 가능), 이 값을 keytab 테이블의 KVNO로 사용합니다.

계정 비밀번호를 변경하면 이 특성 값이 1 증가하며, 기존 KVNO를 사용하는 모든 keytab 항목은 무효화됩니다. 새 비밀번호가 이전 비밀번호와 완전히 동일하더라도 마찬가지입니다. 따라서 AD에서 계정 비밀번호가 변경되었다면 keytab 파일을 반드시 다시 생성해야 합니다.
6. 여러 SPN 추가와 보안 유의사항
하나의 keytab 파일에는 여러 SPN의 키를 함께 저장할 수 있습니다. ktpass의 매개변수(-in, -setupn, -setpass)를 사용하면 기존 파일에 SPN과 키를 추가할 수 있습니다.
생성한 keytab 파일의 활용 방법은 적용 대상 서비스에 따라 달라집니다. 예를 들어 Zabbix에서 투명한 SSO 사용자 인증을 구현할 때 keytab 파일을 활용할 수 있습니다. 무엇보다 keytab 파일 보안 관리에 유의해야 합니다. 파일 내용을 읽을 수 있는 사람이라면 누구나 그 안에 담긴 키를 그대로 사용할 수 있기 때문입니다.