YJWANG

Kerberos 설정 및 테스트 본문

01.OS-Services

Kerberos 설정 및 테스트

왕영주 2020. 8. 27. 22:59

Kerberos는 SSO를 구현하기 위해 사용하는 서비스이다.
유저가 먼저 kdc에 인증을 요청해서 tgt라는 티켓을 받게 되고 이제 이 티켓을 가지고 실제 로그인 하려는 서비스 서버 TGS에 인증 요청을 해 티켓으로 인증을 하게 되는 구조이다.

CentOS 7.X 버전에서 테스트된 내용임을 참고하자.

KDC

KDC server pre-config

만약 hostname과 fqdn이 일치하지 않는 경우라면 아래와 같이 fqdn을 /etc/hosts에 꼭 지정해주어야 한다.
ssh와 같은 서비스의 경우 TGS로서 동작할 때 key와 자체 host의 fqdn을 비교하게된다.

위와 같이 fqdn을 설정해야한다는 경고 없이 그냥 인증이 안되므로 꼭 설정해 주도록 하자.

티켓을 발행할 서버와 실제 로그인을 할 서비스를 제공하는 서버 모두 아래와 같이 설정해주자.

# cat /etc/hosts
192.168.200.70 kdc.testyj.com fastvm-centos-7-8-70
192.168.200.71 server.testyj.com fastvm-centos-7-8-71

install packages (KDC)

Kerberos서버로 사용할 서버에서 진행한다.

# yum install krb5-server krb5-libs krb5-workstation -y
# cat /etc/krb5.conf

먼저 config 파일을 수정한다 REALM은 kerberos에서 인증을 식벽하는 주체가된다.
kdc는 인증 정보 (key, user정보) 등을 가지고 있으며 tgt 티켓을 발급해 주는 서버이며 admin은 kerberos의 정보를 관리할 때 접속할 endpoint이다.

# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/

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

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
# default_realm = EXAMPLE.COM
 default_realm = TESTYJ.COM
 default_ccache_name = KEYRING:persistent:%{uid}

[realms]
# EXAMPLE.COM = {
#  kdc = kerberos.example.com
#  admin_server = kerberos.example.com
# }
TESTYJ.COM = {
 kdc = kdc.testyj.com
 admin_server = kdc.testyj.com
}

