Amazon EMR에서 데이터 암호화를 위해 키 및 자격 증명 생성 - Amazon EMR

Amazon EMR에서 데이터 암호화를 위해 키 및 자격 증명 생성

보안 구성을 사용해 암호화 옵션을 지정하기 전에 키 및 암호화 아티팩트에 사용하고 싶은 공급자를 결정합니다. 예를 들어 AWS KMS 또는 생성하고자 하는 사용자 지정 공급자를 사용할 수 있습니다. 그런 다음 이 단원에 설명된 대로 키 또는 키 공급자를 생성합니다.

저장 데이터 암호화를 위한 키 제공

Amazon EMR에서 저장 데이터 암호화에 AWS Key Management Service(AWS KMS) 또는 사용자 지정 키 제공업체를 사용할 수 있습니다. AWS KMS를 사용할 때는 스토리지와 암호화 키 사용에 요금이 적용됩니다. 자세한 내용은 AWS KMS 요금을 참조하세요.

이 주제에서는 Amazon EMR에서 사용할 KMS 키의 키 정책 세부 정보를 제공하고, Amazon S3 암호화에 대한 사용자 지정 키 제공업체 클래스를 작성하기 위한 지침과 코드 예제도 제공합니다. 키 생성에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서에서 Creating keys를 참조하세요.

암호화에 AWS KMS keys 사용

EMRFS에 사용되는 Amazon EMR 클러스터 인스턴스 및 Amazon S3 버킷과 동일한 리전에서 AWS KMS 암호화 키를 생성해야 합니다. 지정하는 키가 클러스터를 구성하는 데 사용하는 계정이 아닌 다른 계정에 있는 경우 ARN을 사용하여 해당 키를 지정해야 합니다.

Amazon EC2 인스턴스 프로파일의 역할에는 사용자가 지정하는 CMK를 사용할 수 있는 권한이 있어야 합니다. Amazon EMR에 있는 인스턴스 프로파일의 기본 역할은 EMR_EC2_DefaultRole입니다. 인스턴스 프로파일에 다른 역할을 사용하거나 Amazon S3에 대한 EMRFS 요청에 IAM 역할을 사용하는 경우 각 역할이 키 사용자로 적절히 추가되도록 해야 합니다. 이렇게 하면 해당 역할에 KMS 키를 사용할 수 있는 권한이 부여됩니다. 자세한 내용은 AWS Key Management Service 개발자 안내서에서 Using Key PoliciesAmazon S3에 대한 EMRFS 요청의 IAM 역할 구성을 참조하세요.

AWS Management Console을 사용하여 인스턴스 프로파일 또는 EC2 인스턴스 프로파일을 지정된 KMS 키의 키 사용자 목록에 추가하거나 AWS CLI 또는 AWS SDK를 사용하여 적합한 키 정책을 연결할 수 있습니다.

Amazon EMR은 대칭 KMS 키만 지원합니다. 비대칭 KMS 키를 사용하여 Amazon EMR 클러스터의 저장된 데이터를 암호화할 수 없습니다. KMS 키가 대칭인지 비대칭인지 확인하는 것과 관련된 도움말은 Identifying symmetric and asymmetric KMS keys를 참조하세요.

아래 절차에서는 AWS Management Console을 사용하여 기본 Amazon EMR 인스턴스 프로파일(EMR_EC2_DefaultRole)을 키 사용자로 추가하는 방법을 설명합니다. 이때 KMS 키를 이미 생성했다고 가정합니다. 새 KMS 키를 생성하려면 AWS Key Management Service 개발자 안내서에서 Creating Keys를 참조하세요.

Amazon EMR의 EC2 인스턴스 프로파일을 암호화 키 사용자 목록에 추가하는 방법
  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/kms에서 AWS Key Management Service(AWS KMS) 콘솔을 엽니다.

  2. AWS 리전을 변경하려면 페이지의 오른쪽 상단 모서리에 있는 리전 선택기를 사용합니다.

  3. 수정할 KMS 키의 별칭을 선택합니다.

  4. 키 세부 정보 페이지의 Key Users(키 사용자)에서 Add(추가)를 선택합니다.

  5. Add key users(키 사용자 추가) 대화 상자에서 적절한 역할을 선택합니다. 기본 역할의 이름은 EMR_EC2_DefaultRole입니다.

  6. 추가를 선택합니다.

