Amazon S3 클라이언트 측 암호화 - Amazon EMR

Amazon S3 클라이언트 측 암호화

Amazon S3 클라이언트 측 암호화를 사용하면 클러스터의 EMRFS 클라이언트에서 Amazon S3 암호화 및 암호 해독이 수행됩니다. 객체는 Amazon S3에 업로드되기 전에 암호화되고 다운로드된 후 암호 해독됩니다. 지정하는 공급자는 클라이언트가 사용하는 암호화 키를 제공합니다. 클라이언트는 AWS KMS에서 제공하는 키(CSE-KMS) 또는 클라이언트 측 루트 키(CSE-C)를 제공하는 사용자 지정 Java 클래스를 사용할 수 있습니다. 암호화 세부 사항은 지정된 공급자 및 암호 해독되거나 암호화되는 객체의 메타데이터에 따라 CSE-KMS 및 CSE-C 간에 약간 다릅니다. 이러한 차이에 대한 자세한 내용은 Amazon Simple Storage Service 사용 설명서클라이언트 측 암호화를 사용하여 데이터 보호를 참조하세요.

참고

Amazon S3 CSE는 Amazon S3와 교환하는 EMRFS 데이터만 암호화하며, 클러스터 인스턴스 볼륨에 있는 모든 데이터를 암호화하지는 않습니다. 뿐만 아니라, Hue에서 EMRFS가 사용되지 않으므로 Hue S3 파일 검색기를 사용하여 Amazon S3에 작성된 객체는 암호화되지 않습니다.

AWS CLI를 사용하여 Amazon S3에서 EMRFS 데이터에 대한 CSE-KMS를 지정하는 방법
  • 다음 명령을 입력하고 MyKMSKeyID를 사용할 KMS 키의 키 ID나 ARN으로 바꿉니다.

    aws emr create-cluster --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=KMS,KMSKeyId=MyKMSKeyId

사용자 지정 키 공급자 생성

사용자 지정 키 제공업체를 생성할 때 사용하는 암호화 유형에 따라 애플리케이션은 서로 다른 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; } }

AWS CLI를 사용하여 사용자 지정 자료 공급자 지정

AWS CLI를 사용하려면 Encryption, ProviderType, CustomProviderClassCustomProviderLocation 인수를 emrfs 옵션으로 전달합니다.

aws emr create-cluster --instance-type m5.xlarge --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=Custom,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/provider.jar,CustomProviderClass=classname

EncryptionClientSide로 설정하면 클라이언트 측 암호화가 활성화됩니다. CustomProviderClassEncryptionMaterialsProvider객체의 이름이고 CustomProviderLocation은 Amazon EMR이 CustomProviderClass를 클러스터의 각 노드로 복사하여 클래스 경로에 저장하는 로컬 또는 Amazon S3 위치입니다.

SDK를 사용하여 사용자 지정 자격 공급자 지정

SDK를 사용하려면 먼저 fs.s3.cse.encryptionMaterialsProvider.uri 속성을 설정하여 Amazon S3에 저장하는 사용자 지정 EncryptionMaterialsProvider 클래스를 클러스터의 각 노드로 다운로드합니다. 그런 다음 사용자 지정 공급자의 올바른 위치 및 CSE 활성화와 함께 emrfs-site.xml 파일에서 이 동작을 구성합니다.

예를 들어 RunJobFlowRequest를 사용하는 AWS SDK for Java에서 코드는 다음과 같을 수 있습니다.

<snip> Map<String,String> emrfsProperties = new HashMap<String,String>(); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider.uri","s3://amzn-s3-demo-bucket/MyCustomEncryptionMaterialsProvider.jar"); emrfsProperties.put("fs.s3.cse.enabled","true"); emrfsProperties.put("fs.s3.consistent","true"); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider","full.class.name.of.EncryptionMaterialsProvider"); Configuration myEmrfsConfig = new Configuration() .withClassification("emrfs-site") .withProperties(emrfsProperties); RunJobFlowRequest request = new RunJobFlowRequest() .withName("Custom EncryptionMaterialsProvider") .withReleaseLabel("emr-7.3.0") .withApplications(myApp) .withConfigurations(myEmrfsConfig) .withServiceRole("EMR_DefaultRole_V2") .withJobFlowRole("EMR_EC2_DefaultRole") .withLogUri("s3://myLogUri/") .withInstances(new JobFlowInstancesConfig() .withEc2KeyName("myEc2Key") .withInstanceCount(2) .withKeepJobFlowAliveWhenNoSteps(true) .withMasterInstanceType("m5.xlarge") .withSlaveInstanceType("m5.xlarge") ); RunJobFlowResult result = emr.runJobFlow(request); </snip>