[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM
.testyj.com = TESTYJ.COM
testyj.com = TESTYJ.COM

위에서 설정한대로 아래 파일에서 REALM 정보를 수정해야한다. (kdc는 이 파일을 참조한다.)

# cat /var/kerberos/krb5kdc/kdc.conf 
[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 TESTYJ.COM = {
  #master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

만약 원격에서 즉 다른서버에서 kerberos에 접근하여 DB를 수정하고 싶은 경우 아래도 설정한다. kadmin.local만 사용하는 경우 안해도 된다.

# cat /var/kerberos/krb5kdc/kadm5.acl 
*/admin@TESTYJ.COM    *

init kerberos db

DB암호를 testtest로 kerberos db를 생성했다.

# kdb5_util create -s -P "testtest"
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'TESTYJ.COM',
master key name 'K/M@TESTYJ.COM'

firewall

인증을 받으려면 kerberos 서비스는 오픈해야하지만 kadmin은 위에서 언급한 것 처럼 local에서만 사용할 경우 option이다.

# firewall-cmd --add-service=kerberos --permanent
# firewall-cmd --add-service=kerberos
(option)# firewall-cmd --add-service=kadmin --permanent
(option)# firewall-cmd --add-service=kadmin 

service start

# systemctl enable kadmin --now
# systemctl enable krb5kdc --now
# systemctl status krb5kdc kadmin
● krb5kdc.service - Kerberos 5 KDC
   Loaded: loaded (/usr/lib/systemd/system/krb5kdc.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-08-27 22:43:29 KST; 4s ago
  Process: 9379 ExecStart=/usr/sbin/krb5kdc -P /var/run/krb5kdc.pid $KRB5KDC_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 9380 (krb5kdc)
   CGroup: /system.slice/krb5kdc.service
           └─9380 /usr/sbin/krb5kdc -P /var/run/krb5kdc.pid

Aug 27 22:43:29 fastvm-centos-7-8-70 systemd[1]: Starting Kerberos 5 KDC...
Aug 27 22:43:29 fastvm-centos-7-8-70 systemd[1]: Can't open PID file /var/run/krb5kdc.pid (yet?) after start: No such file or directory
Aug 27 22:43:29 fastvm-centos-7-8-70 systemd[1]: Started Kerberos 5 KDC.

● kadmin.service - Kerberos 5 Password-changing and Administration
   Loaded: loaded (/usr/lib/systemd/system/kadmin.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-08-27 22:43:25 KST; 8s ago
 Main PID: 9359 (kadmind)
   CGroup: /system.slice/kadmin.service
           └─9359 /usr/sbin/kadmind -P /var/run/kadmind.pid

Aug 27 22:43:25 fastvm-centos-7-8-70 systemd[1]: Starting Kerberos 5 Password-changing and Administration...
Aug 27 22:43:25 fastvm-centos-7-8-70 systemd[1]: Started Kerberos 5 Password-changing and Administration.

여기까지 하면 일단 서버는 구성 완료했다.
이제 서버에서 인증을 정상적으로 처리하는지 테스트를 해야하는데 그거려면 먼저 인증 부터 생성해야한다.

testuser1이라는 계정으로 server.testyj.com 서버에 접속할때 암호 없이 key를 통해 접속할 수 있도록 testuser1에 대한 정보를 kdc 내에 생성한다.

addprinc

# kadmin.local -q 'addprinc testuser1'
이때 암호를 입력하는데 이 암호는 testuser1에 대한 티켓 발급 시 사용된다.

# kadmin.local -q 'addprinc -randkey host/server.testyj.com'
위 명령을 통해 server.testyj.com 서버가 tgs로서 동작할 수 있게 됐다.
단, ssh의 경우 위와 같이 하는 것이고 nfs 및 다른 서비는 다르니 메뉴얼을 참고해야 한다.

# kadmin.local -q 'ktadd -k /tmp/server.keytab host/server.testyj.com'
server.testyj.com기 위에서 등록한 host키를 사용하기 위해선 keytab파일 형태로 key를 담아야 한다.

아래와 같이 확인 가능하다.
# klist -k /tmp/server.keytab 
Keytab name: FILE:/tmp/server.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 host/server.testyj.com@TESTYJ.COM
   2 host/server.testyj.com@TESTYJ.COM
   2 host/server.testyj.com@TESTYJ.COM
   2 host/server.testyj.com@TESTYJ.COM
   2 host/server.testyj.com@TESTYJ.COM
   2 host/server.testyj.com@TESTYJ.COM
   2 host/server.testyj.com@TESTYJ.COM
   2 host/server.testyj.com@TESTYJ.COM

TGS

ssh 인증을 수신할 서버에 설정을 진행한다.

(KDC > TGS)
# scp /tmp/server.keytab server.testyj.com:/etc/krb5.keytab
# scp /etc/krb5.conf server.testyj.com:/etc/krb5.conf

server (TGS)에 인증을 받을 testuser1 계정을 생성한다.

# useradd testuser1

이후 KDC서버에서 testuser1에 대한 tgt키를 인증을 받아 가져온다.

# kinit testuser1
Password for testuser1@TESTYJ.COM:

-확인
# klist
Ticket cache: KEYRING:persistent:0:0
Default principal: testuser1@TESTYJ.COM

Valid starting       Expires              Service principal
08/27/2020 22:55:48  08/28/2020 22:55:48  krbtgt/TESTYJ.COM@TESTYJ.COM

이제 testuser1에 대한 tgt 티켓이 있으니 testuser1@server.testyj.com 으로 암호 없이 접근이 가능해아한다.

# ssh testuser1@server.testyj.com
Last login: Thu Aug 27 22:54:31 2020 from kdc.testyj.com
[testuser1@server.testyj.com ~]$ 

완료

로그 확인

KDC에서 로그를 확인하면 인증 내역을 볼 수 있다.

차례대로 tgt티켓을 얻어오는 로그 (AS_REQ)  > tft티켓을 이용하여 TGS에 인증을 요청한 로그 (TGS_REQ)
# tail /var/log/krb5kdc.log
...
ug 27 22:55:48 fastvm-centos-7-8-70 krb5kdc[9380](info): AS_REQ (8 etypes {18 17 20 19 16 23 25 26}) 192.168.200.70: ISSUE: authtime 1598536548, etypes {rep=18 tkt=18 ses=18}, testuser1@TESTYJ.COM for krbtgt/TESTYJ.COM@TESTYJ.COM
Aug 27 22:56:42 fastvm-centos-7-8-70 krb5kdc[9380](info): TGS_REQ (8 etypes {18 17 20 19 16 23 25 26}) 192.168.200.70: ISSUE: authtime 1598536548, etypes {rep=18 tkt=18 ses=18}, testuser1@TESTYJ.COM for host/server.testyj.com@TESTYJ.COM
반응형