

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

# 使用 Amazon EMR 加密静态数据和传输中数据
<a name="emr-data-encryption"></a>

数据加密有助于防止未经授权的用户在集群和关联的数据存储系统中读取数据。这包括保存到持久性媒体的数据（称为*静态*数据）和在网络中传输时可能被拦截的数据（称为*传输中*的数据）。

从 Amazon EMR 版本 4.8.0 开始，您可以使用 Amazon EMR 安全配置更轻松地为集群配置数据加密设置。安全配置提供用于为 Amazon S3 上 Amazon Elastic Block Store（Amazon EBS）卷和 EMRFS 中的传输中数据和静态数据增强安全性的设置。

（可选）从 Amazon EMR 版本 4.1.0 和更高版本开始，您可以选择在 HDFS 中配置透明加密，此操作不使用安全配置进行配置。有关更多信息，请参阅《Amazon EMR 版本指南》**中的 [Amazon EMR 上的 HDFS 中的透明加密](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-encryption-tdehdfs.html)。

**Topics**
+ [Amazon EMR 的加密选项](emr-data-encryption-options.md)
+ [使用客户 KMS 密钥对 EMR WAL 服务进行静态加密](encryption-at-rest-kms.md)
+ [使用 Amazon EMR 为数据加密创建密钥和证书](emr-encryption-enable.md)
+ [了解传输中加密](emr-encryption-support-matrix.md)

# Amazon EMR 的加密选项
<a name="emr-data-encryption-options"></a>

在 Amazon EMR 4.8.0 及更高版本中，您可以使用安全配置来指定对静态数据和/或传输中数据进行加密的设置。当启用静态数据加密时，您可以选择加密 Amazon S3 中的 EMRFS 数据和/或本地磁盘中的数据。您创建的每个安全配置都存储在 Amazon EMR 中而不是集群配置中，因此无论何时创建集群，您都可以轻松地重复使用某个配置来指定数据加密设置。有关更多信息，请参阅[使用 Amazon EMR 控制台或使用 AWS CLI](emr-create-security-configuration.md)。

下图显示了安全配置可用的不同数据加密选项。