KMS 키에 대한 추가 권한을 제공하여 EBS 암호화 활성화

Amazon EMR 버전 5.24.0부터 보안 구성 옵션을 사용하여 EBS 루트 디바이스 및 스토리지 볼륨을 암호화할 수 있습니다. 그러한 옵션을 활성화하려면 AWS KMS를 키 공급자로 지정해야 합니다. 또한 서비스 역할 EMR_DefaultRole에 사용자가 지정한 AWS KMS key를 사용할 권한을 부여해야 합니다.

AWS Management Console을 사용하여 서비스 역할을 지정된 KMS 키의 키 사용자 목록에 추가하거나 AWS CLI 또는 AWS SDK를 사용하여 적합한 키 정책을 연결할 수 있습니다.

아래 절차에서는 AWS Management Console을 사용하여 기본 Amazon EMR 서비스 역할(EMR_DefaultRole)을 키 사용자로 추가하는 방법을 설명합니다. 이때 KMS 키를 이미 생성했다고 가정합니다. 새 KMS 키를 생성하려면 AWS Key Management Service 개발자 안내서에서 키 생성을 참조하세요.

암호화 키 사용자 목록에 Amazon EMR 서비스 역할을 추가하는 방법
  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/kms에서 AWS Key Management Service(AWS KMS) 콘솔을 엽니다.

  2. AWS 리전을 변경하려면 페이지의 오른쪽 상단 모서리에 있는 리전 선택기를 사용합니다.

  3. 왼쪽 사이드바에서 고객 관리형 키를 선택합니다.

  4. 수정할 KMS 키의 별칭을 선택합니다.

  5. 키 세부 정보 페이지의 Key Users(키 사용자)에서 Add(추가)를 선택합니다.

  6. 키 사용자 추가 대화 상자에서 적절한 역할을 선택합니다. Amazon EMR에 대한 기본 서비스 역할의 이름은 EMR_DefaultRole입니다.

  7. 추가를 선택합니다.

사용자 지정 키 공급자 생성

보안 구성을 사용할 때는 로컬 디스크 암호화와 Amazon S3 암호화에 서로 다른 공급자 클래스를 지정해야 합니다. 사용자 지정 키 제공업체의 요구 사항은 로컬 디스크 암호화 및 Amazon S3 암호화 사용 여부와 Amazon EMR 릴리스 버전에 따라 달라집니다.

사용자 지정 키 제공업체를 생성할 때 사용하는 암호화 유형에 따라 애플리케이션은 서로 다른 EncryptionMaterialsProvider 인터페이스도 구현해야 합니다. 두 인터페이스 모두 AWS SDK for Java 버전 1.11.0 이상에서 사용할 수 있습니다.

이 구현을 위해 암호화 구성 요소를 제공하도록 임의의 모든 전략을 사용할 수 있습니다. 예를 들어 정적 암호화 구성 요소를 제공하거나 더 복잡한 키 관리 시스템과 통합하도록 선택할 수 있습니다.

Amazon S3 암호화를 사용하는 경우 사용자 지정 암호화 구성 요소에 대해 암호화 알고리즘 AES/GCM/NoPadding을 사용해야 합니다.

로컬 디스크 암호화를 사용하는 경우 사용자 지정 암호화 구성 요소에 사용할 암호화 알고리즘은 EMR 릴리스에 따라 다릅니다. Amazon EMR 7.0.0 이하의 경우 AES/GCM/NoPadding을 사용해야 합니다. Amazon EMR 7.1.0 이상의 경우 AES를 사용해야 합니다.

EncryptionMaterialsProvider 클래스는 암호화 컨텍스트별로 암호화 자료를 가져옵니다. Amazon EMR은 직접 호출자가 반환할 올바른 암호화 자료를 결정하는 데 도움이 되도록 런타임에 암호화 컨텍스트 정보를 채웁니다.

