Amazon Web Services 한국 블로그

Amazon EMR에서 Apache Ranger를 사용하여 권한 부여 및 감사 구현

업데이트 날짜: 2020년 2월 14일: EMR 최신 버전 및 Apache Ranger 2.0을 지원하도록 업데이트 되었습니다. Apache Ranger 2.0을 필요로하는 Ranger Presto 플러그인에 대한 지원 추가됨. 참고: Ranger Presto 플러그인은 EMR 5.29 에서만 테스트 되었음.

업데이트 날짜: 2018년 9월 26일: EMR 및 Apache Ranger의 최신 버전을 지원하도록 업데이트 되었습니다.

————————————————–

RBAC(역할 기반 액세스 제어)는 멀티 테넌트 하둡 클러스터의 중요한 보안 요구 사항 중 하나입니다. 상시 실행되거나 일시적인 클러스터 모두 이러한 요구 사항을 설정하고 유지 관리하는 것은 쉽지 않을 수 있습니다.

Active Directory 사용자 및 그룹을 사용하는 RBAC 매트릭스가 있는 조직을 생각해 보십시오. 이 조직에서는 중앙의 보안 정책 서버에서 이 매트릭스를 관리하고 AWS에서 구동되는 모든 하둡 클러스터에 적용하려고 합니다. 이 정책 서버에는 규정 준수 요건을 충족하기 위해 액세스 및 감사 정보도 저장되어야 합니다.

이 글에서는 Apache Ranger를 사용하여 Amazon EMR 클러스터에 대한 권한 부여 및 감사를 활성화하는 단계를 알아보도록 하겠습니다.

Apache Ranger

Apache Ranger는 하둡 플랫폼 전체에서 종합적인 데이터 보안을 활성화하고 모니터링하고 관리하는 프레임워크입니다. 보안 관리, 다수의 하둡 구성 요소 전체의 세분화된 권한 부여(하둡, Hive, HBase, Storm, Knox, Solr, Kafka 및 YARN) 및 중앙 감사 등의 기능을 제공합니다. Apache Ranger는 에이전트를 사용하여 정책 및 사용자와 하둡 구성 요소와 동일한 프로세스 안에서 실행되는 플러그인(예: NameNode)을 동기화합니다.

아키텍처

다음 다이어그램의 설정을 사용하여 여러 EMR 클러스터의 정책을 독립 실행형 보안 정책 서버와 동기화할 수 있습니다. 이러한 개념은 EMR 클러스터 전체에서 사용될 수 있는 공유 Hive 메타스토어와 유사합니다.

EMRRanger_1

실습

다음 다이어그램에 나와 있듯이 3명의 사용자인 analyst1, analyst2 및 admin1에 대한 초기 권한을 설정하는 실습을 진행합니다. Ranger 관리 UI를 사용하여 이러한 액세스 권한을 수정하는 방법을 알아보겠습니다. 이러한 변경 내용은 Hue를 통해 EMR 클러스터로 전파되고 검증됩니다.

사용자/그룹/자격 증명을 관리하기 위해 AWS Directory Service가 제공하는 관리형 디렉터리 서비스인 Simple AD를 사용합니다. 그리고 보안 정책 서버(Ranger)를 설정하고 EMR 클러스터를 생성 및 구성합니다. 마지막으로 보안 정책을 테스트한 후 업데이트합니다.

사전 조건

아래 실습 단계에서는 VPC에 2개 이상의 서브넷이 있고 프라이빗 서브넷에 NAT가 구성되어 있는 것으로 가정합니다. 또한 [DNS Resolution](enableDnsSupport) 및 [DNS Hostnames](enableDnsHostnames)가 VPC에서 [Yes]로 설정되어 있어야 합니다.

Ranger 서버와 EMR 클러스터가 프라이빗 서브넷에 생성된 경우 배스천 호스트 또는 VPN 연결을 통해 웹 UI 링크(Hue, Ranger)에 액세스 할 수 있어야 합니다.

