🔑 SPN (Service Principal Name)
SPN (Service Principal Name)은 Kerberos 인증 프로토콜을 사용하는 환경, 특히 Windows Active Directory (AD) 도메인 내에서 특정 서비스 인스턴스를 고유하게 식별하는 데 사용되는 이름입니다.
SPN은 클라이언트가 서비스를 이용하려고 할 때, 해당 서비스가 어떤 보안 주체(Security Principal, 즉 계정) 하에서 실행되고 있는지 Kerberos KDC (Key Distribution Center)에 알리는 역할을 수행합니다. 이는 마치 '서비스의 신분증'과 같으며, SSO (Single Sign-On)와 상호 인증(Mutual Authentication)을 구현하는 데 있어 가장 핵심적인 보안 메커니즘입니다.
1. 배경 및 개념 정의
1.1. 배경: 서비스 인증의 필요성
- 사용자 인증과 서비스 인증의 분리: AD 환경에서 클라이언트(사용자)가 서버에 접속할 때, Kerberos는 클라이언트의 신원(ID)뿐만 아니라 클라이언트가 접속하려는 서비스의 신원(ID)도 확인해야 합니다.
- SPN의 역할: SPN은 서버의 서비스가 유효하고 신뢰할 수 있는 계정에서 실행되고 있음을 보장하여, 클라이언트가 잘못된 서버(예: 중간자 공격자)에 연결되는 것을 방지합니다.
1.2. 개념 정의
| 구분 | 설명 |
|---|
| 풀네임 | Service Principal Name |
| 정의 | Kerberos 기반 네트워크에서 특정 서비스 인스턴스를 고유하게 식별하는 식별자입니다. |
| 저장 위치 | 서비스가 실행되는 사용자 계정 또는 컴퓨터 계정의 속성(servicePrincipalName Attribute)으로 AD에 저장됩니다. |
| 핵심 목적 | 클라이언트의 요청에 대해 KDC가 해당 서비스에 대한 Kerberos 티켓(Service Ticket)을 발급할 수 있도록 하는 기준 제공. |
2. SPN의 포맷 및 구성 요소
SPN은 표준화된 포맷을 가지며, 일반적으로 두 가지 유형이 존재합니다.
2.1. SPN 일반 포맷
SPN은 다음과 같은 세 부분으로 구성됩니다.
ServiceClass/HostName:Port/ServiceName
| 구성 요소 | 설명 | 예시 |
|---|
| ServiceClass | 서비스의 유형 (예: 웹 서비스는 HTTP, LDAP 서비스는 LDAP, SQL 서비스는 MSSQLSvc) | HTTP |
| HostName | 서비스를 제공하는 서버의 FQDN 또는 NetBIOS 이름 | webserver01.corp.local |
| Port (선택적) | 서비스가 실행되는 포트 번호 (표준 포트가 아닐 경우 명시) | 8080 (표준 포트인 80/443은 생략 가능) |
2.2. SPN 두 가지 유형
- 호스트 기반 SPN (Host-based SPN): FQDN을 사용하여 서버를 식별합니다. (대부분의 서비스에 사용됨)
- 예시:
HTTP/webserver01.corp.local
- 사용자/서비스 기반 SPN (User/Service-based SPN): 특정 명명된 인스턴스에 사용됩니다.
- 예시:
MSSQLSvc/dbserver:1433
3. 작동 원리: Kerberos 인증에서의 역할
SPN은 Kerberos 5단계 인증 프로세스 중 티켓 요청(Ticket Request) 단계에서 결정적인 역할을 합니다.
3.1. SPN 기반 티켓 요청 흐름
- 클라이언트 서비스 요청: 클라이언트가 특정 서비스(예:
webserver01의 HTTP 서비스)에 접근하려고 시도합니다.
- SPN 생성: 클라이언트는 접속하려는 서버와 서비스 정보를 바탕으로 접근 대상 SPN을 생성합니다. (예:
HTTP/webserver01.corp.local)
- TGS 요청: 클라이언트는 이미 발급받은 TGT (Ticket-Granting Ticket)를 첨부하여 TGS (Ticket-Granting Service)에 서비스 티켓(Service Ticket)을 요청합니다. 이때 요청 메시지 안에 생성된 SPN이 포함됩니다.
- SPN 검색 및 티켓 발급 (KDC의 역할):
- KDC는 AD 데이터베이스 내의 모든 컴퓨터/사용자 계정 속성에서 클라이언트가 요청한 SPN이 등록된 계정(
servicePrincipalName Attribute)을 검색합니다.
- 검색 성공 시: KDC는 해당 SPN이 등록된 계정의 비밀 키를 사용하여 서비스 티켓을 암호화하고 클라이언트에게 발급합니다.
- 검색 실패 시: 인증 실패. (클라이언트가 요청한 서비스를 제공하는 서버를 찾을 수 없거나, 서버의 신원이 확인되지 않음)
- 서비스 사용: 클라이언트는 이 서비스 티켓을 서비스 서버에 제시하여 상호 인증을 완료하고 서비스에 접근합니다.
4. 기술사적 판단: SPN의 중요성 및 관리
4.1. 관리의 중요성: SPN 충돌과 미등록 문제
- SPN 충돌 (Conflict): 두 개 이상의 계정에 동일한 SPN이 등록되는 경우를 말합니다. KDC는 충돌 SPN 중 어떤 계정을 사용해야 할지 결정할 수 없어 인증 실패(Kerberos Error)가 발생합니다. AD 환경에서 가장 흔한 Kerberos 인증 문제의 원인입니다.
- SPN 미등록 (Missing SPN): 필요한 SPN이 서비스 계정에 등록되어 있지 않은 경우, KDC가 해당 서비스에 대한 티켓을 발급할 수 없어 서비스 접근 자체가 불가능해집니다.
4.2. 기술적 해결 및 보안 전략
- 권한 최소화 (Principle of Least Privilege): SPN을 등록/수정하는 명령어(
setspn)는 도메인 관리자에게만 권한이 있지만, 특정 서비스 계정에는 자체 SPN을 관리할 수 있는 위임 권한을 최소한으로 부여해야 합니다.
- 서비스 계정 분리: 웹 서버, 데이터베이스 서버 등 중요 서비스는 개별적인 사용자 계정(Service Account)을 생성하여 실행하고, 해당 계정에 필요한 SPN만 등록하여 보안 경계를 명확히 해야 합니다. LocalSystem 또는 NetworkService 계정을 사용하면 자동 등록되지만, 보안 관리 측면에서는 권장되지 않습니다.
- Delegation (위임)과의 연관성: SPN은 Kerberos 위임(Delegation)을 설정하는 데 필수적입니다. 특히, 제한된 위임 (Constrained Delegation)은 서비스 티켓을 발급받을 수 있는 목표 SPN을 명시적으로 지정하여 보안을 강화합니다.
5. 요약 및 미래 방향성
SPN은 AD 기반 SSO의 근간이며, Kerberos 인증의 견고함을 책임지는 보안 식별자입니다. SPN의 정확한 등록 및 충돌 관리는 대규모 IT 인프라에서 서비스의 가용성(Availability)과 보안(Security)을 유지하는 핵심 관리 영역입니다.
클라우드 환경에서는 Azure Active Directory (Azure AD)가 OAuth 2.0 및 OpenID Connect를 주로 사용하지만, 온프레미스 AD와 연동되는 하이브리드 환경에서는 레거시 애플리케이션에 대한 Kerberos 인증이 여전히 중요하므로, SPN 관리 기술은 IT 전문가에게 필수적입니다.