Amazon S3 客户端加密 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon S3 客户端加密

使用 Amazon S3 客户端加密,Amazon S3 的加密和解密将在集群的EMRFS客户端中进行。在对象上载到 Amazon S3 之前对其进行加密,并在下载后对其进行解密。您指定的提供程序会提供客户端使用的加密密钥。客户端可以使用 Amazon KMS (CSE-KMS) 提供的密钥或提供客户端根密钥的自定义 Java 类 (CSE-C)。CSE-KMS 和 CSE-C 之间的加密细节略有不同,具体取决于指定的提供程序以及正在解密或加密的对象的元数据。有关这些区别的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用客户端加密保护数据

注意

Amazon S3 CSE 仅确保与 Amazon S3 交换EMRFS的数据经过加密;并非集群实例卷上的所有数据都经过加密。此外,由于 Hue 不使用 HueEMRFS,因此 Hue S3 文件浏览器写入到 Amazon S3 的对象不会被加密。

要指定 CSE-KMS 对于 Amazon S3 中的EMRFS数据,使用 Amazon CLI
  • 键入以下命令并替换 MyKMSKeyID 使用密钥 ID 或ARN要使用的KMS密钥:

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

创建自定义密钥提供程序

根据您在创建自定义密钥提供程序时使用的加密类型,应用程序还必须实现不同的 EncryptionMaterialsProvider 接口。这两个接口均在 Java 版本 1.11.0 及更高版本中可用。 Amazon SDK

您可以使用任何策略为实施提供加密材料。例如,您可以选择提供静态加密材料或与更复杂的密钥管理系统集成。

如果您使用的是 Amazon S3 加密,则必须AES/GCM/NoPadding对自定义加密材料使用加密算法。

如果您使用的是本地磁盘加密,则用于自定义加密材料的加密算法因EMR版本而异。对于亚马逊 EMR 7.0.0 及更低版本,您必须使用。AES/GCM/NoPadding对于亚马逊 EMR 7.1.0 及更高版本,您必须使用AES

该 EncryptionMaterialsProvider 类通过加密上下文获取加密材料。Amazon EMR 会在运行时填充加密上下文信息,以帮助调用者确定要返回的正确加密材料。

例 示例:使用自定义密钥提供程序进行 Amazon S3 加密 EMRFS

当 Amazon 从EncryptionMaterialsProvider 类中EMR提取加密材料以执行加密时,可以EMRFS选择在 materialsDescription 参数中填充两个字段:对象的 Amazon S3 URI 和集群的,该EncryptionMaterialsProvider 类可以选择性地使用这两个字段来返回加密材料。 JobFlowId

例如,提供商可能会为不同的 Amazon S3 URI 前缀返回不同的密钥。它是对返回的加密材料的描述,这些材料最终与 Amazon S3 对象一起存储,而不是由提供商生成EMRFS并传递给提供商的 materialsDescription 值。解密 Amazon S3 对象时,加密材料描述会传递给该EncryptionMaterialsProvider 类,这样它就可以有选择地返回匹配的密钥来解密该对象。

下面提供了一个 EncryptionMaterialsProvider 参考实现。另一个自定义提供程序可从中获得 GitHub。EMRFSRSAEncryptionMaterialsProvider

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 CLI

要使用 Amazon CLI,请将 EncryptionProviderTypeCustomProviderClassCustomProviderLocation 参数传递给 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启用客户端加密是您的EncryptionMaterialsProvider对象的名称,CustomProviderClass也是 Amazon 从中EMR复制CustomProviderClass到群集中的每个节点并将其放置在类路径中的本地或 Amazon S3 位置。CustomProviderLocation

使用指定定制材料提供商 SDK

要使用SDK,您可以将属性设置为fs.s3.cse.encryptionMaterialsProvider.uri将存储在 Amazon S3 中的自定义EncryptionMaterialsProvider类下载到集群中的每个节点。您可以在emrfs-site.xml文件中对其进行配置,同时配置自定义提供程序的CSE启用和正确位置。

例如,在 Amazon SDK for Java 使用中 RunJobFlowRequest,您的代码可能如下所示:

<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" } } ]

使用中的create-cluster命令 Amazon CLI,您可以使用--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。另请参阅《 Amazon SDK for Java 开发人员指南》中的 Amazon S3 加密客户端迁移

加密客户端 V1 仍可在中使用,SDK以实现向后兼容。如果启用,默认情况下EMRFS将使用 S3EC V1 来加密和解密 S3 对象。CSE

在发行版本低于 emr-5.31.0(emr-5.30.1 及更早版本,emr-6.1.0 及更早版本,emr-6.1.0 及更早版本)的EMR集群EMRFS上无法解密使用 S3EC V2 加密的 S3 对象。

例 配置EMRFS为使用 S3EC V2

EMRFS要配置为使用 S3EC V2,请添加以下配置:

{ "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 上的对象进行加密和解密。适用于 5.31.0 及更高EMR版本。

fs.s3.cse.encryptionMaterialsProvider.uri N/A 在使用自定义加密材料时适用。JAR带有的URI所在的 Amazon S3。EncryptionMaterialsProvider当您提供此信息时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密钥的 KeyIdARN、或别名的值。

fs.s3.cse.cryptoStorageMode ObjectMetadata

Amazon S3 存储模式。默认情况下,加密信息的描述存储在对象元数据中。也可以将描述存储在指令文件中。有效值为 ObjectMetadata 和InstructionFile。有关更多信息,请参阅使用Amazon SDK for Java 和 Amazon S3 进行客户端数据加密