

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 為經過 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 主體的最簡單方法。或者，您也可以使用 EC2 金鑰對連接至主節點，作為執行命令的預設 `hadoop` 使用者。如需詳細資訊，請參閱[使用 SSH 連線至 Amazon EMR 叢集主節點](emr-connect-master-node-ssh.md)。

以下範例會將 bash 指令碼 `configureCluster.sh` 提交至已存在的叢集 (參考其叢集 ID)。指令碼會儲存至 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 目錄的最簡單方法。或者，您也可以使用 EC2 金鑰對連接到主節點，作為執行命令的預設 `hadoop` 使用者。如需詳細資訊，請參閱[使用 SSH 連線至 Amazon EMR 叢集主節點](emr-connect-master-node-ssh.md)。

以下範例會將 bash 指令碼 `AddHDFSUsers.sh` 提交至已存在的叢集 (參考其叢集 ID)。指令碼會儲存至 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
```