제가 각 단계에 대한 AWS CloudFormation 템플릿과 원클릭 배포를 위한 중첩된 CloudFormation 템플릿(launch_stack)을 미리 생성해 두었습니다. 이 중첩된 Cloudformation 템플릿을 사용해서 스택이 생성한 경우 “클러스터 테스트” 단계로 건너뛰십시오.

다음 파라미터가 사용됩니다.

DomainName corp.emr.local
DomainPassword <사용자 입력>
DomainShortName <디렉터리의 짧은 이름>
Subnet1SimpleAD <서브넷 1>
Subnet2SimpleAD <서브넷 2>
VPC <VPC >
KeyName <EC2 키 페어 이름 >
CoreInstanceType <EMR 코어 서버의 인스턴스 유형 >
CoreInstanceCount <EMR 코어 서버의 수 >
MasterInstanceType EMR 마스터 서버의 인스턴스 유형>
EMRClusterName <EMR 클러스터 이름>
EMRLogDir <EMR 로깅 디렉터리. 예: s3://xxx >
RangerInstanceType <Ranger 서버의 인스턴스 유형>
myDirectoryBaseDN dc=corp,dc=emr,dc=local
myDirectoryBindUser binduser@corp.emr.local
myDirectoryBindPassword <사용자 입력>
rangerVersion <Ranger 버전> – 0.6, 0.7 및 1.0 중에서 선택
emrReleaseLabel <EMR 버전>- “emr-5.0.0″,”emr-5.4.0”, “emr-5.16.0”, “emr-5.17.0” 중에서 선택
myDirectoryDefaultUserPassword <사용자 입력>- (스크립트에서 생성된 모든 사용자는 이 기본 암호를 이용함 – 에: analyst1, analyst2)

각 구성 요소를 개별적으로 생성하려면 아래의 단계를 수행하십시오.

중요: 템플릿에는 하드코딩된 사용자 이름 및 암호와 개방형 보안 그룹이 사용됩니다. 이러한 템플릿을 수정 없이 프로덕션 환경에서 사용해서는 안 됩니다.

SimpleAD 서버 설정

simple-ad-template을 사용하여 SimpleAD 서버를 설정합니다. 콘솔을 통해 직접 스택을 시작하려면 launch_stack을 사용합니다. 다음 파라미터가 사용됩니다.

DomainName corp.emr.local
DomainPassword <사용자 입력>
DomainShortName <디렉터리의 짧은 이름>
Subnet1SimpleAD <서브넷 1>
Subnet2SimpleAD <서브넷 2>
VPC <VPC >

CloudFormation 출력:

SimpleADDomainID d-xxxxx
SimpleADIPAddress X.X.X.X

참고: SimpleAD에서는 고가용성을 위해 2개의 서버를 생성합니다. 아래 단계에서는 두 IP 주소 중 하나를 사용할 것입니다.

Ranger 서버 설정

이제 SimpleAD가 생성되고 사용자가 로드 되었으니 보안 정책 서버(Ranger)를 설정할 준비가 되었습니다. 이 서버는 Amazon Linux 인스턴스에서 실행되며 Ranger는 시작 단계에서 설치 및 구성됩니다.

create-ranger-server template을 사용하여 이 인스턴스를 설정합니다. 콘솔을 통해 직접 스택을 시작하려면 launch_stack을 사용합니다. 다음 파라미터가 사용됩니다.

InstanceType <Ranger 서버의 인스턴스 유형 >
KeyName <EC2 키 페어 이름 >
myDirectoryBaseDN dc=corp,dc=emr,dc=local
myDirectoryBindUser binduser@corp.emr.local
myDirectoryBindPassword <사용자 입력>
myDirectoryIPAddress <SimpleAD 서버의 IP 주소 중 하나>
Subnet <Ranger 서버를 배치할 서브넷>
rangerVersion <Ranger 버전> – 0.6, 0.7 및 1.0 중에서 선택
VPC <VPC>

CloudFormation 출력:

IPAddress <Ranger 서버의 IP 주소>

참고: Ranger 서버는 SimpleAD와 사용자를 동기화하고 관리 UI에 대해 LDAP 인증을 활성화합니다. 기본 Ranger 관리자 암호는 변경되지 않습니다.

