오늘은 Kerberos가 무엇인지, Kerberos가 활성화 된 EMR 클러스터를 구성하고 어떻게 동작하는지에 대해 작성해보도록 하겠습니다. 꽤나 많이 사용되고 있는 기술 중 하나이기에 이해해두면 많은 도움이 될 것 같습니다.
커버로스는 '티켓'을 기반으로 동작하는 네트워크 인증 암호화 프로토콜입니다. 대칭 키 암호기법을 사용하며, 티켓을 발급해주는 서버에서 비밀키로 암호화합니다.
동작 방식을 이해하기 위해서는 용어를 짚고 넘어가면 좋을 것 같습니다.
EMR에서 Kerberos를 활성화 할 경우 어떤 방식으로 동작하는지 알아보는 것이 주 목적이기 때문에, Kerberos의 동작 방식은 다음 그림을 통해 간결하게 알아보도록 하겠습니다.
(1) 클라이언트는 TGT를 AS에 요청합니다.
(2) AS는 TGT를 발급해줍니다.
(3) 클라이언트는 발급받은 TGT를 이용, TGS에 서비스 티켓을 요청합니다.
(4) TGS는 서비스 티켓을 발급합니다.
(5) 클라이언트는 발급 받은 서비스 티켓을 이용하여 SS에 서비스를 요청합니다.
Kerberos를 활성화한 EMR 클러스터를 생성하면, KDC가 Primary 노드에 위치하게 되고, 외부의 EC2에서 인증된 유저는 각 유저로 클러스터에 접속할 수 있게 됩니다. 아래 과정을 통해 위 그림과 같은 구조로 EMR 클러스터를 생성해봅니다.
먼저 다음 문서[1] 에서 확인할 수 있듯, EMR 릴리즈 5.10.0 이상의 버전에서부터 사용이 가능합니다. 지원이 되는 어플리케이션은 Hadoop MapReduce, Hbase, HDFS, Hive, Spark 등이 있습니다.
그렇다면 실제적으로 구성을 해보도록 하겠습니다.
(1) Security configuration (보안 구성) 생성
Security configuration을 먼저 생성해줍니다. Authentication 탭에서 Kerberos Authentication을 켜줍니다.
(2) 클러스터 생성 시 (1)에서 생성한 보안 구성을 적용해줍니다.
구성 적용 시 다음과 같이 Realm 이름과 KDC 관리자 패스워드를 입력해줍니다.
(3) User 및 User의 HDFS 생성
생성한 EMR 클러스터의 Primary 노드에 접속해봅시다. 아래의 과정이 필요합니다. 공식 문서에는 아래의 내용을 Step으로 제출할 수 있는 스크립트를 제공하고 있습니다. [2] Step으로 생성하는 것이 훨씬 편리할 것으로 느껴지네요.
다음 명령어들은 유저를 추가하고 유저의 principal을 생성해줍니다.
$ sudo adduser ${유저명}
$ sudo kadmin.local -q "ktadd -k /etc/krb5.keytab host/`hostname -f`"
$ sudo kadmin.local
kadmin.local: addprinc -pw ${패스워드} +needchange ${유저이름}
다음 명령어들은 유저에게 HDFS 디렉토리를 생성해주며, 유저를 디렉토리의 owner로 변경해줍니다.
$ hdfs dfs -mkdir /user/${유저이름}
$ hdfs dfs -chown ${유저이름}:${유저이름} /user/${유저이름}
다음 명령어는 GSSAPI인증을 활성화 하고 sshd를 재시작하는 명령어입니다.
$ sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config
$ sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config
$ sudo systemctl restart sshd
(4) 인증된 사용자가 EMR 클러스터의 Primary 노드에 연결하는 과정
새로운 EC2 인스턴스를 하나 띄워줍니다.
EMR 클러스터의 Primary node의 /etc/krb5.conf 파일을 복사해서, 새로운 EC2의 동일한 경로에 생성해줍니다. 텍스트를 복사해도 무방하고, 저는 귀찮아서 S3에 업로드하고 다시 다운로드 받았습니다.
이 과정에서 저는 새로 띄운 EC2 인스턴스에서 kinit 명령어가 잘 동작하지 않았는데요, Security group의 88번 포트를 개방해주었더니 연결이 되었습니다.
다음은 kinit을 이용해 티켓을 갱신해주고, 클러스터로의 ssh 접속을 할 수 있는 명령어입니다.
$ kinit username
$ ssh -k username@primary_dns
참고 문서
[1] https://docs.aws.amazon.com/ko_kr/emr/latest/ManagementGuide/emr-kerberos-principals.html
[2] https://docs.aws.amazon.com/ko_kr/emr/latest/ManagementGuide/emr-kerberos-configuration-users.html