Amazon EMR에서 HDFS의 투명한 암호화 - Amazon EMR

Amazon EMR에서 HDFS의 투명한 암호화

투명한 암호화는 사용자가 정의하는 HDFS 경로인 HDFS 암호화 영역의 사용을 통해 구현됩니다. 각 암호화 영역에는 고유의 키가 있으며, 이 키는 hdfs-site 구성 분류를 사용하여 지정된 키 서버에 저장됩니다.

Amazon EMR 릴리스 버전 4.8.0부터 Amazon EMR 보안 구성을 사용하여 클러스터의 데이터 암호화 설정을 더욱 쉽게 구성할 수 있습니다. 보안 구성은 Amazon S3의 EMRFS 데이터 및 Amazon Elastic Block Store(Amazon EBS) 스토리지 볼륨의 전송 중 데이터와 저장 데이터에 대한 보안을 활성화하는 설정을 제공합니다. 자세한 내용은 Amazon EMR 관리 안내서에서 전송 중 데이터 및 저장 데이터 암호화를 참조하세요.

Amazon EMR은 기본적으로 Hadoop KMS를 사용하지만, KeyProvider API 작업을 구현하는 다른 KMS를 사용할 수 있습니다. HDFS 암호화 영역의 각 파일에는 고유의 데이터 암호화 키가 있으며 이 키는 암호와 영역 키를 사용하여 암호화됩니다. 암호화 및 암호 해독 활동은 클라이언트에서만 수행되므로 데이터를 암호화 영역에 쓸 때 HDFS 데이터가 종단 간(미사용 데이터 및 전송 중 데이터)으로 암호화됩니다.

암호화 영역 간에 또는 암호화 영역에서 암호화되지 않은 경로로 파일을 이동할 수 없습니다.

NameNode와 HDFS 클라이언트는 KeyProvider API 작업을 통해 하둡 KMS(또는 사용자가 구성한 대체 KMS)와 상호 작용합니다. KMS는 지원 키 스토어에 암호화 키를 저장하는 작업을 담당합니다. 또한 Amazon EMR에는 JCE 무제한 강도 정책이 포함되므로, 원하는 길이로 키를 생성할 수 있습니다.

자세한 내용은 Hadoop 설명서에서 Transparent encryption in HDFS를 참조하세요.

참고

Amazon EMR에서 Hadoop KMS를 사용할 경우 HTTPS를 통한 KMS는 기본적으로 활성화되지 않습니다. HTTPS를 통한 KMS를 활성화하는 방법에 대한 자세한 내용은 하둡 KMS 설명서를 참조하십시오.

HDFS 투명한 암호화 구성

키를 생성하고 암호화 영역을 추가하여 Amazon EMR에서 투명한 암호화를 구성할 수 있습니다. 여러 가지 방법으로 이 작업을 수행할 수 있습니다.

  • 클러스터를 생성할 때 Amazon EMR 구성 API 작업 사용

  • command-runner.jar과 함께 하둡 JAR 단계 사용

  • 하둡 클러스터의 마스터 노드에 로그인하여 hadoop keyhdfs crypto 명령줄 클라이언트 사용

  • 하둡 KMS 및 HDFS에 REST API 사용

REST API에 대한 자세한 내용은 하둡 KMS 및 HDFS의 각 설명서를 참조하십시오.

CLI를 사용하여 클러스터 생성 시 암호화 영역과 해당 키를 생성하려면

구성 API 작업의 hdfs-encryption-zones 분류를 통해 클러스터를 생성할 때 키 이름과 암호화 영역을 지정할 수 있습니다. Amazon EMR은 클러스터의 Hadoop KMS에서 이 키를 생성하고 암호화 영역을 구성합니다.

  • 다음 명령을 사용하여 클러스터를 생성합니다.

    aws emr create-cluster --release-label emr-5.36.1 --instance-type m5.xlarge --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    참고

    2.x 및 3.x AMI 버전 Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

    myConfig.json:

    [ { "Classification": "hdfs-encryption-zones", "Properties": { "/myHDFSPath1": "path1_key", "/myHDFSPath2": "path2_key" } } ]
