

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

# 教程：配置与 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 不支持与的跨领域信任。 Amazon 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.amazonaws.cn/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 名称。 Amazon 根据 IPv4 地址分配 [DNS 主机名](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-dns.html#vpc-dns-hostnames)，这样长的 IP 地址可能会导致 DNS 名称的长度超过 15 个字符。在注册已加入的计算机名称时，Active Directory 具有 15 个字符的限制，并且将截断较长的名称，这可能会导致不可预测的错误。

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

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

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

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

1. 当您启动域控制器的 EC2 实例时，它必须具有静态公有 IPv4 地址，以便您使用 RDP 连接到该实例。最简单的方法是将子网配置为自动分配公有 IPv4 地址。这不是创建子网时的默认设置。有关更多信息，请参阅[修改子网的公有 IPv4 寻址属性](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)。也可以选择在启动实例时分配地址。有关更多信息，请参阅[在实例启动期间分配公有 IPv4 地址](https://docs.amazonaws.cn/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 用户指南》**中的[启动 Amazon Web Services Marketplace 实例](https://docs.amazonaws.cn/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.amazonaws.cn/AWSEC2/latest/UserGuide/using-network-security.html)。

1. 使用 RDP 连接到 EC2 实例。有关详细信息，请参阅《Amazon EC2 用户指南》**中的[连接到 Windows 实例](https://docs.amazonaws.cn/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) 中指定此账户及其密码。要将计算机加入权限委派给账户，我们建议您创建具有加入权限的组，然后将用户分配到该组。有关说明，请参阅《Amazon Directory Service 管理指南》**中的[委派目录加入权限](https://docs.amazonaws.cn/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.amazonaws.cn/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)。