WiseN

AWS EMR Kerberos 인증 간단 소개

Oct 31,2018   |   AWS

작성자_김명수

페이스북 공유하기 트위터 공유하기
Blog thumbnail

여기서 다루는 내용


· 간단 소개
· EMR - Kerberos 인증 활성화
· Kerberos 인증 - 클러스터 전용 KDC 구성
· Kerberos 인증 - Cross-realm trust 구성
· 마무리


 

AWS EMR은 Hadoop 클러스터 리소스 및 데이터 보안을 위해 몇 가지 기능들을 제공합니다.

이번 시간에는 EMR 클러스터의 Kerberos 인증 기능을 간단하게 활성화하여 확인해보도록 하겠습니다.

 




간단 소개







  • AWS EMR

    • 관리형 하둡 클러스터 플랫폼

    • Apache Spark, HBase, Presto, Hive와 같이 널리 사용되는 분산 프레임워크를 실행

    • Amazon S3 및Amazon DynamoDB와 같은 다른 AWS  데이터 스토어의 데이터와 상호 작용

    • 수동 또는 Auto Scaling을 통한 인스턴스 수를 늘리거나 줄일 수 있으며, spot 인스턴스 활용을 통한 비용 절감 가능

    • 제품 세부 정보 : Link



  •  Kerberos

    • 티켓(ticket) 기반 컴퓨터 네트워크 인증 암호화 프로토콜로 MIT 에서 개발

    • 비밀 키 암호화를 사용하여 클라이언트/서버 응용 프로그램에 강력한 인증 제공

    • 보안 방식으로 다른 노드에 대한 식별 허용

    • 기본 포트 88

    • MIT Kerberos 세부 정보 : Link



    이미지 출처 : wikipedia


     




    EMR - Kerberos 인증 활성화






    EMR realse 5.10.0 이상 부터 kerberos 인증 활성화를 지원합니다.

    EMR에서 Kerberos 구성을 할 경우 클러스터내에 MIT KDC(키 배포 센터)를 구성하고, 특정 애플리케이션 구성 요소에 대한 오픈소스 Kerberos 인증 설정을 활용합니다.

    추가로 Active Directory 환경과 Cross-realm trust을 구성하여 디렉터리 사용자가 Kerberos를 사용하여 인증하고 클러스터에 엑세스 할 수 있습니다.

     

    참고로 EMR에서 지원하지 않는 설치된 다른 애플리케이션들은 Kerberos 인증을 사용하지 않기 때문에 애플리케이션 오류를 유발할 수 있습니다.


    지원되는 어플리케이션은 여기 참고 하시면 됩니다.


     




    Kerberos 인증 - 클러스터 전용 KDC 구성






    먼저 EMR의 Security configuration을 생성합니다.



    아래와 이미지와 같이 Security configuration이 정상 생성된 부분 확인 가능합니다.



     

    EMR 클러스터 생성시 Authentication and encryption에서 위에서 생성한 security configuration 을 선택합니다.

    Realm 명과 KDC 관리자 패스워드를 입력하고 클러스터를 생성합니다.



     

    사용자를 추가합니다.

    [hadoop@ip-10-1-2-155 ~]$ sudo adduser test1
    [hadoop@ip-10-1-2-155 ~]$ sudo adduser test2
    [hadoop@ip-10-1-2-155 ~]$


     

    키탭(keytab)을 생성합니다.

    [hadoop@ip-10-1-2-155 ~]$ sudo kadmin.local -q "ktadd -k /etc/krb5.keytab host/`hostname -f`"
    Authenticating as principal root/admin@GS.TEST with password.
    Entry for principal host/ip-10-1-2-155.ap-northeast-2.compute.internal with kvno 3, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab.
    Entry for principal host/ip-10-1-2-155.ap-northeast-2.compute.internal with kvno 3, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab.
    Entry for principal host/ip-10-1-2-155.ap-northeast-2.compute.internal with kvno 3, encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/krb5.keytab.


     

    사용자 계정을 위한 principal 을 생성합니다.

    [hadoop@ip-10-1-2-155 ~]$ sudo kadmin.local
    Authenticating as principal root/admin@GS.TEST with password.
    kadmin.local: addprinc -pw Test123!! +needchange test1
    WARNING: no policy specified for test1@GS.TEST; defaulting to no policy
    Principal "test1@GS.TEST" created.
    kadmin.local: addprinc -pw Test123!! +needchange test2
    WARNING: no policy specified for test2@GS.TEST; defaulting to no policy
    Principal "test2@GS.TEST" created.
    kadmin.local:


     

    HDFS 사용자 디렉터리를 생성합니다.

    [hadoop@ip-10-1-2-155 ~]$ hdfs dfs -mkdir /user/test1
    [hadoop@ip-10-1-2-155 ~]$ hdfs dfs -mkdir /user/test2
    [hadoop@ip-10-1-2-155 ~]$


     

    HDFS 사용자 디렉터리 소유권을 설정하고 정상적으로 반영되었는지 확인합니다.

    [hadoop@ip-10-1-2-155 ~]$ hdfs dfs -chown test1:test1 /user/test1
    [hadoop@ip-10-1-2-155 ~]$ hdfs dfs -chown test2:test2 /user/test2
    [hadoop@ip-10-1-2-155 ~]$
    [hadoop@ip-10-1-2-155 ~]$ hdfs dfs -ls /user
    Found 12 items
    drwxrwxrwx - hadoop hadoop 0 2018-10-30 02:39 /user/hadoop
    drwxrwxr-x - hbase hbase 0 2018-10-30 02:40 /user/hbase
    drwxr-xr-x - mapred mapred 0 2018-10-30 02:39 /user/history
    drwxrwxrwx - hdfs hadoop 0 2018-10-30 02:39 /user/hive
    drwxrwxrwx - hue hue 0 2018-10-30 02:39 /user/hue
    drwxrwxrwx - livy livy 0 2018-10-30 02:39 /user/livy
    drwxrwxrwx - oozie oozie 0 2018-10-30 02:40 /user/oozie
    drwxrwxrwx - root hadoop 0 2018-10-30 02:39 /user/root
    drwxrwxrwx - spark spark 0 2018-10-30 02:39 /user/spark
    drwxr-xr-x - test1 test1 0 2018-10-30 03:01 /user/test1
    drwxr-xr-x - test2 test2 0 2018-10-30 03:01 /user/test2
    drwxrwxrwx - zeppelin hadoop 0 2018-10-30 02:39 /user/zeppelin
    [hadoop@ip-10-1-2-155 ~]$


     

    GSSAPI authentication 을 활성화하고 sshd 를 재시작합니다.

    [hadoop@ip-10-1-2-155 ~]$ sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config
    [hadoop@ip-10-1-2-155 ~]$ sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config
    [hadoop@ip-10-1-2-155 ~]$ sudo /etc/init.d/sshd restart
    Stopping sshd: [ OK ]
    Starting sshd: [ OK ]
    [hadoop@ip-10-1-2-155 ~]$


     

    마스터 노드에서 /etc/krb5.conf 파일 내용을 복사하고, 신규 Linux 인스턴스를 생성하여 /etc/krb5.conf 파일을 생성합니다.

    신규 Linux 인스턴스에서 kinit 명령으로 티켓을 갱신합니다.

    [ec2-user@ip-10-1-1-11 etc]$ kinit test1
    Password for test1@GS.TEST:
    Password expired. You must change it now.
    Enter new password:
    Enter it again:
    [ec2-user@ip-10-1-1-11 etc]$


     

    ssh -k 옵션으로 마스터 노드에 접속합니다.



     

    접속한 상태에서 특정 hdfs 디렉터리 조회 명령을 하게되면 커버로스 인증에서 실패합니다.

    [test1@ip-10-1-2-155 ~]$ hdfs dfs -ls /user/test1
    18/10/30 03:58:10 WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
    ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "ip-10-1-2-155.ap-northeast-2.compute.internal/10.1.2.155"; destination host is: "ip-10-1-2-155.ap-northeast-2.compute.internal":8020;


     

    kinit 명령으로 마스터 노드에서의 티켓을 갱신합니다.

    [test1@ip-10-1-2-155 ~]$ kinit test1
    Password for test1@GS.TEST:


     

    티켓 갱신 후 조회하면 정상적으로 인증 되어 디렉토리 확인 명령이 정상 실행됩니다.

    [test1@ip-10-1-2-155 ~]$ hdfs dfs -ls /user/test1
    [test1@ip-10-1-2-155 ~]$ hdfs dfs -ls /
    Found 4 items
    drwxr-xr-x - hdfs hadoop 0 2018-10-30 02:39 /apps
    drwxrwxrwt - hdfs hadoop 0 2018-10-30 02:42 /tmp
    drwxr-xr-x - hdfs hadoop 0 2018-10-30 03:01 /user
    drwxr-xr-x - hdfs hadoop 0 2018-10-30 02:39 /var
    [test1@ip-10-1-2-155 ~]$


     

    디렉터리 생성을 해보면 위에서 부여했던 hdfs dfs chown 권한 때문에 권한이 있는 디렉터리에서만 접근 가능합니다.

    [test1@ip-10-1-2-155 ~]$ hdfs dfs -mkdir -p /user/test1/test-dir
    [test1@ip-10-1-2-155 ~]$ hdfs dfs -mkdir -p /user/test2/test-dir
    mkdir: Permission denied: user=test1, access=WRITE, inode="/user/test2":test2:test2:drwxr-xr-x
    [test1@ip-10-1-2-155 ~]$


     

    여기까지 Dedicate KDC 구성 및 확인이었습니다.

     




    Kerberos 인증 - Cross-realm trust 구성






    기본 가이드인 AWS 공식문서를 참고로 진행 가능하며,

    본 포스팅에서는 아래 AWS 블로그에서 제공하는 Cloudformation template 을 실행하여 자동 구성으로 Cross-realm trust 구성을 확인 해보도록 하겠습니다.


    AWS 블로그  Link


     

    Cloudformation을 실행하여 아래 이미지와 같이 생성이 완료될때까지 기다립니다.



     

    완료가 되면 VPC, Active directory, EMR cluster가 정상적으로 생성된 부분 확인 가능합니다.



     

    참고로 EMR의 Security configuration을 보면 Kerberos 인증 활성화가 자동 생성된 부분 확인 할 수 있습니다.



     

    신규 인스턴스를 생성하여 ADDomainJoinUser 계정인 crossrealmadmin 으로 마스터 노드에 SSH 로그인 해보겠습니다.



     

    bootstrap action에 create-hdfs-home-ba.sh  스크립트가 동작하여 HDFS user home directory created 라고 표시되며 HDFS 디렉터리를 자동 생성해줍니다.

    HDFS 디렉터리가 자동 생성된 부분 확인 가능합니다.

    [crossrealmadmin@ip-10-0-1-181 ~]$ hdfs dfs -ls /user
    Found 7 items
    drwxr-xr-x - crossrealmadmin crossrealmadmin 0 2018-10-31 01:38 /user/crossrealmadmin
    drwxrwxrwx - hadoop hadoop 0 2018-10-31 01:13 /user/hadoop
    drwxr-xr-x - mapred mapred 0 2018-10-31 01:13 /user/history
    drwxrwxrwx - hdfs hadoop 0 2018-10-31 01:13 /user/hive
    drwxrwxrwx - livy livy 0 2018-10-31 01:13 /user/livy
    drwxrwxrwx - root hadoop 0 2018-10-31 01:13 /user/root
    drwxrwxrwx - spark spark 0 2018-10-31 01:13 /user/spark
    [crossrealmadmin@ip-10-0-1-181 ~]$


     

    AD에 접근하여 신규 유저를 생성하여 해당 유저로 신규 인스턴스에서 마스터 노드로 SSH 접근해 보겠습니다.

    먼저 AD에 접근하여 신규 유저 test1, test2 를 생성합니다.



     

    신규 인스턴스에서 마스터 노드로 SSH 연결을 합니다.



     

    아래 명령으로 HDFS 디렉터리가 정상적으로 만들어진 부분도  확인 됩니다.  (test1 계정은 생략합니다.)

    [test2@ip-10-0-1-181 ~]$ hdfs dfs -ls /user
    Found 9 items
    drwxr-xr-x - crossrealmadmin crossrealmadmin 0 2018-10-31 01:38 /user/crossrealmadmin
    drwxrwxrwx - hadoop hadoop 0 2018-10-31 01:13 /user/hadoop
    drwxr-xr-x - mapred mapred 0 2018-10-31 01:13 /user/history
    drwxrwxrwx - hdfs hadoop 0 2018-10-31 01:13 /user/hive
    drwxrwxrwx - livy livy 0 2018-10-31 01:13 /user/livy
    drwxrwxrwx - root hadoop 0 2018-10-31 01:13 /user/root
    drwxrwxrwx - spark spark 0 2018-10-31 01:13 /user/spark
    drwxr-xr-x - test1 test1 0 2018-10-31 01:49 /user/test1
    drwxr-xr-x - test2 test2 0 2018-10-31 01:51 /user/test2
    [test2@ip-10-0-1-181 ~]$


     

    마스터 노드에 접근하여 해당 계정들의 home 디렉토리도 정상 생성된 부분 확인 됩니다.

    [hadoop@ip-10-0-1-181 home]$ ls
    crossrealmadmin@example.com hadoop test2@example.com
    ec2-user test1@example.com


     

    디렉터리 생성을 해보면 위에서 부여했던 hdfs dfs chown 권한 때문에 권한이 있는 디렉터리에서만 접근 가능합니다.

    [test1@ip-10-0-1-181 ~]$ hdfs dfs -mkdir -p /user/test1/test-dir
    [test1@ip-10-0-1-181 ~]$ hdfs dfs -mkdir -p /user/test2/test-dir
    mkdir: Permission denied: user=test1, access=WRITE, inode="/user/test2/test-dir":test2:test2:drwxr-xr-x
    [test1@ip-10-0-1-181 ~]$


     

    여기까지 Cross-realm trust  구성 및 확인이었습니다.

     




    마무리






    이상으로 EMR에 추가된 Kerberos 인증 기능을 확인해보았습니다.