마스터 노드에서 암호화 영역과 해당 키를 수동으로 생성하려면
  1. 4.1.0 이상의 Amazon EMR 릴리스를 사용하여 클러스터를 시작합니다.

  2. SSH를 사용하여 클러스터의 프라이머리 노드에 연결합니다.

  3. 하둡 KMS 내에서 키를 생성합니다.

    $ hadoop key create path2_key path2_key has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=256, description='null', attributes=null}. KMSClientProvider[http://ip-x-x-x-x.ec2.internal:16000/kms/v1/] has been updated.
    중요

    하둡 KMS에서는 키 이름이 소문자여야 합니다. 대문자가 있는 키를 사용하면 클러스터가 시작 중 실패합니다.

  4. HDFS에서 암호화 영역 경로를 생성합니다.

    $ hadoop fs -mkdir /myHDFSPath2
  5. 생성한 키를 사용하여 HDFS 경로를 암호화 영역으로 만듭니다.

    $ hdfs crypto -createZone -keyName path2_key -path /myHDFSPath2 Added encryption zone /myHDFSPath2
AWS CLI를 사용하여 암호화 영역과 해당 키를 수동으로 생성하려면
  • 다음 명령을 사용하여 KMS 키와 암호화 영역을 수동으로 생성하는 단계를 추가합니다.

    aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Type=CUSTOM_JAR,Name="Create First Hadoop KMS Key",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop key create path1_key\""] \ Type=CUSTOM_JAR,Name="Create First Hadoop HDFS Path",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop fs -mkdir /myHDFSPath1\""] \ Type=CUSTOM_JAR,Name="Create First Encryption Zone",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hdfs crypto -createZone -keyName path1_key -path /myHDFSPath1\""] \ Type=CUSTOM_JAR,Name="Create Second Hadoop KMS Key",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop key create path2_key\""] \ Type=CUSTOM_JAR,Name="Create Second Hadoop HDFS Path",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop fs -mkdir /myHDFSPath2\""] \ Type=CUSTOM_JAR,Name="Create Second Encryption Zone",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hdfs crypto -createZone -keyName path2_key -path /myHDFSPath2\""]
    참고

    2.x 및 3.x AMI 버전 Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

HDFS 투명한 암호화에 대한 고려 사항

모범 사례는 파일을 작성할 수 있는 각 애플리케이션에 대해 암호화 영역을 생성하는 것입니다. 또한 구성 API에서 hdfs-encryption-zones 분류를 사용하여 모든 HDFS를 암호화하고 루트 경로(/)를 암호화 영역으로 지정할 수 있습니다.

Hadoop 키 관리 서버

하둡 KMS는 하둡 클러스터에 대한 암호화 서비스를 구현할 수 있는 기능을 제공하는 키 관리 서버이며, Amazon EMR에서 HDFS의 투명한 암호화 항목의 키 공급자 역할을 수행할 수 있습니다. EMR 클러스터를 시작하는 동안 Hadoop 애플리케이션을 선택하면 Amazon EMR의 Hadoop KMS가 기본적으로 설치되고 활성화됩니다. 하둡 KMS는 임시 캐시의 경우를 제외하고 키 자체를 저장하지 않습니다. Hadoop KMS는 키 제공업체 및 지원 키 스토어에 대한 클라이언트 수탁자 사이에서 프록시 역할을 하지만, 키 스토어는 아닙니다. 하둡 KMS에 대해 생성되는 기본 키 스토어는 JCEKS(Java Cryptography Extension KeyStore)입니다. JCE 무제한 강도 정책도 포함되므로, 원하는 길이로 키를 생성할 수 있습니다. 또한 하둡 KMS는 HDFS와 같은 다른 클라이언트 애플리케이션과 독립적으로 키 및 키 작업에 대한 액세스를 제어하는 다양한 ACL을 지원합니다. Amazon EMR의 기본 키 길이는 256비트입니다.

하둡 KMS를 구성하려면 hadoop-kms-site 분류를 사용하여 설정을 변경합니다. ACL을 구성하려면 kms-acls 분류를 사용합니다.

자세한 내용은 하둡 KMS 설명서를 참조하십시오. 하둡 KMS는 하둡 HDFS 투명한 암호화에 사용됩니다. HDFS 투명한 암호화에 대해 자세히 알아보려면 Apache Hadoop 설명서의 HDFS transparent encryption 주제를 참조하세요.

참고

Amazon EMR에서 Hadoop KMS를 사용할 경우 HTTPS를 통한 KMS는 기본적으로 활성화되지 않습니다. HTTPS를 통한 KMS를 활성화하는 방법을 알아보려면 하둡 KMS 설명서를 참조하십시오.

중요

하둡 KMS에서는 키 이름이 소문자여야 합니다. 대문자가 있는 키를 사용하면 클러스터가 시작 중 실패합니다.

Amazon EMR에서 Hadoop KMS 구성

Amazon EMR 릴리스 버전 4.6.0 이상을 사용할 경우 kms-http-port는 9700이며 kms-admin-port는 9701입니다.

Amazon EMR 릴리스에 대한 구성 API를 사용하여 클러스터 생성 시 Hadoop KMS를 구성할 수 있습니다. 다음은 하둡 KMS에 사용할 수 있는 구성 객체 분류입니다.

Hadoop KMS 구성 분류
Classification 파일 이름
hadoop-kms-site kms-site.xml
hadoop-kms-acls kms-acls.xml
hadoop-kms-env kms-env.sh
hadoop-kms-log4j kms-log4j.properties
CLI를 사용하여 하둡 KMS ACL를 설정하려면
  • 다음 명령을 사용하여 ACL이 포함된 하둡 KMS에 클러스터를 생성합니다.

    aws emr create-cluster --release-label emr-5.36.1 --instance-type m5.xlarge --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    참고

    2.x 및 3.x AMI 버전 Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

    myConfig.json:

    [ { "Classification": "hadoop-kms-acls", "Properties": { "hadoop.kms.blacklist.CREATE": "hdfs,foo,myBannedUser", "hadoop.kms.acl.ROLLOVER": "myAllowedUser" } } ]
