

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

# 对 Amazon EMR 集群节点进行身份验证
<a name="emr-authenticate-cluster-connections"></a>

SSH 客户端可以使用 Amazon EC2 密钥对来对集群实例进行身份验证。或者，使用 Amazon EMR 版本 5.10.0 或更高版本，可以配置 Kerberos 来对用户和到主节点的 SSH 连接进行身份验证。而且，在 Amazon EMR 5.12.0 及更高版本中，您可以使用 LDAP 进行身份验证。

**Topics**
+ [对 Amazon EMR 的 SSH 凭证使用 EC2 密钥对](emr-plan-access-ssh.md)
+ [使用 Kerberos 通过 Amazon EMR 进行身份验证](emr-kerberos.md)
+ [使用 Active Directory 或 LDAP 服务器通过 Amazon EMR 进行身份验证。](ldap.md)

# 对 Amazon EMR 的 SSH 凭证使用 EC2 密钥对
<a name="emr-plan-access-ssh"></a>

Amazon EMR 集群节点在 Amazon EC2 实例上运行。您可以通过连接到 Amazon EC2 实例的相同方式连接到集群节点。您可以使用 Amazon EC2 创建密钥对，或者导入密钥对。在创建集群时，您可以指定用于通过 SSH 连接到所有集群实例的 Amazon EC2 密钥对。您也可以在没有密钥对的情况下创建集群。这通常适用于瞬态集群：这种集群启动、运行步骤、然后自动终止。