EMR 클러스터 생성

마지막으로, EMR 클러스터를 생성하고 필요한 플러그인을 사용하여 구성해야 합니다. AWS CLI 또는 emr-template을 사용하여 클러스터를 생성하고 구성할 수 있습니다. 모든 EMR 보안 구성이 현재 CloudFormation으로 지원되는 것은 아닙니다.

CloudFormation 템플릿을 사용하여 클러스터 생성

emr-template.template template을 사용하여 CloudFormation으로 EMR 클러스터를 구성합니다. 콘솔을 통해 직접 스택을 시작하려면 을 사용합니다.

LDAP 서버(SimpleAD)의 IP 주소가 Hue LDAP 구성에 사용됩니다.

LDAPServerIP LDAP 서버의 IP 주소
emrReleaseLabel <EMR 버전>- “emr-5.0.0″,”emr-5.4.0”, “emr-5.16.0”, “emr-5.17.0” 중에서 선택
CoreInstanceType <EMR 코어 서버의 인스턴스 유형 >
CoreInstanceCount <EMR 코어 서버의 수 >
MasterInstanceType <EMR 마스터 서버의 인스턴스 유형>
EMRClusterName <EMR 클러스터 이름>
EMRLogDir <EMR 로깅 디렉터리. 예: s3://xxx >
KeyName <EC2 키 페어 이름 >
RangerHostname <Ranger 서버의 IP 주소>
rangerVersion <Ranger 버전> – 0.6, 0.7 및 1.0 중에서 선택. Ranger 서버를 설정할 때 사용한 동일한 버전 선택
Subnet <EMR 클러스터를 배치할 서브넷>
VPC <VPC>

CloudFormation 출력:

IPAddress <EMR 마스터 노드의 IP 주소>

AWS CLI를 사용하여 클러스터 생성

aws emr create-cluster --applications Name=Hive Name=Spark Name=Hue --tags 'Name=EMR-Security' \
--release-label emr-5.0.0 \
--ec2-attributes 'SubnetId=<subnet-xxxxx>,InstanceProfile=EMR_EC2_DefaultRole,KeyName=<Key name>' \
--service-role EMR_DefaultRole \
--instance-count 4 \
--instance-type m3.2xlarge \
--log-uri '<s3 location for logging>' \
--bootstrap-actions '[{"Path":"s3://aws-bigdata-blog/artifacts/aws-blog-emr-ranger/scripts/download-scripts.sh","Args":["s3://aws-bigdata-blog/artifacts/aws-blog-emr-ranger"],"Name":"Download scripts"}]' \
--steps '[{"Args":["/mnt/tmp/aws-blog-emr-ranger/scripts/emr-steps/install-hive-hdfs-ranger-policies.sh","<ranger host ip>","s3://aws-bigdata-blog/artifacts/aws-blog-emr-ranger/inputdata"],"Type":"CUSTOM_JAR","MainClass":"","ActionOnFailure":"CONTINUE","Jar":"s3://elasticmapreduce/libs/script-runner/script-runner.jar","Properties":"","Name":"InstallRangerPolicies"},{"Args":["spark-submit","--deploy-mode","cluster","--class","org.apache.spark.examples.SparkPi","/usr/lib/spark/examples/jars/spark-examples.jar","10"],"Type":"CUSTOM_JAR","MainClass":"","ActionOnFailure":"CONTINUE","Jar":"command-runner.jar","Properties":"","Name":"SparkStep"},{"Args":["/mnt/tmp/aws-blog-emr-ranger/scripts/emr-steps/install-hive-hdfs-ranger-plugin.sh","<ranger host ip>","0.6","s3://aws-bigdata-blog/artifacts/aws-blog-emr-ranger"],"Type":"CUSTOM_JAR","MainClass":"","ActionOnFailure":"CONTINUE","Jar":"s3://elasticmapreduce/libs/script-runner/script-runner.jar","Properties":"","Name":"InstallRangerPlugin"},{"Args":["/mnt/tmp/aws-blog-emr-ranger/scripts/emr-steps/loadDataIntoHDFS.sh","us-east-1"],"Type":"CUSTOM_JAR","MainClass":"","ActionOnFailure":"CONTINUE","Jar":"s3://elasticmapreduce/libs/script-runner/script-runner.jar","Properties":"","Name":"LoadHDFSData"},{"Args":["/mnt/tmp/aws-blog-emr-ranger/scripts/emr-steps/createHiveTables.sh","us-east-1"],"Type":"CUSTOM_JAR","MainClass":"","ActionOnFailure":"CONTINUE","Jar":"s3://elasticmapreduce/libs/script-runner/script-runner.jar","Properties":"","Name":"CreateHiveTables"}]' \
--configurations '[{"Classification":"hue-ini","Properties":{},"Configurations":[{"Classification":"desktop","Properties":{},"Configurations":[{"Classification":"auth","Properties":{"backend":"desktop.auth.backend.LdapBackend"},"Configurations":[]},{"Classification":"ldap","Properties":{"bind_dn":"binduser","trace_level":"0","search_bind_authentication":"false","debug":"true","base_dn":"dc=corp,dc=emr,dc=local","bind_password":"Bind@User123","ignore_username_case":"true","create_users_on_login":"true","ldap_username_pattern":"uid=<username>,cn=users,dc=corp,dc=emr,dc=local","force_username_lowercase":"true","ldap_url":"ldap://<ip address of simple ad server>","nt_domain":"corp.emr.local"},"Configurations":[{"Classification":"groups","Properties":{"group_filter":"objectclass=*","group_name_attr":"cn"},"Configurations":[]},{"Classification":"users","Properties":{"user_name_attr":"sAMAccountName","user_filter":"objectclass=*"},"Configurations":[]}]}]}]}]' \
--service-role EMR_DefaultRole --name 'SecurityPOCCluster' --region us-east-1

