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

Amazon EMR 上的 HDFS 中的透明加密

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

从 Amazon EMR 发行版 4.8.0 开始,您可以使用 Amazon EMR 安全配置更轻松地为集群配置数据加密设置。安全配置提供用于为 Amazon S3 中 Amazon Elastic Block Store(Amazon EBS)存储卷和 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 中配置透明加密。有几种方式可以实现:

  • 在创建集群时使用 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.36.1 --instance-type m5.xlarge --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
使用 Amazon 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.36.1 --instance-type m5.xlarge --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.36.1 --instance-type m5.xlarge --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.36.1 --instance-type m5.xlarge --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 文档

具有多个主节点 的 EMR 集群上的 HDFS 透明加密

Apache Ranger KMS 可在具有多个主节点的 Amazon EMR 集群中使用,以在 HDFS 中进行透明加密。

Apache Ranger KMS 将其根密钥和加密区域(EZ)密钥存储在 Amazon RDS 中,用于具有多个主节点的 Amazon EMR 集群。要在具有多个主节点的 Amazon EMR 集群上的 HDFS 中启用透明加密,必须提供以下配置。

  • Amazon RDS 或您自己的 MySQL 服务器连接 URL,用于存储 Ranger KMS 根密钥和 EZ 密钥

  • MySQL 的用户名和密码

  • Ranger KMS 根密钥的密码

  • 用于到 MySQL 服务器的 SSL 连接的凭证颁发机构 (CA) PEM 文件

您可以使用 ranger-kms-dbks-site 分类和 ranger-kms-db-ca 分类提供这些配置,如以下示例所示。

[ { "Classification": "ranger-kms-dbks-site", "Properties": { "ranger.ks.jpa.jdbc.url": "jdbc:log4jdbc:mysql://mysql-host-url.xx-xxx-1.xxx.amazonaws.com:3306/rangerkms", "ranger.ks.jpa.jdbc.user": "mysql-user-name", "ranger.ks.jpa.jdbc.password": "mysql-password", "ranger.db.encrypt.key.password": "password-for-encrypting-a-master-key" } }, { "Classification": "ranger-kms-db-ca", "Properties": { "ranger.kms.trust.ca.file.s3.url": "s3://rds-downloads/rds-ca-2019-root.pem" } } ]

以下是 Apache Ranger KMS 的配置对象分类。

Hadoop KMS 配置分类
分类 描述
ranger-kms-dbks-site 更改 Ranger KMS 的 dbks-site.xml 文件中的值。
ranger-kms-site 更改 Ranger KMS 的 ranger-kms-site.xml 文件中的值。
ranger-kms-env 更改 Ranger KMS 环境中的值。
ranger-kms-log4j 更改 Ranger KMS 的 kms-log4j.properties 文件中的值。
ranger-kms-db-ca 更改 S3 上用于与 Ranger KMS 进行 MySQL SSL 连接的 CA 文件的值。

注意事项

  • 强烈建议您加密 Amazon RDS 实例以提高安全性。有关更多信息,请参阅加密 Amazon RDS 资源概览

  • 强烈建议您为每个具有多个主节点的 Amazon EMR 集群使用单独的 MySQL 数据库以提高安全性。

  • 要在具有多个主节点的 Amazon EMR 集群上的 HDFS 中配置透明加密,必须在创建集群时指定 hdfs-encryption-zones 分类。否则,Ranger KMS 将不会配置或启动。具有多个主节点的 Amazon EMR 集群上不支持在运行的集群上重新配置 hdfs-encryption-zones 分类或任何 Hadoop KMS 配置分类。