예: EMRFS에서 Amazon S3 암호화를 위해 사용자 지정 키 공급자 사용

Amazon EMR이 EncryptionMaterialsProvider 클래스에서 암호화 구성 요소를 가져와서 암호화를 수행할 때 EMRFS는 선택적으로 materialsDescription 인수를 객체의 Amazon S3 URI 및 클러스터의 JobFlowId라는 두 개의 필드로 채웁니다. 이러한 필드는 EncryptionMaterialsProvider 클래스에서 암호화 구성 요소를 선택적으로 반환하기 위해 사용할 수 있습니다.

예를 들어, 공급자는 Amazon S3 URI 접두사마다 다른 키를 반환할 수 있습니다. Amazon S3 객체에 저장되는 것은 EMRFS에서 생성되어 공급자에게 전달되는 materialsDescription 값이 아니라 반환되는 암호화 구성 요소에 대한 설명입니다. Amazon S3 객체를 암호 해독하는 동안, 암호화 구성 요소 설명이 EncryptionMaterialsProvider 클래스에 전달되므로, 이 경우에도 일치하는 키를 반환하여 객체를 암호 해독할 수 있습니다.

EncryptionMaterialsProvider 참조 구현은 아래에 제공됩니다. 또 다른 사용자 지정 공급자인 EMRFSRSAEncryptionMaterialsProvider는 GitHub에서 사용할 수 있습니다.

import com.amazonaws.services.s3.model.EncryptionMaterials; import com.amazonaws.services.s3.model.EncryptionMaterialsProvider; import com.amazonaws.services.s3.model.KMSEncryptionMaterials; import org.apache.hadoop.conf.Configurable; import org.apache.hadoop.conf.Configuration; import java.util.Map; /** * Provides KMSEncryptionMaterials according to Configuration */ public class MyEncryptionMaterialsProviders implements EncryptionMaterialsProvider, Configurable{ private Configuration conf; private String kmsKeyId; private EncryptionMaterials encryptionMaterials; private void init() { this.kmsKeyId = conf.get("my.kms.key.id"); this.encryptionMaterials = new KMSEncryptionMaterials(kmsKeyId); } @Override public void setConf(Configuration conf) { this.conf = conf; init(); } @Override public Configuration getConf() { return this.conf; } @Override public void refresh() { } @Override public EncryptionMaterials getEncryptionMaterials(Map<String, String> materialsDescription) { return this.encryptionMaterials; } @Override public EncryptionMaterials getEncryptionMaterials() { return this.encryptionMaterials; } }

Amazon EMR 암호화를 사용하여 전송 중 데이터 암호화에 대한 인증서 제공

Amazon EMR 릴리스 버전 4.8.0 이상에서 보안 구성을 사용한 전송 중 데이터 암호화를 위해 두 가지 옵션 중 하나를 선택하여 아티팩트를 지정할 수 있습니다.

  • 수동으로 PEM 인증서를 생성하여 .zip 파일에 포함한 다음 Amazon S3에서 .zip 파일을 참조할 수 있습니다.

  • 사용자 지정 인증서 공급자를 Java 클래스로 구현할 수 있습니다. Amazon S3에서 애플리케이션의 JAR 파일을 지정한 다음 애플리케이션에서 선언된 공급자의 전체 클래스 이름을 제공합니다. 클래스는 AWS SDK for Java 버전 1.11.0부터 사용할 수 있는 TLSArtifactsProvider 인터페이스를 구현해야 합니다.

Amazon EMR은 아티팩트를 클러스터의 각 노드에 자동으로 다운로드하고 나중에 해당 아티팩트를 사용하여 오픈 소스 전송 중 암호화 기능을 구현합니다. 사용 가능한 옵션에 대한 자세한 내용은 전송 중 암호화 단원을 참조하세요.

PEM 인증서 사용