HUE에 대한 LDAP 관련 정보는 –configurations 옵션을 사용하여 전달됩니다. 자세한 내용은 Hue에서 LDAP 사용자 구성EMR create-cluster CLI 참조를 참조하십시오.

다음은 EMR 단계를 사용하여 수행됩니다.

  • Ranger HDFS 및 Hive 플러그인 설치 및 구성
  • Ranger REST API를 사용하여 리포지토리 및 권한 부여 정책 업데이트
    참고: 이 단계를 처음에 실행해야 합니다. 새 클러스터에는 이 단계 작업을 포함하지 않아도 됩니다.
  • Hive 테이블(tblAnalyst1 and tblAnalyst2) 생성 및 샘플 데이터 복사
  • HDFS 폴더(/user/analyst1 and /user/analyst2) 생성 및 샘플 데이터 복사
  • Spark 제출 작업을 사용하여 SparkPi 작업을 실행하고 클러스터 설정 확인

모든 단계 작업이 성공적으로 실행되었는지 확인하려면 EMR 클러스터의 [Steps] 섹션을 확인하십시오.

o_EMRRanger_3

참고: 클러스터 생성에는 10~15분이 소요될 수 있습니다.

클러스터 테스트

축하합니다. Ranger를 사용하여 권한 부여 정책을 관리할 수 있는 기능과 함께 EMR 클러스터가 성공적으로 구성되었습니다. 실제로 작동하는지 확인하려면 HDFS 또는 Hive 쿼리를 사용하여 테스트할 수 있습니다.

웹 UI 액세스

설정을 테스트하려면 Ranger 관리 UI와 Hue에 액세스해야 합니다. 아래의 URL을 사용하면 됩니다.

  1. Ranger 관리 UI: http://<Ranger 서버의 IP 주소>:6080/login.jsp
  2. Hue 웹 UI: http://<EMR 마스터 IP>:8888

블로그에 설명된 단계를 수행하여 프라이빗 서브넷에서 시작된 EMR 클러스터의 웹 인터페이스에 액세스합니다.

참고: 이 인스턴스들이 퍼블릭 서브넷 또는 VPN 연결에 있는 경우에는 이 설정이 필요하지 않습니다.

