

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

# 在 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_tw/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)。


| 參數 | Description | 
| --- | --- | 
|  領域  |  叢集的 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 commands。

## 本機 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 主體的最簡單方法。或者，您也可以使用 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
```