CLI를 사용하여 하둡 KMS를 비활성화하려면
  • 다음 명령을 사용하여 하둡 KMS hadoop.kms.cache.enablefalse로 설정된 클러스터를 생성합니다.

    aws emr create-cluster --release-label emr-5.36.1 --instance-type m5.xlarge --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    참고

    2.x 및 3.x AMI 버전 Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

    myConfig.json:

    [ { "Classification": "hadoop-kms-site", "Properties": { "hadoop.kms.cache.enable": "false" } } ]
CLI를 사용하여 kms-env.sh 스크립트에서 환경 변수를 설정하려면
  • kms-env.sh에서 hadoop-kms-env 구성을 통해 설정을 변경합니다. 다음 명령을 사용하여 하둡 KMS가 포함된 클러스터를 생성합니다.

    aws emr create-cluster --release-label emr-5.36.1 --instance-type m5.xlarge --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    참고

    2.x 및 3.x AMI 버전 Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

    myConfig.json:

    [ { "Classification": "hadoop-kms-env", "Properties": { }, "Configurations": [ { "Classification": "export", "Properties": { "JAVA_LIBRARY_PATH": "/path/to/files", "KMS_SSL_KEYSTORE_FILE": "/non/Default/Path/.keystore", "KMS_SSL_KEYSTORE_PASS": "myPass" }, "Configurations": [ ] } ] } ]

하둡 KMS 구성에 대한 자세한 내용은 하둡 KMS 설명서를 참조하십시오.

여러 프라이머리 노드가 있는 EMR 클러스터에서 HDFS의 투명한 암호화

Apache Ranger KMS는 HDFS의 투명한 암호화를 위해 여러 프라이머리 노드가 있는 Amazon EMR 클러스터에서 사용됩니다.

Apache Ranger KMS는 여러 프라이머리 노드가 있는 Amazon EMR 클러스터의 루트 키와 암호화 영역(EZ) 키를 Amazon RDS에 저장합니다. 여러 프라이머리가 있는 Amazon EMR 클러스터에서 HDFS의 투명한 암호화를 활성화하려면 다음 구성을 제공해야 합니다.

  • Ranger KMS 루트 키 및 EZ 키를 저장하기 위한 Amazon RDS 또는 자체 MySQL 서버 연결 URL

  • MySQL의 사용자 이름 및 암호

  • Ranger KMS 루트 키의 암호

  • MySQL 서버에 SSL을 연결하기 위한 인증 기관(CA) PEM 파일

다음 예제에서 보여주듯이 ranger-kms-dbks-site 분류 및 ranger-kms-db-ca 분류를 사용하여 이러한 구성을 제공할 수 있습니다.

[ { "Classification": "ranger-kms-dbks-site", "Properties": { "ranger.ks.jpa.jdbc.url": "jdbc:log4jdbc:mysql://mysql-host-url.xx-xxx-1.xxx.amazonaws.com:3306/rangerkms", "ranger.ks.jpa.jdbc.user": "mysql-user-name", "ranger.ks.jpa.jdbc.password": "mysql-password", "ranger.db.encrypt.key.password": "password-for-encrypting-a-master-key" } }, { "Classification": "ranger-kms-db-ca", "Properties": { "ranger.kms.trust.ca.file.s3.url": "s3://rds-downloads/rds-ca-2019-root.pem" } } ]

다음은 Apache Ranger KMS를 위한 구성 객체 분류입니다.

Hadoop KMS 구성 분류
Classification 설명
ranger-kms-dbks-site Ranger KMS에서 dbks-site.xml 파일의 값을 변경합니다.
ranger-kms-site Ranger KMS에서 ranger-kms-site.xml 파일의 값을 변경합니다.
ranger-kms-env Ranger KMS 환경의 값을 변경합니다.
ranger-kms-log4j Ranger KM에서 kms-log4j.properties 파일의 값을 변경합니다.
ranger-kms-db-ca Ranger KMS와의 MySQL SSL 연결에서 CA 파일의 값을 변경합니다.

고려 사항

  • 보안을 향상시키려면 Amazon RDS 인스턴스를 암호화하는 것이 좋습니다. 자세한 내용은 Amazon RDS 리소스 암호화 개요를 참조하세요.

  • 보안 수준을 높이려면 여러 프라이머리 노드가 있는 각 Amazon EMR 클러스터에 대해 별도의 MySQL 데이터베이스를 사용하는 것이 좋습니다.

  • 여러 프라이머리 노드가 있는 Amazon EMR 클러스터에서 HDFS의 투명한 암호를 구성하려면 클러스터를 생성할 때 hdfs-encryption-zones 분류를 지정해야 합니다. 그렇지 않으면 Ranger KMS는 구성되거나 시작되지 않습니다. 실행 중인 클러스터에서의 모든 Hadoop KMS 구성 분류 또는 hdfs-encryption-zones 분류의 재구성은 여러 프라이머리 노드가 있는 Amazon EMR 클러스터에서 지원되지 않습니다.