Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

为数据加密创建密钥和证书

在使用安全配置指定加密选项前,要确定所使用的密钥和加密项目的提供商 (例如 AWS KMS 或您创建的自定义提供商) 并创建密钥或密钥提供商,如此部分中所述。

通过 Amazon EMR 提供静态数据加密密钥

您可以在 Amazon EMR 中将 AWS Key Management Service (AWS KMS) 或自定义密钥提供商用于静态数据加密。使用 AWS KMS 时,加密密钥的存储和使用将产生费用。有关更多信息,请参阅 AWS KMS 定价

本主题介绍 Amazon EMR 的 AWS KMS CMK 密钥策略详细信息,以及编写 Amazon S3 加密自定义密钥提供商类的准则和代码示例。有关创建密钥的更多信息,请参阅 AWS Key Management Service Developer Guide 中的创建密钥

使用 AWS KMS 客户主密钥 (CMK) 进行加密

必须在 Amazon EMR 群集实例和 EMRFS 所用的 Amazon S3 存储桶所在的区域中创建 AWS KMS 加密密钥。如果指定的密钥与用于配置群集的账户不同,则必须使用其 ARN 指定密钥。

Amazon EC2 实例配置文件的角色必须有权使用您指定的 CMK。Amazon EMR 中的实例配置文件的默认角色是 EMR_EC2_DefaultRole。如果您对实例配置文件使用其他角色,或使用 IAM 角色向 Amazon S3 发出 EMRFS 请求,请确保根据需要将每个角色添加为密钥用户。这将为该角色授予使用 CMK 的权限。有关更多信息,请参阅 AWS Key Management Service Developer Guide 中的使用密钥策略以及使用默认 IAM 角色和托管策略尽管您可以将 AWS KMS 客户主密钥 (CMK) 用于 Amazon S3 数据加密 (就像用于本地磁盘加密一样)。还是建议您使用单独的密钥。

您可以使用 AWS Management Console将实例配置文件或 EC2 实例配置文件添加到指定的 AWS KMS CMK 的密钥用户列表中,也可以使用 AWS CLI 或 AWS 软件开发工具包附加适当的密钥策略。

以下过程介绍如何使用 AWS Management Console 将默认 EMR 实例配置文件 EMR_EC2_DefaultRole 添加为密钥用户。它假定您已创建一个 CMK。要创建新 CMK,请参阅 AWS Key Management Service Developer Guide 中的创建密钥

将 Amazon EMR 的 EC2 实例配置文件添加到加密密钥用户列表中

  1. Sign in to the AWS Management Console and open the AWS Key Management Service (AWS KMS) console at https://console.amazonaws.cn/kms.

  2. To change the AWS Region, use the Region selector in the upper-right corner of the page.

  3. 选择要修改的 CMK 的别名。

  4. 在密钥详细信息页面的 Key Users 下,选择 Add

  5. Attach 对话框中,选择适当的角色。默认角色的名称为 EMR_EC2_DefaultRole

  6. 选择 Attach

创建自定义密钥提供商

当使用安全配置时,您必须为本地磁盘加密和 Amazon S3 加密指定不同的提供程序类名。

在创建自定义密钥提供商时,应用程序应实现 EncryptionMaterialsProvider 接口,该接口在AWS SDK for Java版本 1.11.0 及更高版本中可用。该实现可使用任何策略来提供加密资料。例如,您可以选择提供静态加密资料或与一个更复杂的密钥管理系统集成。

自定义加密材料所用的加密算法必须是 AES/GCM/NoPadding

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 参考实现。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 EMR 加密为传输中的数据加密提供证书

对于使用安全配置 (在 Amazon EMR 版本 4.8.0 或更高版本中可用) 的传输中数据加密,您有两个选项来指定加密项目:

  • 可以手动创建 PEM 证书,将它们包含一个 zip 文件中,然后在 Amazon S3 中引用该 zip 文件。

  • 可以将一个自定义证书提供商作为 Java 类实现。在 Amazon S3 中指定应用程序的 JAR 文件,然后提供与应用程序声明中相同的完整提供商类名。该类必需实现 TLSArtifactsProvider 接口,该接口是从 AWS SDK for Java 版本 1.11.0 开始提供的。

Amazon EMR 自动将项目下载到集群中的每个节点,然后使用它们实现开源传输中加密功能。有关可用选项的更多信息,请参阅传输中数据加密

使用 PEM 证书

在为传输中加密指定 zip 文件时,安全配置要求 zip 文件中的 PEM 文件的命名方式与下面完全一致:

传输中加密证书

文件名称 必需/可选 详细信息
privateKey.pem 必需 私有密钥
certificateChain.pem 必需 证书链
trustedCertificates.pem 可选 如果 Java 默认可信根证书颁发机构 (CA) 或可链接到 Java 默认可信根 CA 的中间 CA 没有对提供的证书签名,则此选项是必需的。可在 jre/lib/security/cacerts 中找到 Java 默认可信根 CA。

您可能需要将私有密钥 PEM 文件配置为支持访问您的集群实例所在的 Amazon VPC 域的通配符证书。例如,如果您的集群位于 us-east-1,则可以选择通过在证书主题定义中指定 CN=*.ec2.internal 在证书配置中指定一个通用名称以允许访问集群。有关 Amazon VPC 中的 Amazon EMR 集群配置的更多信息,请参阅为集群选择一个 Amazon VPC 子网

下面的示例说明如何使用 OpenSSL 生成一个带 1024 位 RSA 私有密钥的自签名 X.509 证书,该私有密钥允许访问发布者在美国东部 (弗吉尼亚北部) 区域中的 Amazon EMR 集群实例。这是用 *.ec2.internal 域名作为通用名称来表示的。指定了其他可选项 (如国家/地区 (C)、州/省 (S)、区域设置 (L) 等) 。由于生成了自签名证书,因此,该示例随后会将 certificateChain.pem 文件复制到 trustedCertificates.pem 文件。然后使用 zip 命令创建包含该证书的 my-certs.zip 文件。

重要

此示例仅为概念验证演示。不建议使用自签名证书,可能存在潜在安全风险。对于生产系统,应使用可信证书颁发机构 (CA) 颁发证书。

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