为数据加密创建密钥和凭证 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在使用安全配置指定加密选项前,确定要用于密钥和加密构件的提供程序。例如,您可以使用 Amazon KMS 或您创建的自定义提供程序。接下来,创建密钥或密钥提供程序,如本节中所述。

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

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

本主题介绍可与 Amazon EMR 结合使用的 KMS 密钥的密钥策略详细信息,以及编写适用于 Amazon S3 加密的自定义密钥提供程序类的准则和代码示例。有关创建密钥的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的创建密钥

使用 Amazon KMS keys 加密

Amazon KMS 加密密钥,必须在与您的 Amazon EMR 集群实例和与 EMRFS 一起使用的 Amazon S3 存储桶相同的区域创建。如果指定的密钥没有位于用于配置集群的账户中,则必须使用它的 ARN 指定密钥。

Amazon EC2 实例配置文件的角色必须具有使用您指定的 KMS 密钥的权限。Amazon EMR 中实例配置文件的默认角色是 EMR_EC2_DefaultRole。如果您对实例配置文件使用不同的角色,或者对 Amazon S3 的 EMRFS 请求使用 IAM 角色,请确保根据需要将每个角色添加为密钥用户。这会为该角色授予使用该 KMS 密钥的权限。有关更多信息,请参阅《Amazon Key Management Service开发人员指南》为向 Amazon S3 发出的 EMRFS 请求配置 IAM 角色中的使用密钥策略

您可以使用 Amazon Web Services Management Console 将实例配置文件或 EC2 实例配置文件添加到指定 KMS 密钥的密钥用户列表中,也可以使用 Amazon CLI 或 Amazon SDK 来附加适当的密钥策略。

请注意 Amazon EMR 仅支持对称 KMS 密钥。不能使用非对称 KMS 密钥加密 Amazon EMR 集群中的静态数据。要获取确定 KMS 密钥是对称还是非对称的帮助,请参阅识别对称密钥和非对称密钥

以下步骤介绍了如何使用Amazon Web Services Management Console添加默认 EMR 实例配置文件 EMR_EC2_DefaultRole,将其作为密钥用户。它假定您已创建一个 KMS 密钥。要创建新的 KMS 密钥,请参阅《Amazon Key Management Service 开发人员指南》中的创建密钥

将 Amazon EMR 的 EC2 实例配置文件添加到加密密钥用户列表中
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Key Management Service (Amazon KMS) 控制台:https://console.aws.amazon.com/kms

  2. 要更改 Amazon Web Services 区域,请使用页面右上角的区域选择器。

  3. 选择要修改的 KMS 密钥的别名。

  4. 在密钥详细信息页面的 Key Users (密钥用户) 下,选择 Add (添加)

  5. Add key users (添加密钥用户) 对话框中,选择适当的角色。默认角色的名称为 EMR_EC2_DefaultRole

  6. 选择 Add(添加)。

通过为 KMS 密钥提供额外的权限来启用 EBS 加密

从 Amazon EMR 版本 5.24.0 开始,您可以使用安全配置选项加密 EBS 根设备和存储卷。要启用此选项,您必须指定 Amazon KMS 作为密钥提供程序。此外,您必须向 EMR 服务角色 EMR_DefaultRole 授予使用您指定的 Amazon KMS key 的权限。

您可以使用 Amazon Web Services Management Console 将 EMR 服务角色添加到指定 KMS 密钥的密钥用户列表中,也可以使用 Amazon CLI 或 Amazon SDK 来附加适当的密钥策略。

以下步骤介绍了如何使用Amazon Web Services Management Console添加默认 EMR 实例服务角色 EMR_DefaultRole,并将其作为密钥用户。它假定您已创建一个 KMS 密钥。要创建新的 KMS 密钥,请参阅《Amazon Key Management Service 开发人员指南》中的创建密钥

将 EMR 服务角色添加到加密密钥用户列表中
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Key Management Service (Amazon KMS) 控制台:https://console.aws.amazon.com/kms

  2. 要更改 Amazon Web Services 区域,请使用页面右上角的区域选择器。

  3. 在左侧边栏中选择 Customer managed keys (客户托管密钥)

  4. 选择要修改的 KMS 密钥的别名。

  5. 在密钥详细信息页面的 Key Users (密钥用户) 下,选择 Add (添加)

  6. Add key users (添加密钥用户) 对话框中,选择适当的角色。默认 EMR 服务角色的名称为 EMR_DefaultRole

  7. 选择 Add(添加)。

创建自定义密钥提供程序

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

创建自定义密钥提供程序时,应用程序应实施 EncryptionMaterialsProvider 接口,它在 Amazon 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 参考实施。另一个自定义提供程序 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 或更高版本,您有两个选项可指定使用安全配置对传输中的数据进行加密的构件:

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

  • 可以将一个自定义凭证提供程序作为 Java 类实现。在 Amazon S3 中指定应用程序的 JAR 文件,然后提供与应用程序声明中相同的完整提供程序类名。该类必需实现 TLSArtifactsProvider 接口,该接口是从Amazon 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 在凭证配置中指定一个通用名称以允许访问集群。如果您的集群位于 us-west-2(俄勒冈),则可以指定 CN=*.us-west-2.compute.internal

如果加密构件中提供的 PEM 文件在域的 CN 中没有通配符,则必须将 hadoop.ssl.hostname.verifier 的值改为 ALLOW_ALL。将配置提交到集群时使用 core-site 分类,或者通过将此值添加到 core-site.xml 文件中来完成此操作。必须进行此更改,因为默认主机名验证程序将不接受没有通配符的主机名,从而导致错误。有关 Amazon VPC 中的 EMR 集群配置的更多信息,请参阅 配置联网

以下示例说明了如何使用 OpenSSL 生成一个带 1024 位 RSA 私有密钥的自签名 X.509 凭证。该密钥允许访问发布者在 us-west-2(俄勒冈)区域中的 Amazon EMR 集群实例,这是用 *.us-west-2.compute.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=*.us-west-2.compute.internal' $ cp certificateChain.pem trustedCertificates.pem $ zip -r -X my-certs.zip certificateChain.pem privateKey.pem trustedCertificates.pem