동일한 설정을 사용하여 Ranger 관리 UI에 액세스할 수 있습니다.

HDFS 사용

“analyst1”로 Hue(URL: http://<EMR 마스터 IP>:8888)에 로그인하고 “analyst2”가 소유한 파일을 삭제합니다. Hue에 액세스하는 방법에 대한 자세한 내용은 Hue 웹 인터페이스 시작을 참조하십시오.

  1. “analyst1” 자격 증명(암호: <사용자 입력>)을 사용하여 로그인합니다.
  2. /user/analyst2 HDFS 디렉터리로 이동하고 “football_coach_position.tsv” 파일을 휴지통으로 옮깁니다.
  3. “Permission denied” 오류가 표시되는데 이는 예상된 결과입니다.

o_EMRRanger_4

Hive 쿼리 사용

HUE SQL 편집기를 사용하여 다음 쿼리를 실행합니다.

이러한 쿼리에는 HDFS 내의 데이터와 테이블이 사용됩니다. HiveServer와 함께 Apache Ranger 플러그인이 설치 되었으며,  사용자에 대해 세분화된 SQL 기반 권한을 활성화하도록 Ranger 정책을 사용할 수 있습니다.  자세한 내용은 Amazon EMR 기반 Hive의 추가 기능을 참조하십시오.

SELECT * FROM default.tblanalyst1

예상한 결과가 반환됩니다. 이제 다음 쿼리를 실행합니다.

SELECT * FROM default.tblanalyst2

다음 오류가 표시됩니다.

o_EMRRanger_5

당연한 오류입니다. analyst1 사용자에게는 tblanalyst2 테이블에 대한 테이블 SELECT 권한이 없습니다.

analyst2 사용자(기본 암호: <사용자 입력>)가 tblanalyst1 테이블에 액세스하려고 하면 유사한 오류가 표시됩니다. admin1 사용자(기본 암호: <사용자 입력>)는 모든 쿼리를 실행할 수 있습니다.

보안 정책 업데이트

정책이 적용된 것을 확인했습니다. 이제, 정책을 업데이트할 차례입니다.

  1. Ranger 관리 UI 서버에 로그인합니다.
    • URL: http:://<Ranger 서버의 IP 주소>:6080/login.jsp
    • 기본 관리자 사용자 이름/암호: admin/<apache ranger 기본 암호>.
  2. [hivedev]를 선택하여 모든 Ranger Hive 정책을 표시합니다.
    o_EMRRanger_6
  3. “Analyst2Policy”라는 이름의 정책을 선택합니다.
  4. “analyst1” 사용자와 “tblanalyst2” 테이블에 대한 “select” 권한을 추가하여 정책을 편집합니다.
    EMRRanger_7
  5. 변경 내용을 저장합니다.

이 정책 변경은 EMR 클러스터의 Hive 플러그인을 통해 풀링됩니다. 정책이 새로 고침 될 때까지 60초 이상 기다립니다.

Hue로 돌아가서 이 변경 내용이 전파되었는지 테스트합니다.

  1. “analyst1” 사용자로 Hue UI에 다시 로그인합니다(이전 단계 참조).
  2. Hive SQL 편집기에서 앞서 실패한 쿼리를 실행합니다.
    SELECT * FROM default.tblanalyst2

이제 이 쿼리가 성공적으로 실행됩니다.

o_EMRRanger_8

열 마스킹 및 행 필터링

Apache Ranger는 열 마스킹 및 행 필터링을 지원하는 기능을 제공합니다.

예를 들어 “analyst1” 사용자에게 tblanalyst1 테이블의 일부 행만 보여주고 열 값 중 하나를 마스킹하려는 경우 아래의 단계를 사용하여 설정할 수 있습니다.

  1. Apache Ranger UI에 관리자로 로그인합니다(이전 단계 참조). URL: http://<Ranger 서버의 IP 주소>:6080/login.jsp
  2. Service Manager 화면에서 [hivedev]를 선택합니다.

행 수준 필터

  • 페이지 맨 위에 제공된 [Row Level Filter] 탭을 선택하고 [Add New Policy]를 선택합니다.
  • 다음 값을 사용하여 새 정책을 생성합니다.
    • Policy Name: analyst1filter
    • Hive Database: default
    • Hive Table: tblanalyst1
    • [Row filter conditions]에서 다음을 선택합니다.
      • Select user: analyst1
      • Access Types: Select
      • Row Level Filter: page=’yelp.com’
      • [Add]를 선택하여 플러그인을 활성화합니다.

열 마스킹

  • 동일한 [hivedev Policies] 아래에서 [Masking] 탭을 선택합니다.
  • [Add New Policy]를 선택합니다.
  • 다음 값을 사용하여 새 정책을 생성합니다.
    • Policy Name: analyst1mask
    • Hive Database: default
    • Hive Table: tblanalyst1
    • Hive Column: request_begin_time
    • [Mask conditions] 아래에서 다음 값을 선택합니다.
      • Select User: analyst1
      • Access Types: select
      • Select Masking Option: Partial mask: show first 4
    • [Add]를 선택하여 플러그인을 활성화합니다.

이러한 정책 변경은 EMR 클러스터의 Hive 플러그인을 통해 풀링됩니다. 정책이 새로 고쳐질 때까지 60초 이상 기다립니다.

Hue로 돌아가서 이 변경 내용이 전파되었는지 테스트합니다.

  1. “analyst1”로 Hue UI에 다시 로그인합니다(이전 단계 참조).
  2. Hive 쿼리 UI에서 앞서 실패한 쿼리를 실행합니다.
    SELECT * FROM default.tblanalyst1

이제 이 쿼리가 성공적으로 실행되고 “page” 열 값인 “yelp.com”으로 필터링된 행만 표시됩니다. “request_begin_time” 열에는 처음 4자만 표시됩니다.

감사

이제, Hive 테이블에 액세스를 시도한 사용자를 찾고 “거부” 또는 “허용” 여부를 확인해 봅시다.

  1. Ranger UI에 관리자로 다시 로그인합니다(이전 단계 참조).
    URL: http://<Ranger 서버의 IP 주소>:6080/login.jsp
  2. [Audit]를 선택하고 [analyst1]로 필터링합니다.
    • Analyst1은 tblanalyst2 테이블에 대한 SELECT 액세스가 거부되었습니다.
      o_EMRRanger_9
    • 정책이 변경된 후 액세스 권한이 부여되고 로깅 되었습니다.
      o_EMRRanger_10

보다 복잡한 전체 테스트 검색을 수행할 수 있도록 동일한 감사 정보가 SOLR에도 저장됩니다. SOLR 인스턴스는 Ranger 서버와 동일한 인스턴스에 설치됩니다.

  • Solr UI를 엽니다.
    http://<ip-address-of-ranger-server>:8983/solr/#/ranger_audits/query
  • 문서 검색을 수행합니다.
    o_EMRRanger_11

Direct URL: http:// <ip-address-of-ranger-server>:8983/solr/ranger_audits/select?q=*%3A*&wt=json&indent=true

결론

이 글에서는 EMR에서 중앙 집중식 관리형 보안 정책 서버인 Apache Ranger를 사용하여 권한 부여 및 감사를 활성화하는 데 필요한 단계를 시연했습니다. 또한 CloudFormation 템플릿을 사용하여 이를 자동화하는 단계도 살펴봤습니다.

앞으로 EMR의 보안에 대한 더 많은 게시물이 제공됩니다. 질문이나 제안이 있으면 아래에 의견을 남겨주시기 바랍니다.

EMR 보안의 다른 측면에 대한 자세한 내용은 Jeff Barr 의 게시물을 참조하십시오.

마지막 업데이트 날짜: 2017년 6월 26일


작성자 소개


varun_90Varun Rao 는 AWS Professional Services의 빅 데이터 아키텍트입니다.
엔터프라이즈 고객을 도와 클라우드에서 빅 데이터 전략을 정의하는 일을 하며 여가 시간에는 2살 자녀와 시간을 보내려고 노력합니다.