Kerberos(커버로스)

Kerberos 인증

Kerberos 인증

Kerberos(커버로스) 인증이란, 네트워크 인증 방식 중 하나이며 서버와 클라이언트 간의 신원 확인을 위해 사용하는 프로토콜이다.
Kerberos는 클라이언트와 서버를 상호 인증 할 수 있을 뿐만 아니라 데이터 보존을 위해 클라이언트와 서버 간의 통신을 암호화 한다.
커버로스(Kerberos) SSO(Single Sign-On)의 일종이며, 여러 시스템의 접근 관리 기능을 제공한다.
Kerberos 버전 5 가 주로 사용되어, Kerberos는 “KRB5"라고도 한다.

Kerberos는 Windows Server Active Directory 사용자 인증에 사용되는 프로토콜로 유명하다.
Active Directory는 단일 서비스가 아니라 주요 기능만으로도 세 가지 프로토콜을 사용한다.

Kerberos 인증 구성 요소
Kerberos 인증 구성 요소

Active Directory를 통한 주요 서비스 사용할 프로토콜
사용자 인증 Kerberos 버전 5
디렉터리 서비스 LDAP 버전 3
파일 공유 SMB 버전 1.0 / 2.x / 3.0

Kerberos 인증의 구성 요소

Kerberos 인증을 이해하기 위해, 용어 “KDC, AS, TGS, Principal, Realm"에 대해 소개한다. 

Kerberos 용어 설명
KDC (Key Distribution Center) 서버와 사용자에 대한 신뢰 관계 정보를 일괄 관리하는 중앙 데이터베이스
AS (Authentication Server) 인증 서버. 사용자로부터 인증을 수락하는 서버
TGS (Ticket Granting Server) 티켓 발급 서버. 각 서버를 이용하기 위한 티켓을 발급하는 서버
Principal KDC가 인증하는 사용자 및 서버
Realm) 동일한 KDC 아래의 시스템을 그룹으로 정의하는 논리 네트워크

AD 인증은 Kerberos 프로토콜로 수행되고, AD의 도메인 컨트롤러는 Kerberos적으로는 KDC로서 기능을 한다.

Kerberos 인증의 흐름

Kerberos 인증에서는 사용자가 올바른 사용자 ID와 패스워드를 AS(Authentication Server)에 송신하여, 인증에 성공하면 TGS(Ticket Granting Server)로부터 티켓 이라고 불리는 데이터를 받는다. 켈베로스 인증은 이 티켓을 인증에 사용한다.

서버는 사용자 ID와 암호가 아닌 티켓 (클라이언트 ID, 타임 스탬프 및 만료 포함)을 사용하여 액세스하는 사용자가 액세스 권한을 가지고 있는지 여부를 확인한다. 인증 시 티켓을 사용하여 계정(사용자 ID, 비밀번호) 유출을 방지한다.

Kerberos 인증 흐름
Kerberos 인증 흐름

Kerberos 인증은 티켓 도청으로 인한 스푸핑을 방지하기 위해 시간 동기화 메커니즘을 제공한다.
티켓 안에는 타임 스탬프(송신 시간)가 기록되어 있다. 티켓을 수신한 서버가 티켓의 타임스탬프와 서버가 가지는 시간과 5분 이상(AD의 경우)의 어긋남이 있으면 인증에 실패하게 되어 있다.
따라서, NTP를 사용하여 티켓 발행측의 시계와 티켓 이용측의 시계의 시간이 같아지도록 한다.

커버로스 프로토콜의 단점

  • 커버로스 서버는 하나이기 때문에 서버가 장애가 발생하면, 새로운 유저는 로그인할 수가 없다. 따라서, 여러 개의 서버를 운용하는 등 서버가 작동하지 않을 때를 대비할 수 있는 메커니즘을 구현해야 한다.
  • 요청 시간에 대한 요구가 엄격하다(통상적으로 5분). 만약 요청을 주고받는 호스트들 간에 시간 동기화가 되어있지 않을 경우 통신이 불가능하다.

커버로스 초기 설정

클라이언트의 설정으로 Kerberos 인증을 수행하려면 kinit 명령을 사용한다.

CentOS의 yum으로 설치하는 명령은 아래와 같다.

$ yum install -y krb5-workstation krb5-libs

설치가 완료되면 kinit를 사용할 수 있게 된다.

KDC 등의 클라이언트측의 설정은 krb5.conf로 설정한다.

/etc/krb5.conf

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = EXAMPLE.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 allow_weak_crypto = true

[realms]
  EXAMPLE.COM = {
  kdc = kdc.example.com.:88
  admin_server = kdc.example.com
  default_domain = example.com
 }

[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM

도메인이나 영역, 디폴트의 설정 등을 확인할 수 있다.

커버로스 명령

kinit 명령 (Password 사용)

kinit 명령은 실행하고, 패스워드를 입력하면 인증을 통과할 수 있다.

$ kinit

klist 명령으로는 발급받은 티켓을 확인할 수 있다.

$ klist

주요 옵션은 아래와 같다

  • -l : 목록 표시
  • -A : 모두 표시

티켓에는 기한이 설정되어 있어 24h로 실효하는 케이스가 많다. 티켓을 폐기하려면, kdestroy 명령을 입력한다.

$ kdestroy

kinit 명령 (keytab 사용)

kinit에는 또 하나의 keytab을 사용한 방법이 있다. keytab이란 암호화된 키 페어 등의 인증 정보가 포함된 파일로, 사전에 이것을 작성하면 암호 입력 대신 사용할 수 있다.

$ kinit -Vkt ${keytab_path}/hoge.keytab <user>@<realm>

-kt라는 옵션을 붙여 그 후에 keytab의 path를 넣으면 keytab을 사용한 인증을 해준다.

상세하게는 아래와 같다.

  • k: keytab을 사용하는 옵션
  • t: keytab을 사용할 때 filename을 나중에 지정하는 옵션

그런데, 세트로 기억해 두는 것이 좋다고 생각된다.

-V는 verbose(상세)라는 의미로, 붙여 넣으면 상세한 결과를 여러가지 출력해 준다.

마지막으로 (인증하려는 사용자 이름)@(realm) 형식으로 입력한다. @이하를 생략하면 디폴트 realm이 적용된다.

캐시

kinit에는 다른 -c옵션이 있으며, 이것을 지정하면 캐시의 이름을 지정할 수 있다. 캐쉬는 디폴트라고 krb5cc_<uid>와 같은 이름으로 보존되어 매번 그 캐쉬를 읽으러 가는 것으로 인증이 가능하게 된다. 캐시의 이름은 KRB5CCNAME 환경 변수로 지정할 수 있다.

export KRB5CCNAME='DIR:/tmp/krb/

여기서 DIR:을 붙이는 것으로 디렉터리를 지정할 수도 있다. 이렇게 하면 디렉터리 내부에 여러 캐시를 준비하고 인증을 구분할 수 있다.
반대로 특별한 일을 하지 않는다면 특히 신경쓰지 않고 디폴트의 캐쉬를 사용하면 편하다.




최종 수정 : 2024-03-09