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

Amazon EMR 上的 HDFS 中的透明加密

透明加密是通过使用 HDFS 加密区域(您定义的 HDFS 路径)实现的。每个加密区域都有其自己的密钥 (存储在使用 hdfs-site 配置分类指定的密钥服务器中)。

从 Amazon EMR 版本 4.8.0 开始,您可以使用 Amazon EMR 安全配置更轻松地为集群配置数据加密设置。安全配置提供用于为 Amazon Elastic Block Store (Amazon EBS) 存储卷中的传输中的数据和静态数据以及 Amazon S3 中的 EMRFS 数据增强安全性的设置。有关更多信息,请参阅 Amazon EMR 管理指南中的加密传输中的数据和静态数据

默认情况下,Amazon EMR 使用 Hadoop KMS;不过您可以使用其他实现 KeyProvider API 操作的 KMS。HDFS 加密区域中的每个文件都有其自己唯一的数据加密密钥(通过加密区域密钥加密)。当 HDFS 数据写入加密区域时,将对数据进行端到端加密 (静态和传输中)。因为加密和解密活动仅在客户端中进行。

您无法在加密区域之间移动文件,也无法将文件从加密区域移至未加密路径。

NameNode 和 HDFS 客户端通过 KeyProvider API 操作与 Hadoop KMS (或您配置的替代 KMS) 交互。KMS 负责将加密密钥存储在后备密钥存储中。此外,Amazon EMR 包含 JCE 无限制强度策略,以便您能够创建具有所需长度的密钥。

有关更多信息,请参阅 Hadoop 文档中的 HDFS 中的透明加密

注意

在 Amazon EMR 中,对于 Hadoop KMS,默认不启用通过 HTTPS 的 KMS。有关如何启用通过 HTTPS 的 KMS 的更多信息,请参阅 Hadoop KMS 文档

配置 HDFS 透明加密

您可通过创建密钥并添加加密区域来配置透明加密。有几种方式可以实现:

  • 在创建集群时使用 Amazon EMR 配置 API 操作

  • 使用 Hadoop JAR 步骤与 command-runner.jar

  • 登录到 Hadoop 集群的主节点并使用 hadoop keyhdfs crypto 命令行客户端

  • 对 Hadoop KMS 和 HDFS 使用 REST API

有关 REST API 的更多信息,请参阅 Hadoop KMS 和 HDFS 各自的文档。

使用 CLI 在创建集群时创建加密区域及其密钥

配置 API 操作中的 hdfs-encryption-zones 分类允许您在创建集群时指定密钥名称和加密区域。 Amazon EMR 在您的集群的 Hadoop KMS 中创建此密钥并配置加密区域。

  • 使用以下命令创建集群:

    aws emr create-cluster --release-label emr-5.20.0 --instance-type m4.large --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    myConfig.json

    [ { "Classification": "hdfs-encryption-zones", "Properties": { "/myHDFSPath1": "path1_key", "/myHDFSPath2": "path2_key" } } ]

在主节点上手动创建加密区域及其密钥

  1. 使用高于 4.1.0 的 Amazon EMR 版本启动您的集群。

  2. 使用 SSH 连接到集群的主节点。

  3. 在 Hadoop KMS 中创建密钥:

    $ hadoop key create path2_key path2_key has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=256, description='null', attributes=null}. KMSClientProvider[http://ip-x-x-x-x.ec2.internal:16000/kms/v1/] has been updated.

    重要

    Hadoop KMS 要求您的密钥名称为小写。如果您使用的密钥包含大写字符,则您的集群将在启动过程中失败。

  4. 在 HDFS 中创建加密区域路径:

    $ hadoop fs -mkdir /myHDFSPath2
  5. 使用您创建的密钥使 HDFS 路径成为加密区域:

    $ hdfs crypto -createZone -keyName path2_key -path /myHDFSPath2 Added encryption zone /myHDFSPath2

使用 AWS CLI 手动创建加密区域及其密钥

  • 使用以下命令添加手动创建 KMS 密钥和加密区域的步骤:

    aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Type=CUSTOM_JAR,Name="Create First Hadoop KMS Key",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop key create path1_key\""] \ Type=CUSTOM_JAR,Name="Create First Hadoop HDFS Path",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop fs -mkdir /myHDFSPath1\""] \ Type=CUSTOM_JAR,Name="Create First Encryption Zone",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hdfs crypto -createZone -keyName path1_key -path /myHDFSPath1\""] \ Type=CUSTOM_JAR,Name="Create Second Hadoop KMS Key",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop key create path2_key\""] \ Type=CUSTOM_JAR,Name="Create Second Hadoop HDFS Path",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop fs -mkdir /myHDFSPath2\""] \ Type=CUSTOM_JAR,Name="Create Second Encryption Zone",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hdfs crypto -createZone -keyName path2_key -path /myHDFSPath2\""]

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