전송 중 데이터 암호화를 위해 .zip 파일을 지정할 때 보안 구성은 .zip 파일 내의 PEM 파일의 이름이 아래 표시된 것과 똑같이 지정될 것으로 예상합니다.

전송 중 데이터 암호화 인증서
파일 이름 필수/선택 Details
privateKey.pem 필수 프라이빗 키
certificateChain.pem 필수 인증서 체인
trustedCertificates.pem 선택 사항 Java의 신뢰할 수 있는 기본 루트 인증 기관(CA) 또는 Java의 신뢰할 수 있는 기본 루트 CA에 연결할 수 있는 중간 CA에서 서명하지 않는 인증서를 제공하는 것이 좋습니다. 와일드카드 인증서를 사용하거나 호스트 이름 확인을 비활성화하는 경우 퍼블릭 CA를 사용하지 않는 것이 좋습니다.

프라이빗 키 PEM 파일을 클러스터 인스턴스가 상주하는 Amazon VPC 도메인에 액세스하기 위한 와일드카드 인증서로 구성해야 할 수 있습니다. 예를 들어, 클러스터가 us-east-1(북부 버지니아)에 상주하는 경우 인증서 제목 정의에서 CN=*.ec2.internal을 지정하여 클러스터에 대한 액세스를 허용하는 인증서 구성에서 공통적인 이름을 지정하도록 선택할 수 있습니다. 클러스터가 us-west-2(오레곤)에 있는 경우 CN=*.us-west-2.compute.internal을 지정할 수 있습니다.

암호화 아티팩트에 제공된 PEM 파일의 공통 이름에 도메인의 와일드카드 문자가 없는 경우 hadoop.ssl.hostname.verifier의 값을 ALLOW_ALL로 변경해야 합니다. Amazon EMR 릴리스 7.3.0 이상에서 이를 수행하려면 클러스터에 구성을 제출할 때 core-site 분류를 추가합니다. 7.3.0 이전 릴리스에서는 core-site.xml 파일에 "hadoop.ssl.hostname.verifier": "ALLOW_ALL" 구성을 직접 추가합니다. 클러스터의 모든 호스트가 이를 사용하므로 기본 호스트 이름 검증자에는 와일드카드 없이 호스트 이름을 사용하기 때문에 이와 같이 변경해야 합니다. Amazon VPC의 EMR 클러스터 구성에 대한 자세한 내용은 Amazon EMR에 대해 VPC에서 네트워킹 구성 섹션을 참조하세요.

다음 예제는 OpenSSL을 사용하여 2,048비트 RSA 프라이빗 키가 있는 자체 서명된 X.509 인증서를 생성하는 방법을 보여줍니다. 이 키를 사용하면 us-west-2(오레곤) 리전에서 *.us-west-2.compute.internal 도메인 이름에서 일반 이름으로 지정된 발급자의 Amazon EMR 클러스터 인스턴스에 액세스할 수 있습니다.

그 밖에 국가(C), 주(S), 로캘(L)과 같은 다른 선택적 제목 항목도 지정됩니다. 자체 서명된 인증서가 생성되기 때문에 예제의 두 번째 명령은 certificateChain.pem 파일을 trustedCertificates.pem 파일에 복사합니다. 세 번째 명령은 zip 명령을 사용하여 인증서가 포함된 my-certs.zip 파일을 생성합니다.

중요

이 예제는 개념 증명 데모로만 제공됩니다. 자체 서명된 인증서는 사용하지 않는 것이 좋으며 이러한 인증서를 사용하면 보안 위험이 발생할 수 있습니다. 프로덕션 시스템에서는 신뢰할 수 잇는 인증 기관(CA)을 사용하여 인증서를 발행하세요.

$ openssl req -x509 -newkey rsa:2048 -keyout privateKey.pem -out certificateChain.pem -days 365 -nodes -subj '/C=US/ST=Washington/L=Seattle/O=MyOrg/OU=MyDept/CN=*.us-west-2.compute.internal' $ cp certificateChain.pem trustedCertificates.pem $ zip -r -X my-certs.zip certificateChain.pem privateKey.pem trustedCertificates.pem