사용자 지정 EncryptionMaterialsProvider(인수 포함)

공급자에게 직접 인수를 전달해야 할 수 있습니다. 이를 위해 사용자 지정 인수를 속성으로 정의한 상태에서 emrfs-site 구성 분류를 사용할 수 있습니다. 구성의 예제는 아래와 같습니다(파일 myConfig.json로 저장).

[ { "Classification": "emrfs-site", "Properties": { "myProvider.arg1":"value1", "myProvider.arg2":"value2" } } ]

AWS CLI에서 create-cluster 명령을 사용하여 --configurations 옵션을 통해 아래와 같이 파일을 지정할 수 있습니다.

aws emr create-cluster --release-label emr-7.3.0 --instance-type m5.xlarge --instance-count 2 --configurations file://myConfig.json --emrfs Encryption=ClientSide,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/myprovider.jar,CustomProviderClass=classname

EMRFS S3EC V2 지원 구성

S3 Java SDK 릴리스(1.11.837 이상)에서 다양한 보안 개선 사항과 함께 암호화 클라이언트 버전 2(S3EC V2)를 지원합니다. 자세한 내용은 S3 블로그 게시물 Updates to the Amazon S3 encryption client를 참조하세요. 또한 AWS SDK for Java 개발자 안내서에서 Amazon S3 encryption client migration을 참조하세요.

암호화 클라이언트 V1은 이전 버전과의 호환성을 위해 SDK에서 계속 사용할 수 있습니다. 기본적으로 EMRFS는 CSE가 활성화된 경우 S3EC V1을 사용하여 S3 객체를 암호화하고 해독합니다.

릴리스 버전이 emr-5.31.0 이전(emr-5.30.1 이하, emr-6.1.0 이하)인 EMR 클러스터에서는 S3EC V2로 암호화된 S3 객체를 EMRFS로 해독할 수 없습니다.

예 S3EC V2를 사용하도록 EMRFS 구성

S3EC V2를 사용하도록 EMRFS를 구성하려면 다음 구성을 추가합니다.

{ "Classification": "emrfs-site", "Properties": { "fs.s3.cse.encryptionV2.enabled": "true" } }

Amazon S3 클라이언트 측 암호화에 대한 emrfs-site.xml 속성

속성 기본값 설명
fs.s3.cse.enabled false

true로 설정할 경우 Amazon S3에 저장된 EMRFS 객체가 클라이언트 측 암호화를 사용하여 암호화됩니다.

fs.s3.cse.encryptionV2.enabled false

true로 설정할 경우 EMRFS는 S3 암호화 클라이언트 버전 2를 사용하여 S3의 객체를 암호화하고 해독합니다. Amazon EMR 버전 5.31.0 이상에서 사용할 수 있습니다.

fs.s3.cse.encryptionMaterialsProvider.uri N/A 사용자 지정 암호화 자료를 사용할 때 이렇게 설정합니다. EncryptionMaterialsProvider가 있는 JAR이 위치한 Amazon S3 URI. 이 URI를 제공할 경우 Amazon EMR에서 클러스터의 모든 노드에 JAR을 자동으로 다운로드합니다.
fs.s3.cse.encryptionMaterialsProvider N/A

클라이언트 측 암호화에 사용되는 EncryptionMaterialsProvider 클래스 경로입니다. CSE-KMS를 사용하여 com.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider를 지정합니다.

fs.s3.cse.materialsDescription.enabled false

true로 설정할 경우 암호화된 객체의 materialsDescription이 객체의 Amazon S3 URI와 JobFlowId로 채워집니다. 사용자 지정 암호화 자료를 사용할 때 true로 설정합니다.

fs.s3.cse.kms.keyId N/A

CSE-KMS를 사용할 때 적용됩니다. 암호화에 사용되는 KMS 키의 KeyId, ARN 또는 별칭에 대한 값.

fs.s3.cse.cryptoStorageMode ObjectMetadata

Amazon S3 스토리지 모드. 기본적으로 암호화 정보의 설명은 객체 메타데이터에 저장됩니다. 지침 파일에 설명을 저장할 수도 있습니다. 유효한 값은 ObjectMetadata 및 InstructionFile입니다. 자세한 내용은 Client-side data encryption with the AWS SDK for Java and Amazon S3를 참조하세요.