用于连接到集群的 SSH 客户端需要使用与此密钥对关联的私有密钥文件。这是用于使用 Linux、Unix 和 macOS 的 SSH 客户端的 .pem 文件。您必须设置权限，以便只有密钥所有者才具有访问该文件的权限。这是一个用于使用 Windows 的 SSH 客户端的 .ppk 文件，而此 .ppk 文件通常从 .pem 文件创建。
+ 有关创建 Amazon EC2 密钥对的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。
+ *有关使用 Pu TTYgen 从.pem 文件创建.ppk 文件的说明，请参阅 TTYgen Amazon EC2 用户指南[中的使用 Pu 转换私钥](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html#putty-private-key)。*
+ 有关设置.pem 文件权限以及如何使用不同方法（包括从 `ssh` Linux 或 macOS、来自 Windows 的 PuTTY 或任何支持的操作系统）连接到 EMR 集群的主节点的更多信息，请参阅 AWS CLI 。[使用 SSH 连接到 Amazon EMR 集群主节点](emr-connect-master-node-ssh.md)

# 使用 Kerberos 通过 Amazon EMR 进行身份验证
<a name="emr-kerberos"></a>

Amazon EMR 5.10.0 及更高版本支持 Kerberos。Kerberos 是一种网络身份验证协议，使用私有密钥加密来提供强大的身份验证，以便不会通过网络以未加密的格式发送密码或其他凭证。

在 Kerberos 中，需要进行身份验证的服务和用户称为*委托人*。委托人存在于 Kerberos *领域* 中。在该领域中，被称为*密钥分发中心 (KDC)* 的 Kerberos 服务器为委托人提供身份验证方法。KDC 通过颁发用于身份验证的*票证* 来执行此操作。KDC 维护一个包含其领域中的委托人、它们的密码及其它有关每个委托人的管理信息的数据库。KDC 还可以接受来自其它领域中的委托人的身份验证凭证，这称为*跨领域信任*。此外，EMR 集群可以使用外部 KDC 对委托人进行身份验证。

建立跨域信任或创建外部 KDC 的一种常见场景是从 Active Directory 域对用户进行身份验证。这允许用户在使用 SSH 连接到集群或者使用大数据应用程序时，通过其域账户访问 EMR 集群。

在使用 Kerberos 身份验证时，Amazon EMR 为集群上安装的应用程序、组件和子系统配置 Kerberos，以便它们可以相互进行身份验证。

**重要**  
Amazon EMR 不支持 AWS Directory Service for Microsoft Active Directory 跨领域信任或作为外部 KDC。

在使用 Amazon EMR 配置 Kerberos 之前，我们建议您熟悉 Kerberos 概念、KDC 上运行的服务和用于管理 Kerberos 服务的工具。有关更多信息，请参阅 [MIT Kerberos 文档](http://web.mit.edu/kerberos/krb5-latest/doc/)，这由 [Kerberos Consortium](http://kerberos.org/) 发布。

**Topics**
+ [Amazon EMR 支持的应用程序](emr-kerberos-principals.md)
+ [Amazon EMR 的 Kerberos 架构选项](emr-kerberos-options.md)
+ [在 Amazon EMR 上配置 Kerberos](emr-kerberos-configure.md)
+ [使用 SSH 通过 Amazon EMR 连接到 Kerberos 集群](emr-kerberos-connect-ssh.md)
+ [教程：使用 Amazon EMR 配置集群专用的 KDC](emr-kerberos-cluster-kdc.md)
+ [教程：配置与 Active Directory 域的跨领域信任](emr-kerberos-cross-realm.md)

# Amazon EMR 支持的应用程序
<a name="emr-kerberos-principals"></a>

在 EMR 集群中，Kerberos 委托人是所有集群节点上运行的大数据应用程序服务和子系统。Amazon EMR 可以将下面列出的应用程序和组件配置为使用 Kerberos。每个应用程序都与一个 Kerberos 用户委托人相关联。

Amazon EMR 不支持使用 AWS Directory Service for Microsoft Active Directory的跨领域信任。

Amazon EMR 只为下列应用程序和组件配置开源 Kerberos 身份验证功能。安装的任何其它应用程序不使用 Kerberos，这可能导致无法与使用 Kerberos 的组件通信并引发应用程序错误。不使用 Kerberos 的应用程序和组件没有启用身份验证。受支持的应用程序和组件可能因 Amazon EMR 版本而异。

Livy 用户界面是 Kerberized 的集群上托管的唯一 Web 用户界面。
+ **Hadoop MapReduce**
+ **Hbase**
+ **HCatalog**
+ **HDFS**
+ **Hive**
  + 不要启用使用 LDAP 身份验证的 Hive。这可能会导致与使用 Kerberos 的 YARN 通信时出现问题。
+ **Hue**
  + 不会自动设置 Hue 用户身份验证，但可以使用配置 API 进行配置。
  + Hue 服务器使用 Kerberos。未配置 Hue 前端 (UI) 的身份验证。可以为 Hue UI 配置 LDAP 身份验证。
+ **Livy**
  + Amazon EMR 版本 5.22.0 及更高版本支持使用 Kerberos 集群进行 Livy 模拟。
+ **Oozie**
+ **Phoenix**
+ **：Presto**
  + Presto 在 Amazon EMR 6.9.0 及更高版本中支持 Kerberos 身份验证。
  + 要对 Presto 使用 Kerberos 身份验证，必须启用[传输中加密](emr-data-encryption-options.md#emr-encryption-intransit)。
+ **Spark**
+ **Tez**
+ **Trino**
  + Trino 在 Amazon EMR 6.11.0 及更高版本中支持 Kerberos 身份验证。
  + 要对 Trino 使用 Kerberos 身份验证，必须启用[传输中加密](emr-data-encryption-options.md#emr-encryption-intransit)。
+ **YARN**
+ **Zeppelin**
  + Zeppelin 仅配置为将 Kerberos 与 Spark 解释器结合使用。它未配置其它解释器。
  + 除 Spark 之外，使用 Kerberos 的 Zeppelin 解释器不支持用户模拟。
+ **Zookeeper**
  + 不支持 Zookeeper 客户端。

# Amazon EMR 的 Kerberos 架构选项
<a name="emr-kerberos-options"></a>

在您将 Kerberos 与 Amazon EMR 结合使用时，可以从此部分中列出的架构进行选择。不论选择什么架构，您都使用相同步骤来配置 Kerberos。您需要创建安全配置，在创建集群时指定安全配置和兼容的集群特定 Kerberos 选项，并为集群上与 KDC 中集群委托人用户匹配的 Linux 用户创建 HDFS 目录。有关各个架构的配置选项及示例配置的说明，请参阅[在 Amazon EMR 上配置 Kerberos](emr-kerberos-configure.md)。

## 集群专用 KDC（主节点上的 KDC）
<a name="emr-kerberos-localkdc-summary"></a>

此配置在 Amazon EMR 版本 5.10.0 及更高版本中提供。

![\[Amazon EMR集群 architecture with master node, core nodes, and task node within a Kerberos realm.\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/kerb-cluster-dedicated-kdc.png)


**优点**
+ Amazon EMR 具有 KDC 的完整所有权。
+ EMR 集群上的 KDC 独立于集中 KDC 实现，例如 Microsoft Active Directory 或 AWS Managed Microsoft AD。
+ 性能影响降到最低，因为 KDC 仅对集群中的本地节点管理身份验证。
+ （可选）其它使用 Kerberos 的集群可以引用 KDC 作为外部 KDC。有关更多信息，请参阅[外部 KDC：不同集群上的主节点](#emr-kerberos-extkdc-cluster-summary)。

**注意事项和限制**
+ 使用 Kerberos 的集群无法彼此进行身份验证，因此应用程序无法互操作。如果集群应用程序需要互操作，您必须在集群之间建立跨领域信任，或者将一个集群设置为另一个集群的外部 KDC。如果建立了跨领域信任，则 KDCs 必须具有不同的 Kerberos 领域。
+ 在主节点的 EC2 实例上，您必须创建与 KDC 用户主体相对应的 Linux 用户，以及各个用户的 HDFS 目录。
+ 用户委托人必须使用 EC2 私有密钥文件和 `kinit` 凭证以通过 SSH 连接到集群。

## 跨领域信任
<a name="emr-kerberos-crossrealm-summary"></a>

在此配置中，来自不同 Kerberos 领域的委托人（通产是用户）对使用 Kerberos 的 EMR 集群（具有自己的 KDC）上的应用程序组件进行身份验证。主节点上的 KDC 使用两个节点中都存在的*跨领域主体*与另一个 KDC 建立信任关系。 KDCs各个 KDC 中的委托人名称和密码完全匹配。跨领域信任在 Active Directory 实现中最常见，如下图所示。还支持与外部 MIT KDC 或其它 Amazon EMR 集群上的 KDC 的跨领域信任。

![\[Amazon EMR clusters in different Kerberos realms with cross-realm trust to Active Directory.\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/kerb-cross-realm-trust.png)


**优点**
+ 安装 KDC 的 EMR 集群上维护对 KDC 的完整所有权。
+ 使用 Active Directory，Amazon EMR 自动创建与来自 KDC 的用户委托人相对应的 Linux 用户。您仍必须为每个用户创建 HDFS 目录。此外，Active Directory 域中的用户委托人可以使用 `kinit` 凭证，访问使用 Kerberos 的集群，而无需 EC2 私有密钥文件。这消除了在集群用户之间共享私有密钥文件的需求。
+ 由于各个集群 KDC 管理集群中节点的身份验证，将大量跨集群节点的网络延迟和处理开销的影响减到了最小。

**注意事项和限制**
+ 如果您使用 Active Directory 领域建立信任，则必须提供 Active Directory 用户名和密码，在您在创建集群时，该用户应有权将委托人加入域。
+ 无法在具有相同名称的 Kerberos 领域之间建立跨领域信任。
+ 跨领域信任必须明确建立。例如，如果集群 A 和集群 B 均与 KDC 建立了跨领域信任，则不会继承彼此的信任，并且其应用程序无法彼此进行身份验证来实现互操作。
+ KDCs 必须独立维护和协调，以便用户主体的凭据精确匹配。

## 外部 KDC
<a name="emr-kerberos-extkdc-summary"></a>

Amazon EMR 5.20.0 及更高版本支持具有外部 KDC 的配置。
+ [外部 KDC：麻省理工学院（MIT）KDC](#emr-kerberos-extkdc-mit-summary)
+ [外部 KDC：不同集群上的主节点](#emr-kerberos-extkdc-cluster-summary)
+ [外部 KDC：不同集群上的集群 KDC 具有 Active Directory 跨领域信任](#emr-kerberos-extkdc-ad-trust-summary)

### 外部 KDC：麻省理工学院（MIT）KDC
<a name="emr-kerberos-extkdc-mit-summary"></a>

此配置允许一个或多个 EMR 集群使用在 MIT KDC 服务器中定义和维护的委托人。

![\[Amazon EMR集群 architecture with Kerberos realm, showing master, core, and task nodes.\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/kerb-external-kdc.png)


**优点**
+ 在单个 KDC 中，委托人的管理进行了整合。
+ 在同一个 Kerberos 领域中，多个集群可以使用相同的 KDC。有关更多信息，请参阅 [使用具有相同 KDC 的多个集群的要求](#emr-kerberos-multi-kdc)。
+ 使用 Kerberos 的集群上的主节点没有与维护 KDC 相关的性能负担。

**注意事项和限制**
+ 在各个使用 Kerberos 集群主节点的 EC2 实例上，您必须创建与 KDC 用户主体相对应的 Linux 用户，以及各个用户的 HDFS 目录。
+ 用户委托人必须使用 EC2 私有密钥文件和 `kinit` 凭证以通过 SSH 连接到使用 Kerberos 的集群。
+ 使用 Kerberos 的 EMR 集群中的每个节点都必须具有指向 KDC 的网络路由。
+ 使用 Kerberos 的集群中的每个节点对外部 DKC 都会施加身份验证负担，因此 KDC 的配置会影响集群性能。在您配置 KDC 服务器的硬件时，请考虑同时支持的最大 Amazon EMR 节点数。
+ 集群性能依赖于使用 Kerberos 的集群中节点与 KDC 之间的网络延迟。
+ 由于相互依赖关系，问题排查可能会更加困难。

### 外部 KDC：不同集群上的主节点
<a name="emr-kerberos-extkdc-cluster-summary"></a>

此配置几乎与上述外部 MIT KDC 实现相同，除了 KDC 位于 EMR 集群的主节点上之外。有关更多信息，请参阅[集群专用 KDC（主节点上的 KDC）](#emr-kerberos-localkdc-summary)和[教程：配置与 Active Directory 域的跨领域信任](emr-kerberos-cross-realm.md)。

![\[Diagram of Amazon EMR clusters with Kerberos realm, showing master and core nodes.\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/kerb-external-cluster-kdc.png)


**优点**
+ 在单个 KDC 中，委托人的管理进行了整合。
+ 在同一个 Kerberos 领域中，多个集群可以使用相同的 KDC。有关更多信息，请参阅 [使用具有相同 KDC 的多个集群的要求](#emr-kerberos-multi-kdc)。

**注意事项和限制**
+ 在各个使用 Kerberos 集群主节点的 EC2 实例上，您必须创建与 KDC 用户主体相对应的 Linux 用户，以及各个用户的 HDFS 目录。
+ 用户委托人必须使用 EC2 私有密钥文件和 `kinit` 凭证以通过 SSH 连接到使用 Kerberos 的集群。
+ 各个 EMR 集群中的各个节点必须具有指向 KDC 的网络路由。
+ 使用 Kerberos 的集群中的每个 Amazon EMR 节点都会对外部 DKC 施加身份验证负担，因此 KDC 的配置会影响集群性能。在您配置 KDC 服务器的硬件时，请考虑同时支持的最大 Amazon EMR 节点数。
+ 集群性能依赖于集群中节点与 KDC 之间的网络延迟。
+ 由于相互依赖关系，问题排查可能会更加困难。

### 外部 KDC：不同集群上的集群 KDC 具有 Active Directory 跨领域信任
<a name="emr-kerberos-extkdc-ad-trust-summary"></a>

在此配置中，您首先要创建一个集群，该集群具有与 Active Directory 存在单向跨领域信任关系的集群专用 KDC。有关详细教程，请参阅 [教程：配置与 Active Directory 域的跨领域信任](emr-kerberos-cross-realm.md)。然后，您启动其它集群，引用具有作为外部 KDC 信任关系的集群 KDC。有关示例，请参阅[外部集群 KDC 与 Active Directory 跨领域信任](emr-kerberos-config-examples.md#emr-kerberos-example-extkdc-ad-trust)。这允许使用外部 KDC 的每个 Amazon EMR 集群对在 Microsoft Active Directory 域中定义和维护的委托人进行身份验证。

![\[Amazon EMR clusters with Kerberos authentication and Active Directory integration diagram.\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/kerb-external-ad-trust-kdc.png)


**优点**
+ 在 Active Directory 域中，委托人的管理进行了整合。
+ Amazon EMR 加入 Active Directory 领域，这使您无需创建与 Active Directory 用户对应的 Linux 用户。您仍必须为每个用户创建 HDFS 目录。
+ 在同一个 Kerberos 领域中，多个集群可以使用相同的 KDC。有关更多信息，请参阅 [使用具有相同 KDC 的多个集群的要求](#emr-kerberos-multi-kdc)。
+ Active Directory 域中的用户委托人可以通过 `kinit` 凭证访问使用 Kerberos 的集群，而无需 EC2 私有密钥文件。这消除了在集群用户之间共享私有密钥文件的需求。
+ 只有一个 Amazon EMR 主节点承担维护 KDC 的负担，并且仅该集群必须通过 Active Directory 凭证创建以实现 KDC 与 Active Directory 之间的跨领域信任。

**注意事项和限制**
+ 每个 EMR 集群中的每个节点都必须具有指向 KDC 和 Active Directory 域控制器的网络路由。
+ 每个 Amazon EMR 节点都会对外部 DKC 施加身份验证负担，因此 KDC 的配置会影响集群性能。在您配置 KDC 服务器的硬件时，请考虑同时支持的最大 Amazon EMR 节点数。
+ 集群性能依赖于集群中节点与 KDC 服务器之间的网络延迟。
+ 由于相互依赖关系，问题排查可能会更加困难。

## 使用具有相同 KDC 的多个集群的要求
<a name="emr-kerberos-multi-kdc"></a>

在同一个 Kerberos 领域中，多个集群可以使用相同的 KDC。但是，如果集群同时运行，则如果集群使用的 Kerberos ServicePrincipal 名称存在冲突，则集群可能会失败。

如果您有多个具有相同外部 KDC 的并发集群，请确保这些集群使用不同的 Kerberos 领域。如果集群必须使用相同的 Kerberos 领域，请确保集群位于不同的子网中，并且它们的 CIDR 范围不重叠。

# 在 Amazon EMR 上配置 Kerberos
<a name="emr-kerberos-configure"></a>

此部分提供了设置常见架构的 Kerberos 的配置详细信息和示例。无论您选择哪种架构，配置基本上相同，通过三个步骤完成。如果您使用外部 KDC 或设置跨领域信任，则必须确保集群中的每个节点具有指向外部 KDC 的网络路由，包括适用的安全组的配置以允许入站和出站 Kerberos 流量。

## 步骤 1：使用 Kerberos 属性创建安全配置
<a name="emr-kerberos-step1-summary"></a>

安全配置指定有关 Kerberos KDC 的详细信息，并允许在每次创建集群时重用 Kerberos 配置。您可以使用 Amazon EMR 控制台 AWS CLI、或 EMR API 创建安全配置。安全配置也可以包含其它安全选项，如加密。有关创建安全配置以及在创建集群时指定安全配置的更多信息，请参阅[使用安全配置设置 Amazon EMR 集群安全性](emr-security-configurations.md)。有关安全配置中 Kerberos 属性的信息，请参阅[安全配置的 Kerberos 设置](emr-kerberos-configure-settings.md#emr-kerberos-security-configuration)。

## 步骤 2：创建集群并指定特定于集群的 Kerberos 属性
<a name="emr-kerberos-step2-summary"></a>

在创建集群时，您将指定 Kerberos 安全配置以及集群特定 Kerberos 选项。当您使用 Amazon EMR 控制台时，只有与指定安全配置兼容的 Kerberos 选项可用。使用 AWS CLI 或 Amazon EMR API 时，请确保指定与指定安全配置兼容的 Kerberos 选项。例如，如果在使用 CLI 创建集群时，您为跨领域信任指定了委托人密码，然而指定的安全配置没有配置跨领域信任参数，则会出错。有关更多信息，请参阅 [集群的 Kerberos 设置](emr-kerberos-configure-settings.md#emr-kerberos-cluster-configuration)。

## 步骤 3：配置集群主节点
<a name="emr-kerberos-step3-summary"></a>

根据架构和实现的要求，集群上可能会需要额外的设置。您可在创建之后进行这些设置，也可在创建过程使用步骤或引导操作。

对于使用 SSH 连接到集群的每个通过 Kerberos 进行身份验证的用户，请确保创建对应于 Kerberos 用户的 Linux 账户。如果用户主体由 Active Directory 域控制器作为 KDC 或通过跨领域信任提供，Amazon EMR 将自动创建 Linux 账户。如果未使用 Active Directory，则您必须为对应于其 Linux 用户的每个用户创建委托人。有关更多信息，请参阅[为经过 Kerberos 身份验证的 HDFS 用户和 SSH 连接配置 Amazon EMR 集群](emr-kerberos-configuration-users.md)。

每个用户还必须具有自己的 HDFS 用户目录，您必须创建该目录。此外，SSH 必须配置为启用 GSSAPI，以允许来自通过 Kerberos 进行身份验证的用户的连接。主节点上必须启用 GSSAPI，并且客户端 SSH 应用程序必须配置为使用 GSSAPI。有关更多信息，请参阅 [为经过 Kerberos 身份验证的 HDFS 用户和 SSH 连接配置 Amazon EMR 集群](emr-kerberos-configuration-users.md)。

# Amazon EMR 上 Kerberos 的安全配置和集群设置
<a name="emr-kerberos-configure-settings"></a>

当您创建使用 Kerberos 的集群时，您可以指定安全配置以及特定于集群的 Kerberos 属性。您不能指定一组属性而不指定另一组，否则会发生错误。

本主题提供了在您创建安全配置和集群时可用于 Kerberos 的配置参数概览。此外，针对常见架构提供了创建兼容安全配置和集群的 CLI 示例。

## 安全配置的 Kerberos 设置
<a name="emr-kerberos-security-configuration"></a>

您可以使用 Amazon EMR 控制台、 AWS CLI或 EMR API 创建指定 Kerberos 属性的安全配置。安全配置也可以包含其它安全选项，如加密。有关更多信息，请参阅[使用 Amazon EMR 控制台或使用 AWS CLI](emr-create-security-configuration.md)。

使用以下参考来了解您选择的 Kerberos 架构的可用安全配置设置。此时将显示 Amazon EMR 控制台设置。有关对应的 CLI 选项，请参阅[使用指定 Kerberos 设置 AWS CLI](emr-create-security-configuration.md#emr-kerberos-cli-parameters)或[配置示例](emr-kerberos-config-examples.md)。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-kerberos-configure-settings.html)

## 集群的 Kerberos 设置
<a name="emr-kerberos-cluster-configuration"></a>

您可以在使用 Amazon EMR 控制台、 AWS CLI或 EMR API 创建集群时指定 Kerberos 设置。

使用以下参考来了解您选择的 Kerberos 架构的可用集群配置设置。此时将显示 Amazon EMR 控制台设置。有关对应的 CLI 选项，请参阅[配置示例](emr-kerberos-config-examples.md)。


| 参数 | 说明 | 
| --- | --- | 
|  领域  |  集群的 Kerberos 领域名称。Kerberos 约定是将此项设置为与域名相同，但使用大写字母。例如，对于域 `ec2.internal`，使用 `EC2.INTERNAL` 作为领域名称。  | 
|  KDC 管理员密码  |  集群中为 `kadmin` 或 `kadmin.local` 使用的密码。这些是 Kerberos V5 管理系统的命令行接口，该系统保存了集群的 Kerberos 委托人、密码策略和 keytab。  | 
|  跨领域信任委托人密码 (可选)  |  在建立跨领域信任时是必需的。跨领域主体密码，这必须跨领域相同。使用强密码。  | 
|  Active Directory 域加入用户（可选）  |  在跨领域信任中使用 Active Directory 时必需。这是 Active Directory 账户的用户登录名，该账户具有将计算机加入域的权限。Amazon EMR 使用此身份将集群加入域。有关更多信息，请参阅[步骤 3：将用户账户添加到 EMR 集群的域中](emr-kerberos-cross-realm.md#emr-kerberos-ad-users)。  | 
|  Active Directory 域加入密码（可选）  |  Active Directory 域加入用户的密码。有关更多信息，请参阅[步骤 3：将用户账户添加到 EMR 集群的域中](emr-kerberos-cross-realm.md#emr-kerberos-ad-users)。  | 

# 配置示例
<a name="emr-kerberos-config-examples"></a>

以下示例演示了常见场景的安全配置和集群配置。 AWS CLI 为了简洁起见，显示了命令。

## 本地 KDC
<a name="emr-kerberos-example-local-kdc"></a>

以下命令创建在主节点上运行集群专用 KDC 的集群。集群上需要额外的配置。有关更多信息，请参阅[为经过 Kerberos 身份验证的 HDFS 用户和 SSH 连接配置 Amazon EMR 集群](emr-kerberos-configuration-users.md)。

**创建安全配置**

```
aws emr create-security-configuration --name LocalKDCSecurityConfig \
--security-configuration '{"AuthenticationConfiguration": \
{"KerberosConfiguration": {"Provider": "ClusterDedicatedKdc",\
"ClusterDedicatedKdcConfiguration": {"TicketLifetimeInHours": 24 }}}}'
```

**创建集群**

```
aws emr create-cluster --release-label emr-7.12.0 \
--instance-count 3 --instance-type m5.xlarge \
--applications Name=Hadoop Name=Hive --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2Key \
--service-role EMR_DefaultRole \
--security-configuration LocalKDCSecurityConfig \
--kerberos-attributes Realm=EC2.INTERNAL,KdcAdminPassword=MyPassword
```

## 集群专用 KDC 与 Active Directory 跨领域信任
<a name="emr-kerberos-example-crossrealm"></a>

以下命令创建在主节点上运行集群专用 KDC 的集群，并与 Active Directory 域具有跨领域信任关系。在集群上和 Active Directory 中需要额外的设置。有关更多信息，请参阅[教程：配置与 Active Directory 域的跨领域信任](emr-kerberos-cross-realm.md)。

**创建安全配置**

```
aws emr create-security-configuration --name LocalKDCWithADTrustSecurityConfig \
--security-configuration '{"AuthenticationConfiguration": \
{"KerberosConfiguration": {"Provider": "ClusterDedicatedKdc", \
"ClusterDedicatedKdcConfiguration": {"TicketLifetimeInHours": 24, \
"CrossRealmTrustConfiguration": {"Realm":"AD.DOMAIN.COM", \
"Domain":"ad.domain.com", "AdminServer":"ad.domain.com", \
"KdcServer":"ad.domain.com"}}}}}'
```

**创建集群**

```
aws emr create-cluster --release-label emr-7.12.0 \
--instance-count 3 --instance-type m5.xlarge --applications Name=Hadoop Name=Hive \
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2Key \
--service-role EMR_DefaultRole --security-configuration KDCWithADTrustSecurityConfig \
--kerberos-attributes Realm=EC2.INTERNAL,KdcAdminPassword=MyClusterKDCAdminPassword,\
ADDomainJoinUser=ADUserLogonName,ADDomainJoinPassword=ADUserPassword,\
CrossRealmTrustPrincipalPassword=MatchADTrustPassword
```

## 不同集群上的外部 KDC
<a name="emr-kerberos-example-extkdc-cluster"></a>

以下命令创建引用其它集群的主节点上集群专用 KDC 的集群，用于对主体进行身份验证。集群上需要额外的配置。有关更多信息，请参阅[为经过 Kerberos 身份验证的 HDFS 用户和 SSH 连接配置 Amazon EMR 集群](emr-kerberos-configuration-users.md)。

**创建安全配置**

```
aws emr create-security-configuration --name ExtKDCOnDifferentCluster \
--security-configuration '{"AuthenticationConfiguration": \
{"KerberosConfiguration": {"Provider": "ExternalKdc", \
"ExternalKdcConfiguration": {"KdcServerType": "Single", \
"AdminServer": "MasterDNSOfKDCMaster:749", \
"KdcServer": "MasterDNSOfKDCMaster:88"}}}}'
```

**创建集群**

```
aws emr create-cluster --release-label emr-7.12.0 \
--instance-count 3 --instance-type m5.xlarge \
--applications Name=Hadoop Name=Hive \
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2Key \
--service-role EMR_DefaultRole --security-configuration ExtKDCOnDifferentCluster \
--kerberos-attributes Realm=EC2.INTERNAL,KdcAdminPassword=KDCOnMasterPassword
```

## 外部集群 KDC 与 Active Directory 跨领域信任
<a name="emr-kerberos-example-extkdc-ad-trust"></a>

以下命令创建没有 KDC 的集群。集群引用运行在其它集群的主节点上的集群专用 KDC，用于对主体进行身份验证。该 KDC 具有与 Active Directory 域控制器的跨领域信任关系。具有 KDC 的主节点上需要额外的配置。有关更多信息，请参阅 [教程：配置与 Active Directory 域的跨领域信任](emr-kerberos-cross-realm.md)。

**创建安全配置**

```
aws emr create-security-configuration --name ExtKDCWithADIntegration \
--security-configuration '{"AuthenticationConfiguration": \
{"KerberosConfiguration": {"Provider": "ExternalKdc", \
"ExternalKdcConfiguration": {"KdcServerType": "Single", \
"AdminServer": "MasterDNSofClusterKDC:749", \
"KdcServer": "MasterDNSofClusterKDC.com:88", \
"AdIntegrationConfiguration": {"AdRealm":"AD.DOMAIN.COM", \
"AdDomain":"ad.domain.com", \
"AdServer":"ad.domain.com"}}}}}'
```

**创建集群**

```
aws emr create-cluster --release-label emr-7.12.0 \
--instance-count 3 --instance-type m5.xlarge --applications Name=Hadoop Name=Hive \
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2Key \
--service-role EMR_DefaultRole --security-configuration ExtKDCWithADIntegration \
--kerberos-attributes Realm=EC2.INTERNAL,KdcAdminPassword=KDCOnMasterPassword,\
ADDomainJoinUser=MyPrivilegedADUserName,ADDomainJoinPassword=PasswordForADDomainJoinUser
```

# 为经过 Kerberos 身份验证的 HDFS 用户和 SSH 连接配置 Amazon EMR 集群
<a name="emr-kerberos-configuration-users"></a>

Amazon EMR 为集群上运行的应用程序创建已通过 Kerberos 身份验证的客户端，例如，`hadoop` 用户、`spark` 用户等。您还可以添加已通过使用 Kerberos 的集群过程的身份验证的用户。然后，已通过身份验证的用户可以使用其 Kerberos 凭证连接到集群并使用应用程序。对于用户向集群进行身份验证，需要以下配置：
+ 集群上必须有与 KDC 中 Kerberos 主体匹配的 Linux 账户。Amazon EMR 在与 Active Directory 集成的架构中自动完成此操作。
+ 您必须在主节点上为每位用户创建 HDFS 用户目录，并向目录提供用户权限。
+ 您必须配置 SSH 服务，以在主节点上启用 GSSAPI。此外，用户必须具有启用了 GSSAPI 的 SSH 客户端。

## 将 Linux 用户和 Kerberos 主体添加到主节点
<a name="emr-kerberos-configure-linux-kdc"></a>

如果您不使用 Active Directory，则必须在集群主节点上创建 Linux 账户，并将这些 Linux 用户的主体添加到 KDC。这包括主节点的 KDC 中的主体。除了用户主体之外，运行在主节点上的 KDC 需要本地主机的主体。

当架构包含 Active Directory 集成时，如果适用，将自动创建本地 KDC 上的 Linux 用户和委托人。您可以跳过此步骤。有关更多信息，请参阅[跨领域信任](emr-kerberos-options.md#emr-kerberos-crossrealm-summary)和[外部 KDC：不同集群上的集群 KDC 具有 Active Directory 跨领域信任](emr-kerberos-options.md#emr-kerberos-extkdc-ad-trust-summary)。

**重要**  
当主节点终止时，由于主节点使用临时存储，KDC 和主体数据库都会丢失。如果您为 SSH 连接创建用户，我们建议您使用配置为高可用性的外部 KDC 来建立跨领域信任。或者，如果您使用 Linux 账户为 SSH 连接创建用户，请使用引导操作和脚本自动执行账户创建过程，以便在创建新集群时重复该过程。

在创建之后或者创建集群时提交步骤到集群，这是添加用户和 KDC 委托人的最简单方法。或者，您可以作为默认 `hadoop` 用户，使用 EC2 密钥对连接到主节点来运行命令。有关更多信息，请参阅 [使用 SSH 连接到 Amazon EMR 集群主节点](emr-connect-master-node-ssh.md)。

下面的示例引用集群 ID，将 bash 脚本 `configureCluster.sh` 提交到已有的集群。该脚本会保存到 Amazon S3 中。

```
aws emr add-steps --cluster-id <j-2AL4XXXXXX5T9> \
--steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,\
Args=["s3://amzn-s3-demo-bucket/configureCluster.sh"]
```

以下示例演示了 `configureCluster.sh` 脚本的内容。该脚本还处理创建 HDFS 用户目录和为 SSH 启用 GSSAPI 的过程，这些内容在下面的部分中介绍。

```
#!/bin/bash
#Add a principal to the KDC for the primary node, using the primary node's returned host name
sudo kadmin.local -q "ktadd -k /etc/krb5.keytab host/`hostname -f`"
#Declare an associative array of user names and passwords to add
declare -A arr
arr=([lijuan]=pwd1 [marymajor]=pwd2 [richardroe]=pwd3)
for i in ${!arr[@]}; do
    #Assign plain language variables for clarity
     name=${i} 
     password=${arr[${i}]}

     # Create a principal for each user in the primary node and require a new password on first logon
     sudo kadmin.local -q "addprinc -pw $password +needchange $name"

     #Add hdfs directory for each user
     hdfs dfs -mkdir /user/$name

     #Change owner of each user's hdfs directory to that user
     hdfs dfs -chown $name:$name /user/$name
done

# Enable GSSAPI authentication for SSH and restart SSH service
sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
```

## 添加用户 HDFS 目录
<a name="emr-kerberos-configure-HDFS"></a>

要允许您的用户登录到集群来运行 Hadoop 任务，您必须为其 Linux 账户添加 HDFS 用户目录，并为每个用户授予对其目录的所有权。

在创建之后或者创建集群时提交步骤到集群，这是创建 HDFS 目录的最简单方法。或者，您可以作为默认 `hadoop` 用户，使用 EC2 密钥对连接到主节点来运行命令。有关更多信息，请参阅 [使用 SSH 连接到 Amazon EMR 集群主节点](emr-connect-master-node-ssh.md)。

下面的示例引用集群 ID，将 bash 脚本 `AddHDFSUsers.sh` 提交到已有的集群。该脚本会保存到 Amazon S3 中。

```
aws emr add-steps --cluster-id <j-2AL4XXXXXX5T9> \
--steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/AddHDFSUsers.sh"]
```

以下示例演示了 `AddHDFSUsers.sh` 脚本的内容。

```
#!/bin/bash
# AddHDFSUsers.sh script

# Initialize an array of user names from AD, or Linux users created manually on the cluster
ADUSERS=("lijuan" "marymajor" "richardroe" "myusername")

# For each user listed, create an HDFS user directory
# and change ownership to the user

for username in ${ADUSERS[@]}; do
     hdfs dfs -mkdir /user/$username
     hdfs dfs -chown $username:$username /user/$username
done
```

## 为 SSH 启用 GSSAPI
<a name="emr-kerberos-ssh-config"></a>

对于通过 Kerberos 进行身份验证的用户，要使用 SSH 连接到主节点，SSH 服务必须启用了 GSSAPI 身份验证。要启用 GSSAPI，请从主节点命令行运行以下命令或者使用步骤来将其作为脚本运行。重新配置 SSH 之后，您必须重新启动服务。

```
sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
```

# 使用 SSH 通过 Amazon EMR 连接到 Kerberos 集群
<a name="emr-kerberos-connect-ssh"></a>

此部分演示了通过 Kerberos 进行身份验证的用户连接到 EMR 集群主节点的步骤。

用于 SSH 连接的每台计算机必须安装了 SSH 客户端和 Kerberos 客户端应用程序。默认情况下，Linux 计算机很可能包括这些内容。例如，大多数 Linux、Unix 和 macOS 操作系统上都会安装 OpenSSH。您可以通过在命令行键入 **ssh** 来检查 SSH 客户端。如果您的计算机无法识别该命令，请安装 SSH 客户端以连接到主节点。OpenSSH 项目会免费提供一套完整的 SSH 工具执行文件。有关更多信息，请访问 [OpenSSH](http://www.openssh.org/) 网站。Windows 用户可以使用 [PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/) 等应用程序作为 SSH 客户端。

有关 SSH 连接的更多信息，请参阅[连接到 Amazon EMR 集群](emr-connect-master-node.md)。

SSH 使用 GSSAPI 对 Kerberos 客户端进行身份验证，您必须为集群主节点上的 SSH 服务启用 GSSAPI 身份验证。有关更多信息，请参阅 [为 SSH 启用 GSSAPI](emr-kerberos-configuration-users.md#emr-kerberos-ssh-config)。SSH 客户端也必须使用 GSSAPI。

在以下示例中，*MasterPublicDNS*使用集群详细信息窗格**摘要**选项卡上为**主公有 DNS** 显示的值，例如。*ec2-11-222-33-44.compute-1.amazonaws.com*

## krb5.conf（非 Active Directory）的先决条件
<a name="emr-kerberos-conffile"></a>

使用没有 Active Directory 集成的配置时，除了 SSH 客户端和 Kerberos 客户端应用程序之外，每个客户端计算机必须具有 `/etc/krb5.conf` 文件的副本，该文件与集群主节点上的 `/etc/krb5.conf` 文件匹配。

**复制 krb5.conf 文件**

1. 使用 SSH 使用 EC2 密钥对和默认用户（例如 `hadoop`）连接到主节点，例如 `hadoop@MasterPublicDNS`。有关详细说明，请参阅[连接到 Amazon EMR 集群](emr-connect-master-node.md)。

1. 从主节点，复制 `/etc/krb5.conf` 文件的内容。有关更多信息，请参阅 [连接到 Amazon EMR 集群](emr-connect-master-node.md)。

1. 在将连接到集群的每个客户端计算机上，基于上一步中制作的副本创建一个相同的 `/etc/krb5.conf` 文件。

## 使用 Kinit 和 SSH
<a name="emr-kerberos-kinit-ssh"></a>

用户每次使用 Kerberos 凭证从客户端计算机连接时，该用户必须首先续订 Kerberos 票证以供自己在客户端计算机上使用。此外，SSH 客户端必须配置为使用 GSSAPI 身份验证。

**通过 SSH 连接到使用 Kerberos 的 EMR 集群**

1. 使用 `kinit` 续订您的 Kerberos 票证，如以下示例所示

   ```
   kinit user1
   ```

1. 使用 `ssh` 客户端以及您在集群专用 KDC 中创建的委托人或者 Active Directory 用户名。确保已启用 GSSAPI 身份验证，如以下示例所示。

   **示例：Linux 用户**

   `-K ` 选项指定 GSSAPI 身份验证。

   ```
   ssh -K user1@MasterPublicDNS
   ```

   **示例：Windows 用户 (PuTTY)**

   确保已启用会话的 GSSAPI 身份验证选项，如下所示：  
![\[PuTTY Configuration window showing GSSAPI authentication options and library preferences.\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/kerb-gssapi-putty.png)

# 教程：使用 Amazon EMR 配置集群专用的 KDC
<a name="emr-kerberos-cluster-kdc"></a>

本主题引导您创建具有集群专用*密钥分发中心（KDC）*的集群，手动将 Linux 账户添加到所有集群节点，将 Kerberos 主体添加到主节点上的 KDC 并确保客户端计算机已安装 Kerberos 客户端。

有关 Kerberos 和 KDC 的 Amazon EMR 支持的更多信息以及指向 MIT Kerberos 文档的链接，请参阅[使用 Kerberos 通过 Amazon EMR 进行身份验证](emr-kerberos.md)。

## 步骤 1：创建使用 Kerberos 的集群
<a name="emr-kerberos-clusterdedicated-cluster"></a>

1. 创建启用 Kerberos 的安全配置。以下示例演示了一个使用将 AWS CLI 安全配置指定为内联 JSON 结构的`create-security-configuration`命令。您也可以引用本地保存的文件。

   ```
   aws emr create-security-configuration --name MyKerberosConfig \
   --security-configuration '{"AuthenticationConfiguration": {"KerberosConfiguration": 
   {"Provider": "ClusterDedicatedKdc", "ClusterDedicatedKdcConfiguration": {"TicketLifetimeInHours": 24}}}}'
   ```

1. 创建引用安全配置、指定集群的 Kerberos 属性并使用引导操作添加 Linux 账户的集群。以下示例演示使用 AWS CLI的 `create-cluster `命令。此命令引用您在上面创建的安全配置 `MyKerberosConfig`。它还引用一个简单脚本 `createlinuxusers.sh` 作为引导操作，这是您在创建集群之前创建并上载到 Amazon S3 的脚本。

   ```
   aws emr create-cluster --name "MyKerberosCluster" \
   --release-label emr-7.12.0 \
   --instance-type m5.xlarge \
   --instance-count 3 \
   --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2KeyPair \
   --service-role EMR_DefaultRole \
   --security-configuration MyKerberosConfig \
   --applications Name=Hadoop Name=Hive Name=Oozie Name=Hue Name=HCatalog Name=Spark \
   --kerberos-attributes Realm=EC2.INTERNAL,\
   KdcAdminPassword=MyClusterKDCAdminPwd \
   --bootstrap-actions Path=s3://amzn-s3-demo-bucket/createlinuxusers.sh
   ```

   以下编码演示了 `createlinuxusers.sh` 脚本的内容，它将 user1、user2 和 user3 添加到集群中的每个节点。在下一个步骤中，您将这些用户添加为 KDC 委托人。

   ```
   #!/bin/bash
   sudo adduser user1
   sudo adduser user2
   sudo adduser user3
   ```

## 步骤 2：将委托人添加到 KDC、创建 HDFS 用户目录并配置 SSH
<a name="emr-kerberos-clusterdedicated-KDC"></a>

主节点上运行的 KDC 需要为本地主机和您在集群上创建的每个用户添加主体。您还可以为每个用户创建 HDFS 目录 (如果他们需要连接到集群并运行 Hadoop 任务)。同样，配置 SSH 服务以启用 GSSAPI 身份验证，这是 Kerberos 所必需的。在启用 GSSAPI 后，重新启动 SSH 服务。

完成这些任务的最简单方法是向集群提交步骤。下面的示例将 bash 脚本 `configurekdc.sh` 提交到您在上一步中创建的集群，引用其集群 ID。该脚本会保存到 Amazon S3 中。或者，您可以使用 EC2 密钥对连接到主节点来运行命令或在集群创建过程中提交步骤。

```
aws emr add-steps --cluster-id <j-2AL4XXXXXX5T9> --steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,Jar=s3://myregion.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/configurekdc.sh"]
```

以下编码演示了 `configurekdc.sh` 脚本的内容。

```
#!/bin/bash
#Add a principal to the KDC for the primary node, using the primary node's returned host name
sudo kadmin.local -q "ktadd -k /etc/krb5.keytab host/`hostname -f`"
#Declare an associative array of user names and passwords to add
declare -A arr
arr=([user1]=pwd1 [user2]=pwd2 [user3]=pwd3)
for i in ${!arr[@]}; do
    #Assign plain language variables for clarity
     name=${i} 
     password=${arr[${i}]}

     # Create principal for sshuser in the primary node and require a new password on first logon
     sudo kadmin.local -q "addprinc -pw $password +needchange $name"

     #Add user hdfs directory
     hdfs dfs -mkdir /user/$name

     #Change owner of user's hdfs directory to user
     hdfs dfs -chown $name:$name /user/$name
done

# Enable GSSAPI authentication for SSH and restart SSH service
sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
```

您添加的用户现在应该可以使用 SSH 连接到集群。有关更多信息，请参阅[使用 SSH 通过 Amazon EMR 连接到 Kerberos 集群](emr-kerberos-connect-ssh.md)。

# 教程：配置与 Active Directory 域的跨领域信任
<a name="emr-kerberos-cross-realm"></a>

在您设置跨领域信任时，允许来自不同 Kerberos 领域的委托人 (通常为用户) 对 EMR 集群上的应用程序组件进行身份验证。集群专用*密钥分发中心 (KDC)* 使用两者中都存在的*跨领域主体*与另一个 KDC 建立信任关系。 KDCs委托人名称和密码精确匹配。

跨领域信任要求 KDC 可以通过网络相互访问并解析对方的域名。下面提供了与作为 EC2 实例运行的 Microsoft AD 域控制器建立跨领域信任关系的步骤，以及提供所需连接和域名解析的示例网络设置。任何允许在两者之间进行所需网络流量的网络设置 KDCs 都是可以接受的。

（可选）在使用一个集群上的 KDC 建立与 Active Directory 的跨领域信任之后，您可以使用不同安全配置创建另一个集群，引用第一个集群上的 KDC 作为外部 KDC。有关示例安全配置和集群设置，请参阅[外部集群 KDC 与 Active Directory 跨领域信任](emr-kerberos-config-examples.md#emr-kerberos-example-extkdc-ad-trust)。

有关 Kerberos 和 KDC 的 Amazon EMR 支持的更多信息以及指向 MIT Kerberos 文档的链接，请参阅[使用 Kerberos 通过 Amazon EMR 进行身份验证](emr-kerberos.md)。

**重要**  
Amazon EMR 不支持与的跨领域信任。 AWS Directory Service for Microsoft Active Directory

[步骤 1：设置 VPC 和子网](#emr-kerberos-ad-network)

[步骤 2：启动并安装 Active Directory 域控制器](#emr-kerberos-ad-dc)

[步骤 3：将用户账户添加到 EMR 集群的域中](#emr-kerberos-ad-users)

[步骤 4：在 Active Directory 域控制器上配置传入信任](#emr-kerberos-ad-configure-trust)

[步骤 5：使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器](#emr-kerberos-ad-DHCP)

[步骤 6：启动使用 Kerberos 的 EMR 集群](#emr-kerberos-ad-cluster)

[步骤 7：在集群上为 Active Directory 账户创建 HDFS 用户并设置权限](#emr-kerberos-ad-hadoopuser)

## 步骤 1：设置 VPC 和子网
<a name="emr-kerberos-ad-network"></a>

以下步骤演示如何创建 VPC 和子网，以便集群专用的 KDC 可以访问 Active Directory 域控制器并解析其域名。在这些步骤中，通过引用 Active Directory 域控制器作为 DHCP 选项集中的域名服务器来提供域名解析。有关更多信息，请参阅[步骤 5：使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器](#emr-kerberos-ad-DHCP)。

KDC 和 Active Directory 域控制器必须能够解析对方的域名。这样，Amazon EMR 才能将计算机加入域并自动在集群实例上配置相应 Linux 账户和 SSH 参数。

如果 Amazon EMR 无法解析域名，您可以使用 Active Directory 域控制器的 IP 地址来引用信任。但是，您必须手动添加 Linux 账户、将相应主体添加到集群专用的 KDC 并配置 SSH。

**设置 VPC 和子网**

1. 创建带单个公有子网的 Amazon VPC。有关更多信息，请参阅《Amazon VPC 入门指南》**中的[步骤 1：创建 VPC](https://docs.aws.amazon.com/AmazonVPC/latest/GettingStartedGuide/getting-started-ipv4.html#getting-started-create-vpc)。
**重要**  
当你使用 Microsoft Active Directory 域控制器时，请为 EMR 群集选择一个 CIDR 块，这样 IPv4 所有地址的长度都少于九个字符（例如 10.0.0.0/16）。这是因为当计算机加入 Active Directory 目录时，会使用群集计算机的 DNS 名称。 AWS 根据 IPv4 地址分配 [DNS 主机名](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-hostnames)，这样长的 IP 地址可能会导致 DNS 名称的长度超过 15 个字符。在注册已加入的计算机名称时，Active Directory 具有 15 个字符的限制，并且将截断较长的名称，这可能会导致不可预测的错误。

1. 删除分配给 VPC 的默认 DHCP 选项集。有关更多信息，请参阅[更改 VPC 以使用 Noo DHCP 选项](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html#DHCP_Use_No_Options)。稍后，添加一个指定 Active Directory 域控制器作为 DNS 服务器的新 DHCP 选项集。

1. 确认已为 VPC 启用了 DNS 支持，也就是说，同时启用了 DNS 主机名和 DNS 解析。默认处于启用状态。有关更多信息，请参阅[更新您的 VPC 的 DNS 支持](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)。

1. 确认您的 VPC 已附加 Internet 网关，这是默认设置。有关更多信息，请参阅[创建并附加 Internet 网关](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Attach_Gateway)。
**注意**  
此示例中使用 Internet 网关是因为您将为 VPC 建立新的域控制器。您的应用程序可能不需要 Internet 网关。唯一的要求是，集群专用的 KDC 可以访问 Active Directory 域控制器。

1. 创建自定义路由表，添加目标为 Internet 网关的路由，然后将其附加到您的子网。有关更多信息，请参阅[创建自定义路由表](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Routing)。

1. 当您启动域控制器的 EC2 实例时，它必须具有静态公有 IPv4 地址，以便您使用 RDP 连接到该实例。最简单的方法是将子网配置为自动分配公有 IPv4 地址。这不是创建子网时的默认设置。有关更多信息，请参阅[修改子网的公有 IPv4 寻址属性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)。也可以选择在启动实例时分配地址。有关更多信息，请参阅[在实例启动期间分配公有 IPv4 地址](https://docs.aws.amazon.com/vpc/latest/userguide/using-instance-addressing.html#public-ip-addresses)。

1. 完成后，记下您的 VPC 和子网 IDs。稍后，您在启动 Active Directory 域控制器和集群时会使用它们。

## 步骤 2：启动并安装 Active Directory 域控制器
<a name="emr-kerberos-ad-dc"></a>

1. 基于 Microsoft Windows Server 2016 Base AMI 启动 EC2 实例。我们推荐 m4.xlarge 或更好的实例类型。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[启动 AWS Marketplace 实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/launch-marketplace-console.html)。

1. 记下与 EC2 实例关联的安全组的组 ID。您将在 [步骤 6：启动使用 Kerberos 的 EMR 集群](#emr-kerberos-ad-cluster)中需要它。我们用*sg-012xrlmdomain345*。或者，您可以为 EMR 集群指定不同的安全组，并指定允许安全组之间流量的此实例。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[适用于 Linux 实例的 Amazon EC2 安全组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)。

1. 使用 RDP 连接到 EC2 实例。有关详细信息，请参阅《Amazon EC2 用户指南》**中的[连接到 Windows 实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.html)。

1. 启动 **Server Manager (服务器管理器)** 以在服务器上安装并配置 Active Directory 域服务角色。将服务器提升为域控制器并分配域名 (我们在此处使用的示例是 `ad.domain.com`)。请记下该域名，因为稍后您创建 EMR 安全配置和集群时会需要它。如果您并不熟悉如何设置 Active Directory，可以按照[如何在 Windows Server 2016 中设置 Active Directory（AD）](https://ittutorials.net/microsoft/windows-server-2016/setting-up-active-directory-ad-in-windows-server-2016/)中的说明操作。

   在您完成后，实例会重新启动。

## 步骤 3：将用户账户添加到 EMR 集群的域中
<a name="emr-kerberos-ad-users"></a>

使用 RDP 连接到 Active Directory 域控制器以在 Active Directory 用户和计算机中为每个集群用户创建账户。有关更多信息，请参阅 *Microsoft Learn* 网站上的[在 Active Directory 用户和计算机中创建用户帐户](https://technet.microsoft.com/en-us/library/dd894463(v=ws.10).aspx)。请记下每个用户的 **User logon name (用户登录名)**。稍后，在您配置集群时会需要这些信息。

另外，创建具有将计算机加入域的足够权限的账户。在您创建集群时指定此账户。Amazon EMR 使用它将集群实例加入域。在[步骤 6：启动使用 Kerberos 的 EMR 集群](#emr-kerberos-ad-cluster) 中指定此账户及其密码。要将计算机加入权限委派给账户，我们建议您创建具有加入权限的组，然后将用户分配到该组。有关说明，请参阅《AWS Directory Service 管理指南》**中的[委派目录加入权限](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_join_privileges.html)。

## 步骤 4：在 Active Directory 域控制器上配置传入信任
<a name="emr-kerberos-ad-configure-trust"></a>

下面的示例命令在 Active Directory 中创建信任，这是使用集群专用的 KDC 的单向、传入、不可传递的领域信任。我们对集群的领域使用的示例为 `EC2.INTERNAL`。将替换为*KDC-FQDN*为托管 **KDC 的 Amazon EMR 主节点列出的公有 DNS** 名称。`passwordt` 参数指定 **cross-realm principal password (跨领域委托人密码)**，您在创建集群时指定了它以及集群 **realm (领域)**。领域名称派生自 `us-east-1` 中集群的默认域名。`Domain` 是您正在创建信任的 Active Directory 域，按照惯例，它是小写的。此示例使用 `ad.domain.com`

使用管理员权限打开 Windows 命令提示符并键入以下命令，在 Active Directory 域控制器上创建信任关系：

```
C:\Users\Administrator> ksetup /addkdc EC2.INTERNAL KDC-FQDN
C:\Users\Administrator> netdom trust EC2.INTERNAL /Domain:ad.domain.com /add /realm /passwordt:MyVeryStrongPassword
C:\Users\Administrator> ksetup /SetEncTypeAttr EC2.INTERNAL AES256-CTS-HMAC-SHA1-96
```

## 步骤 5：使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器
<a name="emr-kerberos-ad-DHCP"></a>

现在已配置 Active Directory 域控制器，您必须配置 VPC 以使用它作为您的 VPC 内的域名服务器来解析名称。为此，请附加 DHCP 选项集。指定 **Domain name (域名)** 作为您的集群的域名，例如，`ec2.internal`（如果您的集群位于 us-east-1 中）或 `region.compute.internal`（对于其它区域）。对于**域名服务器**，必须将 Active Directory 域控制器的 IP 地址（必须可以从群集访问）指定为第一个条目，然后指定 **AmazonProvidedDNS**（例如 ***xx.xx.xx.xx*，AmazonProvidedDNS**）。有关更多信息，请参阅[更改 DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html#DHCPOptions)。

## 步骤 6：启动使用 Kerberos 的 EMR 集群
<a name="emr-kerberos-ad-cluster"></a>

1. 在 Amazon EMR 中创建安全配置，指定您在之前的步骤中创建的 Active Directory 域控制器。下面显示了一个示例命令。将域 `ad.domain.com` 替换为您在[步骤 2：启动并安装 Active Directory 域控制器](#emr-kerberos-ad-dc) 中指定的域的名称。

   ```
   aws emr create-security-configuration --name MyKerberosConfig \
   --security-configuration '{
     "AuthenticationConfiguration": {
       "KerberosConfiguration": {
         "Provider": "ClusterDedicatedKdc",
         "ClusterDedicatedKdcConfiguration": {
           "TicketLifetimeInHours": 24,
           "CrossRealmTrustConfiguration": {
             "Realm": "AD.DOMAIN.COM",
             "Domain": "ad.domain.com",
             "AdminServer": "ad.domain.com",
             "KdcServer": "ad.domain.com"
           }
         }
       }
     }
   }'
   ```

1. 使用下面的属性创建集群：
   + 使用 `--security-configuration` 选项指定您创建的安全配置。我们在示例*MyKerberosConfig*中使用。
   + 使用 `--ec2-attributes option` 的 `SubnetId` 属性来指定您在 [步骤 1：设置 VPC 和子网](#emr-kerberos-ad-network) 中创建的子网。我们在示例*step1-subnet*中使用。
   + 使用 `AdditionalMasterSecurityGroups` 选项的 `AdditionalSlaveSecurityGroups` 和 `--ec2-attributes`，指定与[步骤 2：启动并安装 Active Directory 域控制器](#emr-kerberos-ad-dc)中的 AD 域控制器关联的安全组与集群主节点以及核心节点和任务节点相关联。我们在示例*sg-012xrlmdomain345*中使用。

   使用 `--kerberos-attributes` 指定以下特定于集群的 Kerberos 属性：
   + 您在设置 Active Directory 域控制器时指定的集群的领域。
   + 您在`passwordt` 中指定为 [步骤 4：在 Active Directory 域控制器上配置传入信任](#emr-kerberos-ad-configure-trust) 的跨领域信任委托人密码。
   + `KdcAdminPassword`，可用于管理集群专用的 KDC。
   + 您在[步骤 3：将用户账户添加到 EMR 集群的域中](#emr-kerberos-ad-users)中创建的具有计算机加入权限的 Active Directory 账户的用户登录名和密码。

   以下示例启动使用 Kerberos 的集群。

   ```
   aws emr create-cluster --name "MyKerberosCluster" \
   --release-label emr-5.10.0 \
   --instance-type m5.xlarge \
   --instance-count 3 \
   --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2KeyPair,\
   SubnetId=step1-subnet, AdditionalMasterSecurityGroups=sg-012xrlmdomain345,
   AdditionalSlaveSecurityGroups=sg-012xrlmdomain345\
   --service-role EMR_DefaultRole \
   --security-configuration MyKerberosConfig \
   --applications Name=Hadoop Name=Hive Name=Oozie Name=Hue Name=HCatalog Name=Spark \
   --kerberos-attributes Realm=EC2.INTERNAL,\
   KdcAdminPassword=MyClusterKDCAdminPwd,\
   ADDomainJoinUser=ADUserLogonName,ADDomainJoinPassword=ADUserPassword,\
   CrossRealmTrustPrincipalPassword=MatchADTrustPwd
   ```

## 步骤 7：在集群上为 Active Directory 账户创建 HDFS 用户并设置权限
<a name="emr-kerberos-ad-hadoopuser"></a>

在设置与 Active Directory 的信任关系时，Amazon EMR 将在集群上为每个 Active Directory 账户创建 Linux 用户。例如，Active Directory 中的用户登录名 `LiJuan` 具有 Linux 账户 `lijuan`。Active Directory 用户名可以包含大写字母，但 Linux 不区分 Active Directory 大小写。

要允许您的用户登录到集群来运行 Hadoop 任务，您必须为其 Linux 账户添加 HDFS 用户目录，并为每个用户授予对其目录的所有权。为此，我们建议您运行以集群步骤的形式保存到 Amazon S3 的脚本。或者，您也可以从主节点上的命令行运行以下脚本中的命令。使用您在创建集群时指定的 EC2 密钥对以 Hadoop 用户身份通过 SSH 连接到主节点。有关更多信息，请参阅 [对 Amazon EMR 的 SSH 凭证使用 EC2 密钥对](emr-plan-access-ssh.md)。

运行以下命令向运行脚本的集群添加一个步骤*AddHDFSUsers.sh*。

```
aws emr add-steps --cluster-id <j-2AL4XXXXXX5T9> \
--steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/AddHDFSUsers.sh"]
```

该文件的内容*AddHDFSUsers.sh*如下。

```
#!/bin/bash
# AddHDFSUsers.sh script

# Initialize an array of user names from AD or Linux users and KDC principals created manually on the cluster
ADUSERS=("lijuan" "marymajor" "richardroe" "myusername")

# For each user listed, create an HDFS user directory
# and change ownership to the user

for username in ${ADUSERS[@]}; do
     hdfs dfs -mkdir /user/$username
     hdfs dfs -chown $username:$username /user/$username
done
```

### 映射到 Hadoop 组的 Active Directory 组
<a name="emr-kerberos-ad-group"></a>

Amazon EMR 使用 System Security Services Daemon（SSD）将 Active Directory 组映射到 Hadoop 组。要确认组映射，在您按[使用 SSH 通过 Amazon EMR 连接到 Kerberos 集群](emr-kerberos-connect-ssh.md)中所述登录到主节点后，可以使用 `hdfs groups` 命令确认您的 Active Directory 账户所属的 Active Directory 组是否已映射到集群上相应 Hadoop 用户的 Hadoop 组。您还可以使用命令 (例如 `hdfs groups lijuan`)，通过指定一个或多个用户名来查看其它用户的组映射。有关更多信息，请参阅 [Apache HDFS 命令指南](https://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html#groups)中的[组](https://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html)。

# 使用 Active Directory 或 LDAP 服务器通过 Amazon EMR 进行身份验证。
<a name="ldap"></a>

在 Amazon EMR 6.12.0 以及更高版本中，您可以使用基于 SSL 的 LDAP（LDAPS）协议来启动与您的企业身份服务器原生集成的集群。LDAP（轻量目录访问协议）是一种开放的、供应商中立的应用程序协议，用于访问和维护数据。LDAP 通常用于针对托管在 Active Directory（AD）和 OpenLDAP 等应用程序上的企业身份服务器进行用户身份验证。通过这种原生集成，您可以使用 LDAP 服务器对 Amazon EMR 上的用户进行身份验证。

Amazon EMR LDAP 集成的亮点包括：
+ Amazon EMR 将支持的应用程序配置为代表您使用 LDAP 身份验证进行身份验证。
+ Amazon EMR 使用 Kerberos 协议为支持的应用程序配置和维护其安全。您无需输入任何命令或脚本。
+ 通过 Apache Ranger 对 Hive 元存储数据库和表的授权，您可以获得精细访问控制 (FGAC)。请参阅[将 Amazon EMR 与 Apache Ranger 集成](emr-ranger.md)了解更多信息。
+ 当您要求 LDAP 凭证才能访问集群时，您可以获得对谁可以通过 SSH 访问您的 EMR 集群的精细访问控制（FGAC）。

以下页面提供了概念性概述、先决条件以及启动集成了 Amazon EMR LDAP 的 EMR 集群的步骤。

**Topics**
+ [集成了 Amazon EMR 的 LDAP 概览](ldap-overview.md)
+ [Amazon EMR 的 LDAP 组件](ldap-components.md)
+ [适用于 Amazon EMR 的 LDAP 的应用程序支持和注意事项](ldap-considerations.md)
+ [使用 LDAP 配置和启动 EMR 集群](ldap-setup.md)
+ [在 Amazon EMR 上使用 LDAP 的示例](ldap-examples.md)

# 集成了 Amazon EMR 的 LDAP 概览
<a name="ldap-overview"></a>

轻型目录访问协议（LDAP）是一种软件协议，网络管理员使用该协议通过对公司网络中的用户进行身份验证来管理和控制对数据的访问。LDAP 协议将信息存储在分层的树形目录结构中。有关更多信息，请参阅 *LDAP.com* 上的 [Basic LDAP Concepts](https://ldap.com/basic-ldap-concepts/)。

在公司的网络中，许多应用程序可能会使用 LDAP 协议对用户进行身份验证。通过 Amazon EMR LDAP 集成，EMR 集群可以原生使用相同的 LDAP 协议并添加安全配置。

Amazon EMR 支持两种主要的 LDAP 协议实现：**Active Directory** 和 **OpenLDAP**。虽然其他实现也是可能的，但大多数实现都符合与 Active Directory 或 OpenLDAP 相同的身份验证协议。

## Active Directory（AD）
<a name="ldap-ad"></a>

Active Directory（AD）是 Microsoft 为 Windows 域网络提供的目录服务。AD 包含在大多数 Windows 服务器操作系统中，并且可以通过 LDAP 和 LDAPS 协议与客户端通信。为了进行身份验证，Amazon EMR 会尝试使用用户主体名称（UPN）作为可分辨名称和密码与您的 AD 实例进行用户绑定。UPN 使用标准格式 `username@domain_name`。

## OpenLDAP
<a name="ldap-openldap"></a>

OpenLDAP 是 LDAP 协议的免费开源实现。为了进行身份验证，Amazon EMR 会尝试使用完全限定域名（FQDN）作为可分辨名称和密码与您的 OpenLDAP 实例进行用户绑定。FQDN 使用标准格式 `username_attribute=username,LDAP_user_search_base`。通常，`username_attribute` 值为 `uid`，并且 `LDAP_user_search_base` 值包含指向用户的树的属性。例如 `ou=People,dc=example,dc=com`。

LDAP 协议的其他免费和开源实现通常遵循与 OpenLDAP 类似的 FQDN 来标识其用户的可分辨名称。

# Amazon EMR 的 LDAP 组件
<a name="ldap-components"></a>

您可以使用 LDAP 服务器通过以下组件对 Amazon EMR 以及用户直接在 EMR 集群上使用的任何应用程序进行身份验证。

**Secret Agent**  
*Secret Agent* 是一个集群上进程，用于对所有用户请求进行身份验证。Secret Agent 代表 EMR 集群上支持的应用程序创建与您的 LDAP 服务器的用户绑定。Secret Agent 以 `emrsecretagent` 用户身份运行，将日志写入 `/emr/secretagent/log` 目录。这些日志提供了有关每个用户的身份验证请求状态以及用户身份验证期间可能出现的任何错误的详细信息。

**系统安全服务进程守护程序（SSSD）**  
*SSSD* 是在支持 LDAP 的 EMR 集群的每个节点上运行的进程守护程序。SSSD 创建并管理 UNIX 用户，以将您的远程企业身份同步到每个节点。基于 Yarn 的应用程序（例如 Hive 和 Spark）要求在为用户运行查询的每个节点上都有一个本地 UNIX 用户。

# 适用于 Amazon EMR 的 LDAP 的应用程序支持和注意事项
<a name="ldap-considerations"></a>

本主题列出了支持的应用程序、支持的功能和不支持的功能。

## 适用于 Amazon EMR 的 LDAP 支持的应用程序
<a name="ldap-considerations-apps"></a>

**重要**  
此页面上列出的应用程序是 Amazon EMR 针对 LDAP 提供支持的唯一应用程序。为确保集群安全，只有在创建启用了 LDAP 的 EMR 集群时，才能包含与 LDAP 兼容的应用程序。如果您尝试安装其他不支持的应用程序，Amazon EMR 将拒绝您对新集群的请求。

Amazon EMR 6.12 及更高版本支持与以下应用程序的 LDAP 集成：
+ Apache Livy
+ Apache Hive 直到 HiveServer 2 () HS2
+ Trino
+ ：Presto
+ Hue

您还可以将以下应用程序安装在 EMR 集群上，并且进行配置以满足您的安全需求：
+ Apache Spark
+ Apache Hadoop

## 适用于 Amazon EMR 的 LDAP 支持的功能
<a name="ldap-considerations-features"></a>

您可以将以下 Amazon EMR 功能与 LDAP 集成结合使用：

**注意**  
为保障 LDAP 凭证的安全，您必须使用传输中加密来保护集群内外的数据流。有关传输中加密的更多信息，请参阅 [使用 Amazon EMR 加密静态数据和传输中数据](emr-data-encryption.md)。
+ 传输中加密（要求）和静态加密
+ 实例组、实例集和竞价型实例
+ 在运行中的集群上重新配置应用程序
+ EMRFS 服务器端加密（SSE）

## 不支持的功能
<a name="ldap-considerations-limitations"></a>

在使用 Amazon EMR LDAP 集成时，请考虑以下限制：
+ Amazon EMR 禁用启用了 LDAP 的集群的步骤。
+ 对于启用了 LDAP 的集群，Amazon EMR 不支持运行时角色和集 AWS Lake Formation 成。
+ Amazon EMR 不支持带有 StartTLS 的 LDAP。
+ Amazon EMR 不支持启用了 LDAP 的集群的高可用性模式（具有多个主节点的集群）。
+ 您无法轮换启用了 LDAP 的集群的绑定凭证或证书。如果这些字段中的任何一个已轮换，我们建议您使用更新的绑定凭证或证书启动新集群。
+ 必须在 LDAP 中使用精确的搜索库。LDAP 用户和组搜索库不支持 LDAP 搜索筛选条件。

# 使用 LDAP 配置和启动 EMR 集群
<a name="ldap-setup"></a>

本节介绍如何将 Amazon EMR 配置为与 LDAP 身份验证配合使用。

**Topics**
+ [向 Amazon EMR 实例 AWS Secrets Manager 角色添加权限](ldap-setup-asm.md)
+ [创建用于 LDAP 集成的 Amazon EMR 安全配置](ldap-setup-security.md)
+ [启动通过 LDAP 进行身份验证的 EMR 集群](ldap-setup-launch.md)

# 向 Amazon EMR 实例 AWS Secrets Manager 角色添加权限
<a name="ldap-setup-asm"></a>

Amazon EMR 使用 IAM 服务角色代表您执行操作以预置和管理集群。集群 EC2 实例的服务角色（又称为 *Amazon EMR 的 EC2 实例配置文件*）是一种特殊类型的服务角色，在启动时由 Amazon EMR 分配给集群中的每个 EC2 实例。

为定义 EMR 集群与 Amazon S3 数据和其他 AWS 服务交互的权限，您应该定义一个自定义 Amazon EC2 实例配置文件而不是 `EMR_EC2_DefaultRole`，以在启动集群时使用。有关更多信息，请参阅[集群 EC2 实例（EC2 实例配置文件）的服务角色](emr-iam-role-for-ec2.md)和[使用 Amazon EMR 自定义 IAM 角色](emr-iam-roles-custom.md)。

将以下语句添加到默认 EC2 实例配置文件中，以允许 Amazon EMR 标记会话并访问存储 LDAP 证书 AWS Secrets Manager 的。

```
    {
      "Sid": "AllowAssumeOfRolesAndTagging",
      "Effect": "Allow",
      "Action": ["sts:TagSession", "sts:AssumeRole"],
      "Resource": [
        "arn:aws:iam::111122223333:role/LDAP_DATA_ACCESS_ROLE_NAME",
        "arn:aws:iam::111122223333:role/LDAP_USER_ACCESS_ROLE_NAME"
      ]
    },
    {
        "Sid": "AllowSecretsRetrieval",
        "Effect": "Allow",
        "Action": "secretsmanager:GetSecretValue",
        "Resource": [
            "arn:aws:secretsmanager:us-east-1:111122223333:secret:LDAP_SECRET_NAME*",
            "arn:aws:secretsmanager:us-east-1:111122223333:secret:ADMIN_LDAP_SECRET_NAME*"
        ]
    }
```

**注意**  
如果您在设置 Secrets Manager 权限时忘记了密钥名称末尾的通配符 `*` 字符，集群请求将失败。通配符代表密钥版本。  
您还应将 AWS Secrets Manager 策略的范围限制为仅限于您的集群配置实例所需的证书。

# 创建用于 LDAP 集成的 Amazon EMR 安全配置
<a name="ldap-setup-security"></a>

在启动集成了 LDAP 的 EMR 集群之前，请使用 [使用 Amazon EMR 控制台或使用 AWS CLI](emr-create-security-configuration.md) 中的步骤为该集群创建 Amazon EMR 安全配置。在 `AuthenticationConfiguration` 下的 `LDAPConfiguration` 区块中，或在 Amazon EMR 控制台**安全配置**部分中的相应字段中完成以下配置：

**`EnableLDAPAuthentication`**  
控制台选项：**身份验证协议：LDAP**  
要使用 LDAP 集成，请在控制台中创建集群时将此选项设置为 `true` 或选择它作为您的身份验证协议。默认情况下，当您在 Amazon EMR 控制台中创建安全配置时，`EnableLDAPAuthentication` 的值为 `true`。

**`LDAPServerURL`**  
控制台选项：**LDAP 服务器位置**  
LDAP 服务器的位置包括前缀：`ldaps://location_of_server`。

**`BindCertificateARN`**  
控制台选项：**LDAP SSL 证书**  
包含用于签署 LDAP 服务器使用的 SSL 证书的证书的 AWS Secrets Manager ARN。如果您的 LDAP 服务器由公共证书颁发机构 (CA) 签名，则可以为 AWS Secrets Manager ARN 提供一个空白文件。有关如何在 Secrets Manager 中存储证书的更多信息，请参阅 [将 TLS 证书存储在 AWS Secrets Manager](emr-ranger-tls-certificates.md)。

**`BindCredentialsARN`**  
控制台选项：**LDAP 服务器绑定凭证**  
包含 LD AWS Secrets Manager AP 管理员用户绑定凭据的 ARN。凭证存储为 JSON 对象。此密钥中只有一个键值对；键值对中的键是用户名，值是密码。例如 `{"uid=admin,cn=People,dc=example,dc=com": "AdminPassword1"}`。除非您为 EMR 集群启用 SSH 登录，否则此字段为可选字段。在许多配置中，Active Directory 实例需要绑定凭证才能允许 SSSD 同步用户。

**`LDAPAccessFilter`**  
控制台选项：**LDAP 访问筛选条件**  
指定 LDAP 服务器中可以进行身份验证的对象子集。例如，如果您只想向 LDAP 服务器中具有 `posixAccount` 对象类的所有用户授予访问权限，请将访问筛选条件定义为 `(objectClass=posixAccount)`。

**`LDAPUserSearchBase`**  
控制台选项：**LDAP 用户搜索库**  
您的用户在 LDAP 服务器中所属的搜索库。例如 `cn=People,dc=example,dc=com`。

**`LDAPGroupSearchBase`**  
控制台选项：**LDAP 组搜索库**  
您的组在 LDAP 服务器中所属的搜索库。例如 `cn=Groups,dc=example,dc=com`。

**`EnableSSHLogin`**  
控制台选项：**SSH 登录**  
指定是否允许使用 LDAP 凭证进行密码身份验证。我们不建议您保持启用此选项。密钥对允许访问 EMR 集群的更安全的路由。此字段是可选的，默认值为 `false`。

**`LDAPServerType`**  
控制台选项：**LDAP 服务器类型**  
指定 Amazon EMR 连接到的 LDAP 服务器的类型。支持的选项有“Active Directory”和“OpenLDAP”。其他 LDAP 服务器类型可能会起作用，但是 Amazon EMR 不正式支持其他服务器类型。有关更多信息，请参阅 [Amazon EMR 的 LDAP 组件](ldap-components.md)。

**`ActiveDirectoryConfigurations`**  
使用 Active Directory 服务器类型的安全配置的必需子块。

**`ADDomain`**  
控制台选项：**Active Directory 域**  
用于创建用户主体名称（UPN）的域名，用于对使用 Active Directory 服务器类型的安全配置进行用户身份验证。

## 使用 LDAP 和 Amazon EMR 进行安全配置的注意事项
<a name="ldap-setup-security-considerations"></a>
+ 要创建与 Amazon EMR LDAP 集成的安全配置，您必须使用传输中加密。有关传输中加密的信息，请参阅 [使用 Amazon EMR 加密静态数据和传输中数据](emr-data-encryption.md)。
+ 您不能在相同的安全配置中定义 Kerberos 配置。Amazon EMR 会自动预置一个专用的 KDC，并管理此 KDC 的管理员密码。用户无法访问此管理员密码。
+ 您不能在相同的安全配置 AWS Lake Formation 中定义 IAM 运行时角色。
+ `LDAPServerURL` 的值中必须包含 `ldaps://` 协议。
+ `LDAPAccessFilter` 不能为空。

## 将 LDAP 与 Amazon EMR 的 Apache Ranger 集成一起使用
<a name="ldap-setup-ranger"></a>

通过 Amazon EMR 的 LDAP 集成，您可以进一步与 Apache Ranger 集成。当您将您的 LDAP 用户拉取到 Ranger 中时，可以将这些用户与 Apache Ranger 策略服务器关联，以便与 Amazon EMR 和其他应用程序集成。为此，请在与 LDAP 集群一起使用的安全配置中的 `AuthorizationConfiguration` 中定义该 `RangerConfiguration` 字段。有关如何设置安全配置的更多信息，请参阅 [创建 EMR 安全配置](emr-ranger-security-config.md)。

将 LDAP 与 Amazon EMR 配合使用时，您无需为 Apache Ranger 提供带有 Amazon EMR 集成的 `KerberosConfiguration`。

# 启动通过 LDAP 进行身份验证的 EMR 集群
<a name="ldap-setup-launch"></a>

使用以下步骤启动带有 LDAP 或 Active Directory 的 EMR 集群。

1. 设置您的环境：
   + 确保您的 EMR 集群上的节点可以与 Amazon S3 和进行通信。 AWS Secrets Manager有关如何修改您的 EC2 实例配置文件角色以与这些服务通信的更多信息，请参阅 [向 Amazon EMR 实例 AWS Secrets Manager 角色添加权限](ldap-setup-asm.md)。
   + 如果您计划在私有子网中运行 EMR 集群，则应使用和 AWS PrivateLink Amazon VPC 终端节点，或者使用网络地址转换 (NAT) 将 VPC 配置为与 S3 和 Secrets Manager 通信。有关更多信息，请参阅《Amazon VPC 入门指南》**中的 [AWS PrivateLink 和 VPC 端点](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html)和 [NAT 实例](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html)。
   + 确保您的 EMR 集群和 LDAP 服务器之间存在网络连接。您的 EMR 集群必须通过网络访问您的 LDAP 服务器。集群的主节点、核心节点和任务节点与 LDAP 服务器通信以同步用户数据。如果您的 LDAP 服务器在 Amazon EC2 上运行，请更新 EC2 安全组以接受来自 EMR 集群的流量。有关更多信息，请参阅 [向 Amazon EMR 实例 AWS Secrets Manager 角色添加权限](ldap-setup-asm.md)。

1. 创建用于 LDAP 集成的 Amazon EMR 安全配置 有关更多信息，请参阅 [创建用于 LDAP 集成的 Amazon EMR 安全配置](ldap-setup-security.md)。

1. 现在您已完成设置，请按照 [启动 Amazon EMR 集群](emr-gs.md#emr-getting-started-launch-sample-cluster) 中的步骤启动具有以下配置的集群：
   + 选择 Amazon EMR 6.12 或更高版本。我们建议您使用最新的 Amazon EMR 版本。
   + 仅为您的集群指定或选择支持 LDAP 的应用程序。有关在 Amazon EMR 上使用 LDAP 支持的应用程序的列表，请参阅 [适用于 Amazon EMR 的 LDAP 的应用程序支持和注意事项](ldap-considerations.md)。
   + 应用您在上一步中创建的安全配置。

# 在 Amazon EMR 上使用 LDAP 的示例
<a name="ldap-examples"></a>

[预置使用 LDAP 集成的 EMR 集群](ldap-setup-launch.md)后，您可以通过其内置的用户名和密码身份验证机制向任何[支持的应用程序](ldap-considerations.md#ldap-considerations-apps)提供 LDAP 凭证。本页显示一些示例。

## 在 Apache Hive 上使用 LDAP 身份验证
<a name="ldap-examples-"></a>

**Example ：Apache Hive**  
以下示例命令通过 HiveServer 2 和 Beeline 启动 Apache Hive 会话：  

```
beeline -u "jdbc:hive2://$HOSTNAME:10000/default;ssl=true;sslTrustStore=$TRUSTSTORE_PATH;trustStorePassword=$TRUSTSTORE_PASS"  -n LDAP_USERNAME -p LDAP_PASSWORD
```

## 在 Apache Livy 上使用 LDAP 身份验证
<a name="ldap-examples-livy"></a>

**Example ：Apache Livy**  
以下示例命令通过 cURL 启动 Livy 会话。将 `ENCODED-KEYPAIR` 替换为 `username:password` 的 Base64 编码字符串。  

```
curl -X POST --data '{"proxyUser":"LDAP_USERNAME","kind": "pyspark"}' -H "Content-Type: application/json" -H "Authorization: Basic ENCODED-KEYPAIR" DNS_OF_PRIMARY_NODE:8998/sessions
```

## 在 Presto 上使用 LDAP 身份验证
<a name="ldap-examples-presto"></a>

**Example ：Presto**  
以下示例命令通过 Presto CLI 启动 Presto 会话：  

```
presto-cli --user "LDAP_USERNAME" --password --catalog hive
```
运行此命令后，在系统提示时输入 LDAP 密码。

## 在 Trino 上使用 LDAP 身份验证
<a name="ldap-examples-trino"></a>

**Example Trino**  
以下示例命令通过 Trino CLI 启动 Trino 会话：  

```
trino-cli --user "LDAP_USERNAME" --password --catalog hive
```
运行此命令后，在系统提示时输入 LDAP 密码。

## 在 Hue 上使用 LDAP 身份验证
<a name="ldap-examples-hue"></a>

您可以通过在集群上创建的 SSH 隧道访问 Hue 用户界面，也可以将代理服务器设置为公开广播与 Hue 的连接。由于 Hue 默认不在 HTTPS 模式下运行，因此我们建议您使用额外的加密层，以确保客户端与 Hue 用户界面之间的通信使用 HTTPS 加密。这样可以减少您意外以纯文本形式公开用户凭证的可能性。

要使用 Hue 用户界面，请在浏览器中打开 Hue 用户界面，然后输入您的 LDAP 用户名密码进行登录。如果凭证正确，Hue 会将您登录并使用您的身份在所有支持的应用程序中对您进行身份验证。

## 使用 SSH 进行密码身份验证，对其他应用程序使用 Kerberos 票证
<a name="ldap-examples-ssh"></a>

**重要**  
我们不建议您使用密码身份验证来通过 SSH 访问 EMR 集群。

您可以使用您的 LDAP 凭证通过 SSH 访问 EMR 集群。为此，请在用于启动集群的 Amazon EMR 安全配置中将 `EnableSSHLogin` 配置设置为 `true`。然后，在集群启动后，使用以下命令通过 SSH 连接到集群：

```
ssh username@EMR_PRIMARY_DNS_NAME
```

运行此命令后，在系统提示时输入 LDAP 密码。

Amazon EMR 包含一个集群脚本，允许用户生成 Kerberos keytab 文件和票证，用于不直接接受 LDAP 凭证的受支持应用程序。其中一些应用程序包括 `spark-submit` Spark SQL 和 PySpark。

运行 `ldap-kinit` 并按照提示操作。如果身份验证成功，Kerberos keytab 文件将与有效的 Kerberos 票证一起出现在您的主目录中。使用 Kerberos 票证像在任何使用 Kerberos 的环境中一样运行应用程序。