为数据加密创建密钥和凭证 - Amazon EMR

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

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

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

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

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

本主题提供了用于亚马逊的密KMS钥的关键策略细节EMR,以及编写用于 Amazon S3 加密的自定义密钥提供程序类的指南和代码示例。有关创建密钥的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的创建密钥

AWS KMS keys 用于加密

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

Amazon EC2 实例配置文件的角色必须有权使用您指定的KMS密钥。Amazon 中实例配置文件的默认角色EMR是EMR_EC2_DefaultRole。如果您在实例配置文件中使用不同的角色,或者使用IAM角色来EMRFS请求到 Amazon S3,请确保将每个角色添加为适当的关键用户。这为角色提供了使用KMS密钥的权限。有关更多信息,请参阅AWS Key Management Service 开发人员指南中的使用密钥策略配置向 Amazon S3 EMRFS 请求的IAM角色

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

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

以下步骤描述了如何使用添加默认 Amazon EMR 实例配置文件EMR_EC2_DefaultRole作为关键用户 AWS Management Console。它假设您已经创建了KMS密钥。要创建新KMS密钥,请参阅AWS Key Management Service 开发者指南中的创建密钥

将 Amazon EMR 的EC2实例配置文件添加到加密密钥用户列表中
  1. 登录 AWS Management Console 并在 https://console.aws.amazon.com/km s 处打开 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 5.24.0 EMR 版本开始,您可以使用安全配置选项对EBS根设备和存储卷进行加密。要启用此类选项,必须指定 AWS KMS 为密钥提供商。此外,您必须向服务角色EMR_DefaultRole授予使用 AWS KMS key 您指定的权限。

您可以使用将服务角色 AWS Management Console 添加到指定KMS密钥的密钥用户列表中,也可以使用 AWS CLI 或附加 AWS SDK相应的密钥策略。

以下过程介绍如何使用将默认 Amazon EMR 服务角色添加EMR_DefaultRole关键用户。 AWS Management Console 它假设您已经创建了KMS密钥。要创建新KMS密钥,请参阅AWS Key Management Service 开发者指南中的创建密钥

将 Amazon EMR 服务角色添加到加密密钥用户列表中
  1. 登录 AWS Management Console 并在 https://console.aws.amazon.com/km s 处打开 AWS Key Management Service (AWS KMS) 控制台。

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

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

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

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

  6. 在 “添加关键用户” 部分,选择相应的角色。Amazon 的默认服务角色的名称EMR是EMR_DefaultRole

  7. 选择添加

创建自定义密钥提供程序

当使用安全配置时,您必须为本地磁盘加密和 Amazon S3 加密指定不同的提供程序类名。对自定义密钥提供程序的要求取决于您是否使用本地磁盘加密和 Amazon S3 加密,以及 Amazon EMR 发布版本。

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

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

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

如果您使用的是本地磁盘加密,则用于自定义加密材料的加密算法因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 EMR 加密对传输中的数据进行加密

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

  • 您可以手动创建PEM证书,将其包含在.zip 文件中,然后在 Amazon S3 中引用该.zip 文件。

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

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

使用PEM证书

在为传输中加密指定.zip 文件时,安全配置要求.zip PEM 文件中的文件命名与下图所示完全相同:

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

您可能希望将私钥PEM文件配置为通配符证书,以允许访问您的集群实例所在的 Amazon VPC 域。例如,如果您的集群位于 us-east-1(弗吉尼亚北部),则可以选择通过在凭证主题定义中指定 CN=*.ec2.internal 在凭证配置中指定一个通用名称以允许访问集群。如果您的集群位于 us-west-2(俄勒冈),则可以指定 CN=*.us-west-2.compute.internal

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

以下示例演示如何使用 Open SSL 生成带有 1024 位私钥的自签名 X.509 证书。RSA该密钥允许访问发行者在us-west-2(俄勒冈)地区的 Amazon EMR 集群实例,该实例由*.us-west-2.compute.internal域名指定为公用名。

指定其它可选项(如国家/地区 (C)、州/省 (S)、区域设置 (L) 等)。由于生成了自签名凭证,因此,该示例中的第二个命令会将 certificateChain.pem 文件复制到 trustedCertificates.pem 文件。第三个命令使用 zip 创建包含这些凭证的 my-certs.zip 文件。

重要

此示例仅供演 proof-of-concept示。不建议使用自签名凭证,可能存在潜在安全风险。对于生产系统,应使用可信凭证颁发机构 (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