감사(audit)에서 access control을 하는데
centos 각 서버의 계정에 대해서 이를 관리하는것이 너무 불편한다.
Kerberos를 도입한다.
- 티켓 기반으로 동작하는 컴퓨터 네트워크 인증 암호화 프로토콜
- https://ko.wikipedia.org/wiki/%EC%BB%A4%EB%B2%A0%EB%A1%9C%EC%8A%A4
도입했던 이력을 아래에 정리한다.
목차
- kerberos server
- kerberos client
- macos
Kerberos Server
Install
1. 작업 환경
$ cat /etc/system-release
Amazon Linux release 2 (Karoo)
2. 설치한 패키지 목록
- krb5 관련
- ntp
$ sudo yum list installed | grep krb
krb5-devel.x86_64 1.15.1-19.amzn2.0.3 @amzn2-core
krb5-libs.x86_64 1.15.1-19.amzn2.0.3 @amzn2-core
krb5-server.x86_64 1.15.1-19.amzn2.0.3 @amzn2-core
krb5-workstation.x86_64 1.15.1-19.amzn2.0.3 @amzn2-core
pam_krb5.x86_64 2.4.8-6.amzn2.0.2 @amzn2-core
$ sudo yum list installed | grep ntp
fontpackages-filesystem.noarch 1.44-8.amzn2 @amzn2-core
참고링크
https://gist.github.com/ashrithr/4767927948eca70845db
설정
1. EC2 인스턴스 2대 생성
- master, slave로 HA 구성했다.
2. DNS 설정
Route 53에 2개의 도메인을 추가했다. (abcdef.com은 실제 도메인이름으로 바꿔야함
- kdc.abcdef.com
- kdc2.abcdef.com
설정파일
1. /etc/krb5.conf 설정
- realm에 세팅할 도메인은 '대문자'로 해야한다.
$ cat /etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
kdc = FILE:/var/log/kerberos/krb5kdc.log
admin_server = FILE:/var/log/kerberos/kadmin.log
default = FILE:/var/log/kerberos/krb5lib.log
[libdefaults]
default_realm = ABCDEF.COM
dns_lookup_realm = false
dns_lookup_kdc = false
rdns = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
ABCDEF.COM = {
kdc = kdc.abcdef.com:88
kdc = kdc2.abcdef.com:88
admin_server = kdc.abcdef.com:749
default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 aes256-cts-hmac-sha384-192 aes128-cts-hmac-sha256-128 des3-cbc-sha1 arcfour-hmac-md5 camellia256-cts-cmac camellia128-cts-cmac des-cbc-crc des-cbc-md5 des-cbc-md4
default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 aes256-cts-hmac-sha384-192 aes128-cts-hmac-sha256-128 des3-cbc-sha1 arcfour-hmac-md5 camellia256-cts-cmac camellia128-cts-cmac des-cbc-crc des-cbc-md5 des-cbc-md4
permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 aes256-cts-hmac-sha384-192 aes128-cts-hmac-sha256-128 des3-cbc-sha1 arcfour-hmac-md5 camellia256-cts-cmac camellia128-cts-cmac des-cbc-crc des-cbc-md5 des-cbc-md4
}
[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM
2. /var/kerberos/krb5kdc/kdc.conf 설정
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
ABCDEF.COM = {
kadmind_port = 749
max_life = 9h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = des3-hmac-sha1
supported_enctypes = aes256-cts-hmac-sha1-96:normal aes128-cts-hmac-sha1-96:normal des3-cbc-sha1:normal arcfour-hmac-md5:normal
database_name = /var/kerberos/krb5kdc/principal
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /var/kerberos/krb5kdc/kadm5.dict
key_stash_file = /var/kerberos/krb5kdc/.k5.ABCDEF.COM
}
3. /var/kerberos/krb5kdc/kadm5.acl 설정
*/admin@ABCDEF.COM *
나머지 세팅
1. KDC database 생성
kdb5_util create -r ABCDEF.COM -s
2. KDC admin 생성
# kadmin.local
kadmin.local: addprinc account/admin@ABCDEF.COM
NOTICE: no policy specified for "admin/admin@ABCDEF.COM";
assigning "default".
Enter password for principal admin/admin@ATHENA.MIT.EDU: (Enter a password.)
Re-enter password for principal admin/admin@ATHENA.MIT.EDU: (Type it again.)
Principal "admin/admin@ABCDEF.COM" created.
kadmin.local:
3. KDC database 백업 (링크에 복구 방법도 있음)
- https://docs.oracle.com/cd/E19683-01/817-0365/aadmin-3/index.html
- https://docs.oracle.com/cd/E19496-01/806-1971/6jb7j7amu/index.html
- Crontab에 등록해서 주기적으로 돌리고 slave 서버로 전파(propagate)한다.
#!/bin/bash
/usr/sbin/kdb5_util dump /var/kerberos/slave_datatrans
/usr/sbin/kprop -f /var/kerberos/slave_datatrans mgmt-krb-kdc02.abcdef.com > /dev/null
- 참고로 전달할 도메인 정보는 /etc/hosts에 있다.
% cat /etc/hosts
...
10.100.125.156 mgmt-krb-kdc02.abcdef.com mgmt-krb-kdc02
4. 데몬 설정
systemctl start krb5kdc.service
systemctl start kadmin.service
systemctl enable krb5kdc.service
systemctl enable kadmin.service
Kerberos Client
Install
yum --disablerepo=* --enablerepo=base,update install -y dmidecode krb5-libs
설정
참고로 ec2 1대에 nginx를 두고 스크립트를 불러다가 client로 동작할 서버에 세팅을 한다.
대략 이런 명령을 이용함
curl -s krb5-client.abcdef.com/seeds/krb-svr-config | /bin/bash
위의 ec2에 flask로 간단하게 구현한 api 서버를 두고 잡다한(계정 추가, 변경, 삭제, ...) 처리를한다.
파일설정
1. /etc/hosts 설정
- 필요에 따라서 설정한다.
2. /etc/ssh/sshd_config 설정
- 필요에 따라서 설정한다.
3. ntp update 수행
ntpdate -u pool.ntp.org
4. kadmin에서 신규 서버 principal 등록, keytab 생성
# addpric
/usr/bin/kadmin -p account/admin -w RkaWkrdldi -q "addprinc -randkey host/dev1-api-all.abcdef.com"
# ktadd
/usr/bin/kadmin -p account/admin -w RkaWkrdldi -q ktadd -k "/home/ec2-user/seeds/keytabs/dev1-api-all.abcdef.com host/dev1-api-all.abcdef.com"
# chmod
chmod og+r /home/ec2-user/seeds/keytabs/dev1-api-all.abcdef.com
5. kdc hosts 파일에 등록
cat /home/ec2-user/seeds/hosts
10.100.56.52 dev1-api-lucky21.abcdef.com dev1-api-lucky201
10.100.56.51 dev1-api-lucky11.abcdef.com dev1-api-lucky101
10.100.56.50 dev1-api-lucky01.abcdef.com dev1-api-lucky001
10.100.56.21 dev1-api-point11.abcdef.com dev1-api-point101
10.100.56.22 dev1-api-point12.abcdef.com dev1-api-point12
10.100.56.20 dev1-api-point01.abcdef.com dev1-api-point001
10.100.56.23 dev1-api-point21.abcdef.com dev1-api-point201
10.100.56.24 dev1-api-point22.abcdef.com dev1-api-point22
10.100.0.162 dev1-proxy-out21.abcdef.com dev1-proxy-out201
10.100.0.161 dev1-proxy-out11.abcdef.com dev1-proxy-out101
6. 이번엔 4단계에서 생성했던 keytab 파일을 실제 kerberos client에 복사해둔다.
/etc/krb5.keytab
addprinc, ktadd 이렇게하고 생성한 keytab 파일을 kerberos client에 옮겨두어야 한다.
그리고 그와 관련해서 hosts 파일도 갱신해야한다.
이를 좀 편리하게 하기 위해서 ec2에 nginx + gunicorn + flask로 구성한 api 서버를 두고 처리하고 있다.
MacOS 사용자 설정
내 pc에서 ssh로 접근할 때 사용할거라서 내거에도 설정해야한다.
1. /etc/krb5.conf 설정
[libdefaults]
default_realm = ABCDEF.COM
allow_weak_crypto = false
rdns = false
[realms]
ABCDEF.COM = {
kdc = kdc.abcdef.com
kdc = kdc2.abcdef.com
admin_server = kdc.abcdef.com
kpasswd_server = kdc.abcdef.com
}
2. /etc/ssh/ssh_config 설정
- 참고로 MacOS update 하고나면 이 설정이 원복 되기도 하므로 update 이후엔 확인 해보아야 한다.
GSSAPIAuthentication yes => Allow authentication protocol for ssh kerberos support
StrictHostKeyChecking no
3. MacOS의 터미널에 접속해서 kinit을 한다.
kinit --kdc-hostname=kdc.abcdef.com,kdc2.abcdef.com sfixer@ABCDEF.COM
그리고 나서 제대로 되는지 확인한다.
% ssh sfixer@10.100.125.143
% ssh sfixer@dev1-api-all
...
'기타' 카테고리의 다른 글
TCP 통계수치 변화 (장애 상황) (1318) | 2020.07.15 |
---|---|
TCP 통계 (445) | 2020.07.14 |
500 Error on Confluence Startup (KR) (793) | 2019.07.29 |
squid proxy (8) | 2018.12.19 |
reverse proxy 개념 (10) | 2018.12.19 |