

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

# 教學課程：使用 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 的安全組態。下列範例示範使用 的`create-security-configuration`命令 AWS CLI ，將安全組態指定為內嵌 JSON 結構。您也可以參考儲存在本機的檔案。

   ```
   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 需要為本機主機和每個您在叢集上建立的使用者新增主體。如果使用者需要連接到叢集並執行 Hadoop 任務，您也可以為每個使用者建立 HDFS 目錄。同樣地，設定 SSH 服務，以啟用 Kerberos 所需的 GSSAPI 驗證。啟用 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 連線至 Kerberized 叢集](emr-kerberos-connect-ssh.md)。