HDFS 透明加密注意事项

最佳实践是为可能写入文件的每个应用程序创建一个加密区域。此外,您可使用配置 API 中的 hdfs-encryption-zones 分类加密所有 HDFS,并指定根路径 (/) 作为加密区域。

Hadoop 密钥管理服务器

Hadoop KMS 是一个密钥管理服务器,可用于为 Hadoop 集群实施加密服务,并且可充当 Amazon EMR 上的 HDFS 中的透明加密 的密钥供应商。如果您在启动 EMR 集群时选择 Hadoop 应用程序,则默认情况下将安装并启用 Amazon EMR 中的 Hadoop KMS。Hadoop KMS 不存储密钥 (临时缓存时除外)。Hadoop KMS 充当密钥提供商和客户被信任方到后备密钥存储的代理,它不是密钥存储。为 Hadoop KMS 创建的默认密钥存储是 Java Cryptography Extension KeyStore (JCEKS)。还包括 JCE 无限制强度策略,以便您能够创建具有所需长度的密钥。Hadoop KMS 还支持一系列 ACL,后者独立于其他客户端应用程序 (如 HDFS) 控制对密钥和密钥操作的访问。Amazon EMR 中的默认密钥长度为 256 位。

要配置 Hadoop KMS,请使用 hadoop-kms-site 分类来更改设置。要配置 ACL,请使用分类 kms-acls。

有关更多信息,请参阅 Hadoop KMS 文档。Hadoop KMS 用于 Hadoop HDFS 透明加密。要了解有关 HDFS 透明加密的更多信息,请参阅 Apache Hadoop 文档中的 HDFS 透明加密主题。

注意

在 Amazon EMR 中,对于 Hadoop KMS,默认不启用通过 HTTPS 的 KMS。要了解如何通过 HTTPS 启用 KMS,请参阅 Hadoop KMS 文档

重要

Hadoop KMS 要求您的密钥名称为小写。如果您使用的密钥包含大写字符,则您的集群将在启动过程中失败。

在 Amazon EMR 中配置 Hadoop KMS

如果使用 Amazon EMR 版本 4.6.0 或更高版本,kms-http-port 为 9700,kms-admin-port 为 9701。

您可使用 Amazon EMR 版本的配置 API 在创建集群时配置 Hadoop KMS。下面是对 Hadoop KMS 可用的配置对象分类:

Hadoop KMS 配置分类

分类。 文件名
hadoop-kms-site kms-site.xml
hadoop-kms-acls kms-acls.xml
hadoop-kms-env kms-env.sh
hadoop-kms-log4j kms-log4j.properties

使用 CLI 设置 Hadoop KMS ACL

  • 通过以下命令使用带 ACL 的 Hadoop KMS 创建集群:

    aws emr create-cluster --release-label emr-5.20.0 --instance-type m4.large --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    myConfig.json

    [ { "Classification": "hadoop-kms-acls", "Properties": { "hadoop.kms.blacklist.CREATE": "hdfs,foo,myBannedUser", "hadoop.kms.acl.ROLLOVER": "myAllowedUser" } } ]

使用 CLI 禁用 Hadoop KMS 缓存

  • 要在 Hadoop KMS hadoop.kms.cache.enable 设置为 false 的情况下创建集群,请使用以下命令:

    aws emr create-cluster --release-label emr-5.20.0 --instance-type m4.large --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    myConfig.json

    [ { "Classification": "hadoop-kms-site", "Properties": { "hadoop.kms.cache.enable": "false" } } ]

使用 CLI 在 kms-env.sh 脚本中设置环境变量

  • 通过 kms-env.sh 配置更改 hadoop-kms-env 中的设置。使用以下命令通过 Hadoop KMS 创建集群:

    aws emr create-cluster --release-label emr-5.20.0 --instance-type m4.large --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    myConfig.json

    [ { "Classification": "hadoop-kms-env", "Properties": { }, "Configurations": [ { "Classification": "export", "Properties": { "JAVA_LIBRARY_PATH": "/path/to/files", "KMS_SSL_KEYSTORE_FILE": "/non/Default/Path/.keystore", "KMS_SSL_KEYSTORE_PASS": "myPass" }, "Configurations": [ ] } ] } ]

有关配置 Hadoop KMS 的信息,请参阅 Hadoop KMS 文档