

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

# 为经过 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
```