

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

# 在 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
```