![\[Amazon EMR 提供了多种传输中和静态加密选项。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/emr-encryption-options.png)


以下加密选项也可用，并且不是使用安全配置来配置的：
+ （可选）使用 Amazon EMR 版本 4.1.0 和更高版本，您可以选择在 HDFS 中配置透明加密。有关更多信息，请参阅《Amazon EMR 版本指南》**中的 [Amazon EMR 上的 HDFS 中的透明加密](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-encryption-tdehdfs.html)。
+ 如果您使用的是不支持安全配置的 Amazon EMR 版本，则可以在 Amazon S3 中为 EMRFS 数据手动配置加密。有关更多信息，请参阅[使用 EMRFS 属性指定 Amazon S3 加密](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-emrfs-encryption.html)。
+  如果您使用 5.24.0 之前的 Amazon EMR 版本，则只有在使用自定义 AMI 时，才支持加密的 EBS 根设备卷。有关更多信息，请参阅《Amazon EMR 管理指南**》中的[使用加密的 Amazon EBS 根设备卷创建自定义 AMI](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-custom-ami.html#emr-custom-ami-encrypted)。

**注意**  
从 Amazon EMR 5.24.0 版本开始，当您指定 AWS KMS 为密钥提供程序时，您可以使用安全配置选项对 EBS 根设备和存储卷进行加密。有关更多信息，请参阅 [本地磁盘加密](#emr-encryption-localdisk)。

数据加密需要密钥和凭证。安全配置使您可以灵活地从多个选项中进行选择，包括由管理的密钥 AWS Key Management Service、由 Amazon S3 管理的密钥以及您提供的自定义提供商提供的密钥和证书。 AWS KMS 用作密钥提供商时，加密密钥的存储和使用将产生费用。有关更多信息，请参阅[AWS KMS 定价](https://aws.amazon.com/kms/pricing/)。

在指定加密选项前，要确定所用的密钥和凭证管理系统，因此您可以先创建密钥和凭证或您在加密设置中指定的自定义提供程序。

## Amazon S3 中 EMRFS 数据的静态加密
<a name="emr-encryption-s3"></a>

Amazon S3 加密适用于从/在 Amazon S3 中读取/写入的 Amazon EMR 文件系统（EMRFS）对象。在您启用静态加密时，请指定 Amazon S3 服务器端加密（SSE）或客户端加密（CSE）作为**默认加密模式**。（可选）您可以使用 **Per bucket encryption overrides (每存储桶加密覆盖)** 为单个存储桶指定不同的加密方法。无论是否启用了 Amazon S3 加密，传输层安全性（TLS）都会对 EMR 集群节点和 Amazon S3 之间正在传输的 EMRFS 对象进行加密。有关 Amazon S3 加密的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[使用加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html)。

**注意**  
使用时 AWS KMS，会收取加密密钥的存储和使用费用。有关更多信息，请参阅[AWS KMS 定价](https://aws.amazon.com/kms/pricing/)。

### Amazon S3 服务器端加密
<a name="emr-encryption-s3-sse"></a>

默认情况下，所有 Amazon S3 存储桶都配置了加密，所有上传到 S3 存储桶的新对象都会自动静态加密，Amazon S3 在向磁盘写入数据时会在对象级别对数据进行加密，并在访问数据时对其进行解密。有关 SSE 的更多信息，请参阅*《Amazon Simple Storage Service 用户指南》*中的[使用服务器端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。

在 Amazon EMR 中指定 SSE 时，可以在两个不同的密钥管理系统之间进行选择：
+ **SSE-S3**：Amazon S3 为您管理密钥。
+ **SSE-KMS** — 您可以使用 AWS KMS key 来设置适用于 Amazon EMR 的策略。有关 Amazon EMR 密钥要求的更多信息，请参阅[AWS KMS keys 用于](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-encryption-enable.html#emr-awskms-keys)加密。

客户提供密钥的 SSE（SSE-C）不能用于 Amazon EMR。

### Amazon S3 客户端加密
<a name="emr-encryption-s3-cse"></a>

对于 Amazon S3 客户端加密，Amazon S3 加密和解密过程在您的 EMR 集群上的 EMRFS 客户端中进行。在对象上载到 Amazon S3 之前对其进行加密，并在下载后对其进行解密。您指定的提供程序会提供客户端使用的加密密钥。客户端可以使用 AWS KMS 提供的密钥（CSE-KMS）或提供客户端根密钥（CSE-C）的自定义 Java 类。CSE-KMS 和 CSE-C 之间的加密细节略有不同，具体取决于指定的提供程序以及正在解密或加密对象的元数据。有关这些区别的更多信息，请参阅*《Amazon Simple Storage Service 用户指南》*中的[使用客户端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)。

**注意**  
Amazon S3 CSE 仅确保与 Amazon S3 交换的 EMRFS 数据已加密；不确保集群实例卷上的所有数据都已加密。此外，由于 Hue 不使用 EMRFS，因此 Hue S3 文件浏览器写入 Amazon S3 的对象没有加密。

## Amazon EMR WAL 中数据的静态加密
<a name="emr-encryption-wal"></a>

当您为预写日志（WAL）设置服务器端加密（SSE）时，Amazon EMR 会加密静态数据。在 Amazon EMR 中指定 SSE 时，您可以从两种不同的密钥管理系统中选择：

**SSE-EMR-WAL**  
Amazon EMR 管理您的密钥。默认情况下，Amazon EMR 会使用 SSE-EMR-WAL 对存储在 Amazon EMR WAL 中的数据进行加密。

**SSE-KMS-WAL**  
您可以使用 AWS KMS 密钥来设置适用于 Amazon EMR WAL 的政策。有关配置使用客户 KMS 密钥对 EMR WAL 进行静态加密的更多信息，请参阅[使用客户 KMS 密钥对 EMR WAL 服务进行静态加密](https://docs.aws.amazon.com/emr/latest/ManagementGuide/encryption-at-rest-kms.html)。

**注意**  
当使用 Amazon EMR 启用 WAL 时，您不能在 SSE 中使用自己的密钥。有关更多信息，请参阅 [Amazon EMR 的预写日志（WAL）](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hbase-wal.html)。

## 本地磁盘加密
<a name="emr-encryption-localdisk"></a>

在您使用 Amazon EMR 安全配置启用本地磁盘加密时，以下机制协同工作来加密本地磁盘。

### 开源 HDFS 加密
<a name="w2aac30c19c13c11c23b5"></a>

在分布式处理期间，HDFS 在集群实例之间交换数据。它还从实例存储卷以及附加到实例的 EBS 卷中读写数据。启用本地磁盘加密会激活以下开源 Hadoop 加密选项：
+ [安全 Hadoop RPC](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html#Data_Encryption_on_RPC) 设置为 `Privacy`，它使用简单身份验证安全层 (SASL)。
+ [对 HDFS 块数据传输的数据加密](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html#Data_Encryption_on_Block_data_transfer.)设置为 `true` 并配置为使用 AES 256 加密。

**注意**  
您也可以通过启用传输中加密激活其他 Apache Hadoop 加密。有关更多信息，请参阅 [传输中加密](#emr-encryption-intransit)。这些加密设置不会激活 HDFS 透明加密，您可以手动配置透明加密。有关更多信息，请参阅《Amazon EMR 版本指南》**中的 [Amazon EMR 上的 HDFS 中的透明加密](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-encryption-tdehdfs.html)。

### 实例存储加密
<a name="w2aac30c19c13c11c23b7"></a>

对于使用 NVMe基于 SSDs 作为实例存储卷的 EC2 实例类型，不管 Amazon EMR NVMe 加密设置如何，都将使用加密。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[NVMe 固态硬盘卷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html#nvme-ssd-volumes)。对于其它实例存储卷，在启用了本地磁盘加密时，Amazon EMR 使用 LUKS 加密实例存储卷，而不论使用 EBS 加密还是 LUKS 加密了 EBS 卷。

### EBS 卷加密
<a name="w2aac30c19c13c11c23b9"></a>

如果您在默认为账户启用 EBS 卷的 Amazon EC2 加密的区域中创建集群，即使未启用本地磁盘加密，EBS 卷仍会加密。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[默认加密](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#encryption-by-default)。在安全配置中启用本地磁盘加密后，Amazon EMR 设置优先于集群 EC2 实例的 Amazon EC2 encryption-by-default 设置。

利用以下选项，可以使用安全配置加密 EBS 卷：
+ **EBS 加密**：从 Amazon EMR 版本 5.24.0 开始，您可以选择启用 EBS 加密。EBS 加密选项加密 EBS 根设备卷以及附加的存储卷。仅当您指定 AWS Key Management Service 为密钥提供程序时，EBS 加密选项才可用。我们建议使用 EBS 加密。
+ **LUKS 加密**：如果您为 Amazon EBS 卷选择使用 LUKS 加密，LUKS 加密仅应用于附加的存储卷，而不应用于根设备卷。有关 LUKS 加密的更多信息，请参阅 [LUKS 磁盘规格](https://gitlab.com/cryptsetup/cryptsetup/wikis/Specification)。

  对于您的密钥提供商，您可以使用适用于 Amazon EMR 的策略设置一个 AWS KMS key ，也可以设置一个提供加密工件的自定义 Java 类。使用时 AWS KMS，会收取加密密钥的存储和使用费用。有关更多信息，请参阅[AWS KMS 定价](https://aws.amazon.com/kms/pricing/)。

**注意**  
要检查您的集群上是否启用了 EBS 加密，建议您使用 `DescribeVolumes` API 调用。有关更多信息，请参阅 [DescribeVolumes](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVolumes.html)。在集群上运行 `lsblk` 只会检查 LUKS 加密的状态，而不检查 EBS 加密。

## 传输中加密
<a name="emr-encryption-intransit"></a>

传输中加密会启用几种加密机制。这些是特定于应用程序的开源功能，可能因 Amazon EMR 发行版而异。要启用传输中加密，请在 Amazon EMR 中使用 [使用 Amazon EMR 控制台或使用 AWS CLI](emr-create-security-configuration.md)。对于启用了传输中加密的 EMR 集群，Amazon EMR 会自动配置开源应用程序配置以启用传输中加密。对于高级用例，您可以直接配置开源应用程序配置，以覆盖 Amazon EMR 中的默认行为。有关更多信息，请参阅[传输中加密支持矩阵](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-encryption-support-matrix.html)和[配置应用程序](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。

请参阅以下内容，了解与传输中加密相关的开源应用程序的更多具体细节：
+ 使用安全配置启用传输中加密时，Amazon EMR 会为所有支持传输中加密的开源应用程序端点启用传输中加密。不同应用程序端点对传输中加密的支持因 Amazon EMR 发行版本而异。有关更多信息，请参阅[传输中加密支持矩阵](https://docs.aws.amazon.com/)。
+ 您可以覆盖开源配置，从而执行以下操作：
  + 如果用户提供的 TLS 证书不符合要求，则禁用 TLS 主机名验证
  + 根据性能和兼容性要求，对某些端点禁用传输中加密
  + 控制要使用的 TLS 版本和密码套件。

  有关特定于应用程序的配置的更多详细信息，请参阅[传输中加密支持矩阵](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-encryption-support-matrix.html)。
+ 除了使用安全配置启用传输中加密之外，某些通信通道还需要额外的安全配置才能启用传输中加密。例如，一些开源应用程序端点使用简单身份验证和安全层（SASL）进行传输中加密，这就要求在 EMR 集群的安全配置中启用 Kerberos 身份验证。要了解有关这些端点的更多信息，请参阅[传输中加密支持矩阵](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-encryption-support-matrix.html)。
+ 建议您使用支持 TLS v1.2 或更高版本的软件。Amazon EMR on EC2 附带默认的 Corretto JDK 发行版，该发行版决定了在 Java 上运行的开源网络允许哪些 TLS 版本、密码套件和密钥大小。目前，对于 Amazon EMR 7.0.0 及更高版本，大多数开源框架都执行 TLS v1.2 或更高版本。这是因为大多数开源框架在适用于 Amazon EMR 7.0.0 及更高版本的 Java 17 上运行。较早的 Amazon EMR 发行版可能支持 TLS v1.0 和 v1.1，因为其使用的是较早的 Java 版本，但 Corretto JDK 可能会更改 Java 支持的 TLS 版本，这可能会影响现有的 Amazon EMR 发行版。

您可以通过两种方式指定用于传输中加密的加密构件：一种是提供上载到 Amazon S3 的凭证的压缩文件，另一种是引用提供加密构件的自定义 Java 类。有关更多信息，请参阅 [为通过 Amazon EMR 加密来加密传输中的数据提供凭证](emr-encryption-enable.md#emr-encryption-certificates)。

# 使用客户 KMS 密钥对 EMR WAL 服务进行静态加密
<a name="encryption-at-rest-kms"></a>

EMR 预写日志 (WAL) 为客户 KMS 密钥提供支持。 encryption-at-rest以下详细介绍了 Amazon EMR WAL 如何与 AWS KMS集成：

EMR 预写日志 (WAL) 在以下操作 AWS 期间与之交互：`CreateWAL`、、、、、、、、、`AppendEdit``ArchiveWALCheckPoint``CompleteWALFlush``DeleteWAL``GetCurrentWALTime``ReplayEdits`、`TrimWAL`默认情况下，当调用先前列出的任何操作时，EMR WAL 会`Decrypt`根据 KMS 密钥生成和违反 KMS 密钥。`EMR_EC2_DefaultRole` `GenerateDataKey`

## 注意事项
<a name="encryption-at-rest-considerations"></a>

在 EMR WAL 中使用 AWS KMS 基于基础的加密时，请考虑以下几点：
+ 创建 EMR WAL 后，无法更改加密配置。
+ 当您将 KMS 加密与自己的 KMS 密钥结合使用时，密钥必须与您的 Amazon EMR 集群位于同一区域中。
+ 您有责任维护所有必需的 IAM 权限，建议在 WAL 生命周期内不要撤销所需的权限。否则，它将导致意想不到的故障情况，例如不能删除 EMR WAL，因为关联的加密密钥不存在。
+ 使用 AWS KMS 密钥会产生一定的费用。有关更多信息，请参阅[AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing/)。

## 所需的 IAM 权限
<a name="encryption-at-rest-required-iam-permissions"></a>

要使用您的客户 KMS 密钥对 EMR WAL 进行静态加密，您需要确保为 EMR WAL 客户端角色和 EMR WAL 服务主体 `emrwal.amazonaws.com` 设置适当的权限。

### EMR WAL 客户端角色的权限
<a name="encryption-at-rest-permissions-client-role"></a>

下面是 EMR WALS 客户端角色所需的 IAM 策略：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowKMSDecrypt"
    }
  ]
}
```

------

默认情况下，EMR 集群上的 EMR WAL 客户端将使用 `EMR_EC2_DefaultRole`。如果您对 EMR 集群中的实例配置文件使用不同的角色，请确保每个角色都具有适当的权限。

有关管理角色策略的更多信息，请参阅[添加和删除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

### KMS 密钥策略的权限
<a name="encryption-at-rest-permissions-kms-key-policy"></a>

您需要在 KMS 策略中向 EMR WAL 客户端角色和 EMR WAL 服务授予 `Decrypt` 和 `GenerateDataKey*` 权限。有关密钥策略管理的更多信息，请参阅 [KMS 密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
      ],
      "Resource": [
        "arn:aws:kms:*:123456789012:key/*"
      ],
      "Sid": "AllowKMSDecrypt"
    }
  ]
}
```

------

如果您更改默认角色，则代码片段中指定的角色也会随之更改。

## 监控 Amazon EMR WAL 与之的互动 AWS KMS
<a name="encryption-at-rest-monitoring-emr-wal-kms"></a>

### Amazon EMR WAL 加密上下文
<a name="encryption-at-rest-encryption-context"></a>

加密上下文是一组包含任意非机密数据的键值对。当您在加密数据的请求中包含加密上下文时，会以加密 AWS KMS 方式将加密上下文绑定到加密数据。要解密数据，您必须传入相同的加密上下文。

在对的请求[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)和[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)请求中， AWS KMS Amazon EMR WAL 使用具有一个标识 EMR WAL 名称的名称值对的加密上下文。

```
"encryptionContext": {
    "aws:emrwal:walname": "111222333444555-testworkspace-emrwalclustertest-emrwaltestwalname"
}
```

您可以使用加密上下文在审计记录和日志（例如和 [Amazon CloudWatch ](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) Logs）中识别这些加密操作，并作为策略和授权中的授权条件。 AWS CloudTrail 

# 使用 Amazon EMR 为数据加密创建密钥和证书
<a name="emr-encryption-enable"></a>

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

## 提供加密静态数据的密钥
<a name="emr-encryption-create-keys"></a>

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

本主题介绍可与 Amazon EMR 结合使用的 KMS 密钥的密钥策略详细信息，以及编写适用于 Amazon S3 加密的自定义密钥提供程序类的准则和代码示例。有关创建密钥的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

### AWS KMS keys 用于加密
<a name="emr-awskms-keys"></a>

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

Amazon EC2 实例配置文件的角色必须具有使用您指定的 KMS 密钥的权限。Amazon EMR 中实例配置文件的默认角色是 `EMR_EC2_DefaultRole`。如果您对实例配置文件使用不同的角色，或者对 Amazon S3 的 EMRFS 请求使用 IAM 角色，请确保根据需要将每个角色添加为密钥用户。这会为该角色授予使用该 KMS 密钥的权限。有关更多信息，请参阅*《AWS Key Management Service 开发人员指南》*和[为向 Amazon S3 发出的 EMRFS 请求配置 IAM 角色](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-emrfs-iam-roles.html)中的[使用密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)。

您可以使用将您的实例配置文件或 EC2 实例配置文件 AWS 管理控制台 添加到指定 KMS 密钥的密钥用户列表中，也可以使用 AWS CLI 或 AWS 软件开发工具包来附加相应的密钥策略。

请注意 Amazon EMR 仅支持[对称 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)。不能使用[非对称 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)加密 Amazon EMR 集群中的静态数据。要获取确定 KMS 密钥是对称还是非对称的帮助，请参阅[识别对称密钥和非对称密钥](https://docs.aws.amazon.com/kms/latest/developerguide/find-symm-asymm.html)。

以下步骤介绍了如何使用 AWS 管理控制台将 Amazon EMR 实例配置文件 `EMR_EC2_DefaultRole` 作为*密钥用户*添加。它假定您已创建一个 KMS 密钥。要创建新的 KMS 密钥，请参阅*《AWS Key Management Service 开发人员指南》*中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

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

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/km](https://console.aws.amazon.com/kms) s 处打开 AWS Key Management Service (AWS KMS) 控制台。

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

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

1. 在密钥详细信息页面的 **Key Users (密钥用户)** 下，选择 **Add (添加)**。

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

1. 选择**添加**。

### 通过为 KMS 密钥提供额外的权限来启用 EBS 加密
<a name="emr-awskms-ebs-encryption"></a>

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

您可以使用将服务角色 AWS 管理控制台 添加到指定 KMS 密钥的密钥用户列表中，也可以使用 AWS CLI 或 S AWS DK 来附加相应的密钥策略。

以下过程介绍如何使用将默认 Amazon EMR 服务角色添加`EMR_DefaultRole`为*关键*用户。 AWS 管理控制台 它假定您已创建一个 KMS 密钥。要创建新的 KMS 密钥，请参阅*《AWS Key Management Service 开发人员指南》*中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

**将 Amazon EMR 服务角色添加到加密密钥用户列表中**

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/km](https://console.aws.amazon.com/kms) s 处打开 AWS Key Management Service (AWS KMS) 控制台。

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

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

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

1. 在密钥详细信息页面的 **Key Users (密钥用户)** 下，选择 **Add (添加)**。

1. 在**添加密钥用户**部分，选择适当的角色。Amazon EMR 的默认服务角色的名称为 `EMR_DefaultRole`。

1. 选择**添加**。

### 创建自定义密钥提供程序
<a name="emr-custom-keys"></a>

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

根据您在创建自定义密钥提供程序时使用的加密类型，应用程序还必须实现不同的 EncryptionMaterialsProvider 接口。这两个接口在适用于 Java 的 AWS SDK 版本 1.11.0 及更高版本中都可用。
+ 要实现亚马逊 S3 加密，请使用 [com.amazonaws.services.s3.model。 EncryptionMaterialsProvider 接口](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/EncryptionMaterialsProvider.html)。
+ 要实现本地磁盘加密，请使用 [com.amazonaws.services.elasticmapreduce.spi.security。 EncryptionMaterialsProvider 接口](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/spi/security/EncryptionMaterialsProvider.html)。

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

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

如果您使用的是本地磁盘加密，则用于自定义加密材料的加密算法因 EMR 发行版而异。对于亚马逊 EMR 7.0.0 及更低版本，您必须使用。**AES/GCM/NoPadding**对于 Amazon EMR 7.1.0 及更高版本，您必须使用 **AES**。

该 EncryptionMaterialsProvider 类通过加密上下文获取加密材料。Amazon EMR 在运行时填充加密上下文信息，以帮助调用者确定要返回的正确加密材料。

**Example 示例：通过 EMRFS 使用自定义密钥提供程序对 Amazon S3 进行加密**  
当 Amazon EMR 从EncryptionMaterialsProvider 类中提取加密材料以执行加密时，EMRFS 可以选择在材料描述参数中填充两个字段：对象的 Amazon S3 URI 和 JobFlowId 集群的 URI，该类可以选择性地使用这两个字段来有选择地返回加密材料。EncryptionMaterialsProvider   
例如，提供程序可能会为不同的 Amazon S3 URI 前缀返回不同的密钥。它是最终与 Amazon S3 对象一起存储的返回加密材料的描述，而不是 EMRFS 生成并传递给提供程序的 materialsDescription 值。解密 Amazon S3 对象时，加密材料描述会传递给该EncryptionMaterialsProvider 类，这样它就可以有选择地返回匹配的密钥来解密该对象。  
下面提供了一个 EncryptionMaterialsProvider 参考实现。另一个自定义提供程序可从中获得 GitHub。[EMRFSRSAEncryptionMaterialsProvider](https://github.com/awslabs/emr-sample-apps/tree/master/emrfs-plugins/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 加密来加密传输中的数据提供凭证
<a name="emr-encryption-certificates"></a>

使用 Amazon EMR 发行版 4.8.0 或更高版本，您有两个选项可指定使用安全配置对传输中的数据进行加密的构件：
+ nin 可以手动创建 PEM 凭证，将它们包含一个 zip 文件中，然后在 Amazon S3 中引用该 .zip 文件。
+ 可以将一个自定义凭证提供程序作为 Java 类实现。在 Amazon S3 中指定应用程序的 JAR 文件，然后提供与应用程序声明中相同的完整提供程序类名。该类必须实现从 1.11.0 适用于 Java 的 AWS SDK 版本开始可用的[TLSArtifacts提供者](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/spi/security/TLSArtifactsProvider.html)接口。

Amazon EMR 自动将构件下载到集群中的每个节点，然后使用它们实现开源传输中加密功能。有关可用选项的更多信息，请参阅[传输中加密](emr-data-encryption-options.md#emr-encryption-intransit)。

### 使用 PEM 凭证
<a name="emr-encryption-pem-certificate"></a>

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


**传输中加密凭证**  

| 文件名 | 必需/可选 | Details | 
| --- | --- | --- | 
| privateKey.pem | 必需 | 私有密钥 | 
| certificateChain.pem | 必需 | 凭证链 | 
| trustedCertificates.pem | 可选 | 建议您提供未经 Java 默认受信任根证书颁发机构（CA）或可链接到 Java 默认受信任根 CA 的中间 CA 签名的证书。我们不建议您在使用通配符证书或禁用主机名验证 CAs时使用 public。 | 

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

如果加密工件中提供的 PEM 文件在公用名中没有该域的通配符，则必须将的`hadoop.ssl.hostname.verifier`值更改为。`ALLOW_ALL`要在 Amazon EMR 7.3.0 及更高版本中执行此操作，请在向集群提交配置时添加 `core-site` 分类。在低于 7.3.0 的版本中，将配置 `"hadoop.ssl.hostname.verifier": "ALLOW_ALL"` 直接添加到 `core-site.xml` 文件中。必须进行此更改，因为默认主机名验证程序要求主机名不带通配符，而集群中的所有主机都使用通配符。有关 Amazon VPC 中的 EMR 集群配置的更多信息，请参阅 [在 VPC 中为 Amazon EMR 配置联网](emr-plan-vpc-subnet.md)。

以下示例演示如何使用 [OpenSSL](https://www.openssl.org/) 生成具有 2048 位 RSA 私钥的自签名 X.509 证书。该密钥允许访问发布者在 `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:2048 -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
```

# 了解传输中加密
<a name="emr-encryption-support-matrix"></a>

您可以配置 EMR 集群来运行 [Apache Spark](https://aws.amazon.com/emr/features/spark/)、[Apache Hive](https://aws.amazon.com/emr/features/hive/) 和 [Presto](https://aws.amazon.com/emr/features/presto/) 等开源框架。这些开源框架各有一组在集群的 EC2 实例上运行的进程。这些进程中的每一个都可以托管用于网络通信的网络端点。

如果在 EMR 集群上启用了传输中加密，不同的网络端点将使用不同的加密机制。请参阅以下部分，了解有关传输中加密支持的特定开源框架网络端点、相关加密机制以及哪个 Amazon EMR 发行版添加了该支持的更多信息。每个开源应用程序还可能有不同的最佳实践和您可以更改的开源框架配置。

 为了获得最大的传输中加密覆盖范围，我们建议您同时启用传输中加密和 Kerberos。如果您仅启用传输中加密，则传输中加密仅适用于支持 TLS 的网络端点。之所以需要 Kerberos，是因为某些开源框架网络端点使用简单身份验证和安全层（SASL）进行传输中加密。

请注意，不包括 Amazon EMR 7.x.x 发行版中不支持的任何开源框架。

## Spark
<a name="emr-encryption-support-matrix-spark"></a>

在安全配置中启用传输中加密时，`spark.authenticate` 会自动设置为 `true` 并对 RPC 连接使用基于 AES 的加密。

从 Amazon EMR 7.3.0 开始，如果使用传输中加密和 Kerberos 身份验证，则无法使用依赖于 Hive 元存储的 Spark 应用程序。Hive 3 在 [HIVE-16340](https://issues.apache.org/jira/browse/HIVE-16340) 中修复了此问题。当开源 Spark 可以升级到 Hive 3 时，[HIVE-44114](https://issues.apache.org/jira/browse/SPARK-44114) 可完全解决此问题。同时，您可以将 `hive.metastore.use.SSL` 设置为 `false` 以解决此问题。有关更多信息，请参阅[配置应用程序](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。

有关更多信息，请参阅 Apache Spark 文档中的 [Spark 安全性](https://spark.apache.org/docs/latest/security)。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  Spark 历史记录服务器  |  ssl.history.port  |  18480  |  TLS  |  emr-5.3.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  火花用户界面  |  spark.ui.port  |  4440  |  TLS  |  emr-5.3.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  Spark 驱动程序  |  spark.driver.port  |  动态  |  Spark AES 加密  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  Spark 执行程序  |  执行程序端口（无命名配置）  |  动态  |  Spark AES 加密  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  纱线 NodeManager  |  spark.shuffle.service.port1  |  7337  |  Spark AES 加密  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 

1 托管`spark.shuffle.service.port`在 YARN 上 NodeManager ，但只有 Apache Spark 使用。

**已知问题**

在启用传输的集群上，`spark.yarn.historyServer.address` 配置当前正在使用端口 `18080`，这会阻止使用 YARN 跟踪 URL 访问 Spark 应用程序 UI。**影响版本：**EMR - 7.3.0 到 EMR - 7.9.0。

使用以下解决方法：

1. 修改 `/etc/spark/conf/spark-defaults.conf` 中的 `spark.yarn.historyServer.address` 配置以在正在运行的集群上使用 `HTTPS` 端口号 `18480`。

1. 这也可以在启动集群时在配置覆盖中提供。

示例配置：

```
[
                               {
                                 "Classification": "spark-defaults",
                                 "Properties": {
                                     "spark.yarn.historyServer.address": "${hadoopconf-yarn.resourcemanager.hostname}:18480"
                                 }
                               }
  
                               ]
```

## Hadoop YARN
<a name="emr-encryption-support-matrix-hadoop-yarn"></a>

[Secure Hadoop RPC](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html#Data_Encryption_on_RPC) 设置为 `privacy`，使用基于 SASL 的传输中加密。这需要在安全配置中启用 Kerberos 身份验证。如果不想对 Hadoop RPC 进行传输中加密，请配置 `hadoop.rpc.protection = authentication`。建议使用默认配置，以获得最大的安全性。

如果 TLS 证书不符合 TLS 主机名验证要求，则可以配置 `hadoop.ssl.hostname.verifier = ALLOW_ALL`。建议使用 `hadoop.ssl.hostname.verifier = DEFAULT` 的默认配置，即强制执行 TLS 主机名验证。

要禁用 YARN Web 应用程序端点的 HTTPS，请配置 `yarn.http.policy = HTTP_ONLY`。这样，这些端点的流量就不会加密。建议使用默认配置，以获得最大的安全性。

有关更多信息，请参阅 Apache Hadoop 文档中的 [Hadoop in secure mode](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html)（安全模式下的 Hadoop）。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
| ResourceManager |  yarn.resourcemanager.webapp.address  |  8088  |  TLS  |  emr-7.3.0\$1  | 
| ResourceManager |  yarn.resourcemanager.resource-tracker.address  |  8025  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
| ResourceManager |  yarn.resourcemanager.scheduler.address  |  8030  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
| ResourceManager |  yarn.resourcemanager.address  |  8032  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
| ResourceManager |  yarn.resourcemanager.admin.address  |  8033  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
| TimelineServer |  yarn.timeline-service.address  |  10200  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
| TimelineServer |  yarn.timeline-service.webapp.address  |  8188  |  TLS  |  emr-7.3.0\$1  | 
|  WebApplicationProxy  |  yarn.web-proxy.address  |  20888  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  NodeManager  |  yarn.nodemanager.address  |  8041  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  NodeManager  |  yarn.nodemanager.localizer.address  |  8040  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  NodeManager  |  yarn.nodemanager.webapp.address  |  8044  |  TLS  |  emr-7.3.0\$1  | 
|  NodeManager  |  mapreduce.shuffle.port1  |  13562  |  TLS  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  NodeManager  |  spark.shuffle.service.port2  |  7337  |  Spark AES 加密  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 

1 托管`mapreduce.shuffle.port`在 YARN 上 NodeManager ，但只有 Hadoop MapReduce 使用。

2 托管`spark.shuffle.service.port`在 YARN 上 NodeManager ，但只有 Apache Spark 使用。

**已知问题**

`yarn.log.server.url` 配置当前使用 HTTP 和端口 19888，这阻止了从资源管理器 UI 访问应用程序日志。**影响版本：**EMR - 7.3.0 到 EMR - 7.8.0。

使用以下解决方法：

1. 修改 `yarn-site.xml` 中的 `yarn.log.server.url` 配置以使用 `HTTPS` 协议和端口号 `19890`。

1. 重启 YARN 资源管理器：`sudo systemctl restart hadoop-yarn-resourcemanager.service`。

## Hadoop HDFS
<a name="emr-encryption-support-matrix-hadoop-hdfs"></a>

如果在 EMR 集群中启用了传输中加密，Hadoop 名称节点、数据节点和日志节点默认都支持 TLS。

[Secure Hadoop RPC](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html#Data_Encryption_on_RPC) 设置为 `privacy`，使用基于 SASL 的传输中加密。这需要在安全配置中启用 Kerberos 身份验证。

建议保留用于 HTTPS 端点的默认端口。

[HDFS 块传输的数据加密使用](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html#Data_Encryption_on_Block_data_transfer.) AES 256，要求在安全配置中启用静态加密。

有关更多信息，请参阅 Apache Hadoop 文档中的 [Hadoop in secure mode](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html)（安全模式下的 Hadoop）。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  Namenode  |  dfs.namenode.https-address  |  9871  |  TLS  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  Namenode  |  dfs.namenode.rpc-address  |  8020  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  Datanode  |  dfs.datanode.https.address  |  9865  |  TLS  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  Datanode  |  dfs.datanode.address  |  9866  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  Journal Node  |  dfs.journalnode.https-address  |  8481  |  TLS  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  Journal Node  |  dfs.journalnode.rpc-address  |  8485  |  SASL \$1 Kerberos  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  DFSZKFailover控制器  |  dfs.ha.zkfc.port  |  8019  |  无  |  只有 Hadoop 3.4.0 支持 TLS for ZKFC。有关更多信息，请参阅 [HADOOP-18919](https://issues.apache.org/jira/browse/HADOOP-18919)。Amazon EMR 7.1.0 目前在 Hadoop 3.3.6 上运行。未来将在 Hadoop 3.4.0 上运行的更高 Amazon EMR 版本  | 

## Hadoop MapReduce
<a name="emr-encryption-support-matrix-hadoop-mapreduce"></a>

在 EMR 集群中启用传输加密时 MapReduce，Hadoop、任务历史服务器和 sh MapReduce uffle 默认都支持 TLS。

[Hadoop MapReduce 加密的随机播放使用](https://hadoop.apache.org/docs/r2.7.1/hadoop-mapreduce-client/hadoop-mapreduce-client-core/EncryptedShuffle.html) TLS。

建议保留用于 HTTPS 端点的默认端口。

有关更多信息，请参阅 Apache Hadoop 文档中的 [Hadoop in secure mode](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html)（安全模式下的 Hadoop）。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  JobHistoryServer  |  mapreduce.jobhistory.webapp.https.address  |  19890  |  TLS  |  emr-7.3.0\$1  | 
|  纱线 NodeManager  |  mapreduce.shuffle.port1  |  13562  |  TLS  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 

1 托管`mapreduce.shuffle.port`在 YARN 上 NodeManager ，但只有 Hadoop MapReduce 使用。

## ：Presto
<a name="emr-encryption-support-matrix-presto"></a>

在 Amazon EMR 5.6.0 及更高版本中，Presto 协调器和工作线程之间的内部通信使用 TLS，Amazon EMR 会设置所有必需的配置，以便在 Presto 中启用[安全内部通信](https://prestodb.io/docs/current/security/internal-communication.html)。

如果连接器使用 Hive 元存储作为元数据存储，则通信器与 Hive 元存储之间的通信也使用 TLS 加密。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  Presto Coordinator  |  http-server.https.port  |  8446  |  TLS  |  emr-5.6.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 
|  Presto Worker  |  http-server.https.port  |  8446  |  TLS  |  emr-5.6.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 

## Trino
<a name="emr-encryption-support-matrix-trino"></a>

在 Amazon EMR 6.1.0 及更高版本中，Presto 协调器和工作线程之间的内部通信使用 TLS，Amazon EMR 会设置所有必需的配置，以便在 Presto 中启用[安全内部通信](https://trino.io/docs/current/security/internal-communication.html)。

如果连接器使用 Hive 元存储作为元数据存储，则通信器与 Hive 元存储之间的通信也使用 TLS 加密。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  Trino Coordinator  |  http-server.https.port  |  8446  |  TLS  |  emr-6.1.0\$1、emr-7.0.0\$1  | 
|  Trino Worker  |  http-server.https.port  |  8446  |  TLS  |  emr-6.1.0\$1、emr-7.0.0\$1  | 

## Hive 和 Tez
<a name="emr-encryption-support-matrix-hive-tez"></a>

默认情况下，在 EMR 集群中启用传输中加密时，Hive 服务器 2、Hive 元存储服务器、Hive LLAP Daemon Web UI 和 Hive LLAP shuffle 都支持 TLS。有关 Hive 配置的更多信息，请参阅[配置属性](https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties)。

当 EMR 集群启用传输中加密时，Tomcat 服务器上托管的 Tez UI 也会启用 HTTPS。但是，Tez AM Web UI 服务禁用了 HTTPS，因此 AM 用户无权访问打开的 SSL 侦听器的密钥库文件。您还可以使用布尔配置 `tez.am.tez-ui.webservice.enable.ssl` 和 `tez.am.tez-ui.webservice.enable.client.auth` 来启用此行为。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  HiveServer2  |  hive.server2.thrift.port  |  10000  |  TLS  |  emr-6.9.0\$1、emr-7.0.0\$1  | 
|  HiveServer2  |  hive.server2.thrift.http.port  |  10001  |  TLS  |  emr-6.9.0\$1、emr-7.0.0\$1  | 
|  HiveServer2  |  hive.server2.webui.port  |  10002  |  TLS  |  emr-7.3.0\$1  | 
|  HiveMetastoreServer  |  hive.metastore.port  |  9083  |  TLS  |  emr-7.3.0\$1  | 
|  LLAP Daemon  |  hive.llap.daemon.yarn.shuffle.port  |  15551  |  TLS  |  emr-7.3.0\$1  | 
|  LLAP Daemon  |  hive.llap.daemon.web.port  |  15002  |  TLS  |  emr-7.3.0\$1  | 
|  LLAP Daemon  |  hive.llap.daemon.output.service.port  |  15003  |  无  |  Hive 不支持此端点的传输中加密  | 
|  LLAP Daemon  |  hive.llap.management.rpc.port  |  15004  |  无  |  Hive 不支持此端点的传输中加密  | 
|  LLAP Daemon  |  hive.llap.plugin.rpc.port  |  动态  |  无  |  Hive 不支持此端点的传输中加密  | 
|  LLAP Daemon  |  hive.llap.daemon.rpc.port  |  动态  |  无  |  Hive 不支持此端点的传输中加密  | 
|  网页 HCat  |  templeton.port  |  50111  |  TLS  |  emr-7.3.0\$1  | 
|  Tez Application Master  |  tez.am.client.am.port-range tez.am.task.am.port-range  |  动态  |  无  |  Tez 不支持此端点的传输中加密  | 
|  Tez Application Master  |  tez.am.tez-ui.webservice.port-range  |  动态  |  无  |  默认情况下禁用。可使用 emr-7.3.0\$1 中的 Tez 配置启用  | 
|  Tez Task  |  不适用：不可配置  |  动态  |  无  |  Tez 不支持此端点的传输中加密  | 
|  Tez UI  |  可通过托管 Tez UI 的 Tomcat 服务器来配置  |  8080  |  TLS  |  emr-7.3.0\$1  | 

## Flink
<a name="emr-encryption-support-matrix-flink"></a>

 在 EMR 集群中启用传输中加密时，Apache Flink REST 端点和 Flink 进程之间的内部通信默认支持 TLS。

 [https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/config/#security-ssl-internal-enabled](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/config/#security-ssl-internal-enabled) 设置为 `true`，对 Flink 进程之间的内部通信使用传输中加密。如果不想在内部通信中使用传输中加密，请禁用该配置。建议使用默认配置，以获得最大的安全性。

 Amazon EMR 将 [https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/config/#security-ssl-rest-enabled](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/config/#security-ssl-rest-enabled) 设置为 `true`，并对 REST 端点使用传输中加密。此外，Amazon EMR 还将 [https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/config/#historyserver-web-ssl-enabled](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/config/#historyserver-web-ssl-enabled) 设置为 true，以便与 Flink History Server 进行 TLS 通信。如果不想对 REST 点进行传输中加密，请禁用这些配置。建议使用默认配置，以获得最大的安全性。

Amazon EMR 使用 [https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/config/#security-ssl-algorithms](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/config/#security-ssl-algorithms) 来指定使用基于 AES 加密的密码列表。覆盖此配置以使用所需的密码。

有关更多信息，请参阅 Flink 文档中的 [SSL 设置](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/security/security-ssl/)。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  Flink History Server  |  historyserver.web.port  |  8082  |  TLS  |  emr-7.3.0\$1  | 
|  Job Manager Rest Server  |  rest.bind-port rest.port  |  动态  |  TLS  |  emr-7.3.0\$1  | 

## HBase
<a name="emr-encryption-support-matrix-hbase"></a>

 亚马逊 EMR 将 S [ecure Hadoop](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html#Data_Encryption_on_RPC) RPC 设置为。`privacy` HMaster 并 RegionServer 使用基于 SASL 的传输中加密。这需要在安全配置中启用 Kerberos 身份验证。

Amazon EMR 将 `hbase.ssl.enabled` 设置为 true，对 UI 端点使用 TLS。如果您不想对 UI 端点使用 TLS，请禁用此配置。建议使用默认配置，以获得最大的安全性。

Amazon EMR 设置了 `hbase.rest.ssl.enabled` 和 `hbase.thrift.ssl.enabled`，分别对 REST 和 Thirft 服务器端点使用 TLS。如果您不想对这些端点使用 TLS，请禁用此配置。建议使用默认配置，以获得最大的安全性。

从 EMR 7.6.0 开始，端点上支持 TLS。 HMaster RegionServer Amazon EMR 还设置 `hbase.server.netty.tls.enabled` 和 `hbase.client.netty.tls.enabled`。如果不想对这些端点使用 TLS，请禁用此配置。我们建议您使用默认配置，该配置提供加密功能，从而提供更高的安全性。要了解更多信息，请参阅《*Apache HBase 参考*指南》[中的 HBase RPC 通信中的传输级别安全 (TLS)](https://hbase.apache.org/book.html#_transport_level_security_tls_in_hbase_rpc_communication)。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  HMaster  |  HMaster  |  16000  |  SASL \$1 Kerberos TLS  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1 和 emr-7.0.0\$1 中的 SASL \$1 Kerberos emr-7.6.0\$1 中的 TLS  | 
|  HMaster  |  HMaster 用户界面  |  16010  |  TLS  |  emr-7.3.0\$1  | 
|  RegionServer  |  RegionServer  |  16020  |  SASL \$1 Kerberos TLS  |  emr-4.8.0\$1、emr-5.0.0\$1、emr-6.0.0\$1 和 emr-7.0.0\$1 中的 SASL \$1 Kerberos emr-7.6.0\$1 中的 TLS  | 
|  RegionServer  |  RegionServer 信息  |  16030  |  TLS  |  emr-7.3.0\$1  | 
|  HBase 休息服务器  |  Rest Server  |  8070  |  TLS  |  emr-7.3.0\$1  | 
|  HBase 休息服务器  |  Rest UI  |  8085  |  TLS  |  emr-7.3.0\$1  | 
|  Hbase Thrift Server  |  Thrift Server  |  9090  |  TLS  |  emr-7.3.0\$1  | 
|  Hbase Thrift Server  |  Thrift Server UI  |  9095  |  TLS  |  emr-7.3.0\$1  | 

## Phoenix
<a name="emr-encryption-support-matrix-phoenix"></a>

 如果您在 EMR 集群中启用了传输中加密，Phoenix Query Server 将支持 TLS `phoenix.queryserver.tls.enabled` 属性，该属性默认设置为 `true`。

要了解更多信息，请参阅 Phoenix Query Server 文档中 [HTTPS 相关的配置](https://phoenix.apache.org/server.html#Configuration)。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  Query Server  |  phoenix.queryserver.http.port  |  8765  |  TLS  |  emr-7.3.0\$1  | 

## Oozie
<a name="emr-encryption-support-matrix-oozie"></a>

如果您在 Amazon EMR 7.3.0 及更高版本上运行 Oozie，则 [OOZIE-3673](https://issues.apache.org/jira/browse/OOZIE-3673) 可在 Amazon EMR 上使用。如果在运行电子邮件操作时需要配置自定义 SSL 或 TLS 协议，则可以在 `oozie-site.xml` 文件中设置 `oozie.email.smtp.ssl.protocols` 属性。默认情况下，如果启用了传输中加密，Amazon EMR 将使用 TLS v1.3 协议。

如果您在 Amazon EMR 7.3.0 及更高版本上运行 Oozie，则 [OOZIE-3677](https://issues.apache.org/jira/browse/OOZIE-3677) 和 [OOZIE-3674](https://issues.apache.org/jira/browse/OOZIE-3674) 可在 Amazon EMR 上使用。这允许在 `oozie-site.xml` 中指定属性 `keyStoreType` 和 `trustStoreType`。OOZIE-3674 将参数 `--insecure` 添加到 Oozie 客户端，这样就可以忽略证书错误。

Oozie 强制执行 TLS 主机名验证，这意味着任何用于传输中加密的证书都必须满足主机名验证要求。如果证书不符合标准，集群可能会在 Amazon EMR 预置集群的 `oozie share lib update` 阶段卡住。建议您更新证书，确保其符合主机名验证要求。但如果无法更新证书，则可以在集群配置中将 `oozie.https.enabled` 属性设置为 `false`，为 Oozie 禁用 SSL。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  EmbeddedOozieServer  |  oozie.https.port  |  11443  |  TLS  |  emr-7.3.0\$1  | 
|  EmbeddedOozieServer  |  oozie.email.smtp.port  |  25  |  TLS  |  emr-7.3.0\$1  | 

## Hue
<a name="emr-encryption-support-matrix-hue"></a>

默认情况下，当 Amazon EMR 集群中启用传输中加密时，Hue 支持 TLS。有关 Hue 配置的更多信息，请参阅 [Configure Hue with HTTPS / SSL](https://gethue.com/configure-hue-with-https-ssl/)。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  Hue  |  http\$1port  |  8888  |  TLS  |  emr-7.4.0\$1  | 

## Livy
<a name="emr-encryption-support-matrix-livy"></a>

默认情况下，当 Amazon EMR 集群中启用传输中加密时，Livy 支持 TLS。有关 Livy 配置的更多信息，请参阅[使用 Apache Livy 启用 HTTPS](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/enabling-https.html)。

从 Amazon EMR 7.3.0 开始，如果使用传输中加密和 Kerberos 身份验证，则不能将 Livy 服务器用于依赖于 Hive 元存储的 Spark 应用程序。此问题已在 [HIVE-16340](https://issues.apache.org/jira/browse/HIVE-16340) 中修复，当开源 Spark 应用程序可以升级到 Hive 3 时，此问题将在 [SPARK-44114](https://issues.apache.org/jira/browse/SPARK-44114) 中完全解决。同时，您可以将 `hive.metastore.use.SSL` 设置为 `false` 来解决此问题。有关更多信息，请参阅[配置应用程序](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。

有关更多信息，请参阅[使用 Apache Livy 启用 HTTPS](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/enabling-https.html)。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  livy-server  |  livy.server.port  |  8998  |  TLS  |  emr-7.4.0\$1  | 

## JupyterEnterpriseGateway
<a name="emr-encryption-matrix-jupyter-enterprise"></a>

默认情况下，当 Amazon EMR 集群中启用传输中加密时，Jupyter Enterprise Gateway 支持 TLS。有关 Jupyter Enterprise Gateway 配置的更多信息，请参阅 [Securing Enterprise Gateway Server](https://jupyter-enterprise-gateway.readthedocs.io/en/v1.2.0/getting-started-security.html#securing-enterprise-gateway-server)。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  jupyter\$1enterprise\$1gateway  |  c. EnterpriseGatewayApp .port  |  9547  |  TLS  |  emr-7.4.0\$1  | 

## JupyterHub
<a name="emr-encryption-matrix-jupyter-hub"></a>

默认情况下，在 Amazon EMR 集群中启用传输中加密时 JupyterHub 支持 TLS。有关更多信息，请参阅 JupyterHub 文档中的[启用 SSL 加密](https://jupyterhub.readthedocs.io/en/latest/tutorial/getting-started/security-basics.html#enabling-ssl-encryption)。建议不要禁用加密。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  jupyter\$1hub  |  c. JupyterHub .port  |  9443  |  TLS  |  emr-5.14.0\$1、emr-6.0.0\$1、emr-7.0.0\$1  | 

## Zeppelin
<a name="emr-encryption-matrix-zeppelin"></a>

 默认情况下，当您在 EMR 集群中启用传输中加密时，Zeppelin 支持 TLS。有关 Zeppelin 配置的更多信息，请参阅 Zeppelin 文档中的 [SSL 配置](https://zeppelin.apache.org/docs/0.11.1/setup/operation/configuration.html#ssl-configuration)。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  zeppelin  |  zeppelin.server.ssl.port  |  8890  |  TLS  |  7.3.0\$1  | 

## Zookeeper
<a name="emr-encryption-matrix-zookeeper"></a>

Amazon EMR 将 `serverCnxnFactory` 设置为 `org.apache.zookeeper.server.NettyServerCnxnFactory`，以为 Zookeeper 仲裁和客户端通信启用 TLS。

`secureClientPort` 指定侦听 TLS 连接的端口。如果客户端不支持与 Zookeeper 的 TLS 连接，则客户端可以连接到 `clientPort` 中指定的 2181 不安全端口。您可以覆盖或禁用这两个端口。

Amazon EMR 会将 `sslQuorum` 和 `admin.forceHttps` 都设置为 `true`，以为仲裁和管理服务器启用 TLS 通信。如果您不希望对仲裁和管理服务器进行传输中加密，可以禁用这些配置。建议使用默认配置，以获得最大的安全性。

有关更多信息，请参阅 Zookeeper 文档中的 [Encryption, Authentication, Authorization Options](https://zookeeper.apache.org/doc/r3.9.2/zookeeperAdmin.html#sc_authOptions)。


| 组件 | 端点 | 端口： | 传输中加密机制 | 发行版支持 | 
| --- | --- | --- | --- | --- | 
|  Zookeeper Server  |  secureClientPort  |  2281  |  TLS  |  emr-7.4.0\$1  | 
|  Zookeeper Server  |  仲裁端口  |  有 2 个： 跟随节点使用 2888 连接到领导节点。 领导节点选择使用 3888  |  TLS  |  emr-7.4.0\$1  | 
|  Zookeeper Server  |  admin.serverPort  |  8341  |  TLS  |  emr-7.4.0\$1  | 