

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

# 使用 Kerberos 透過 Amazon EMR 進行身分驗證
<a name="emr-kerberos"></a>

Amazon EMR 5.10.0 版及更高版本支援 Kerberos。Kerberos 是一種網路驗證協定，使用私密金鑰加密來提供強式身分驗證，因此密碼或其他憑證不會以未加密的格式透過網路傳送。

Kerberos 中需要驗證的服務和使用者稱為*主體*。主體存在於 Kerberos *領域*中。在該領域中，稱為 *金鑰分佈中心 (KDC)* 的 Kerberos 伺服器，會提供為主體進行身分驗證的方法。KDC 的做法是發出 *票證* 來進行身分驗證。KDC 維護在其領域中的主體資料庫、主體的密碼以及每個主體的其他管理資訊。KDC 也可接受來自其他領域中主體的身分驗證登入資料，這稱為 *跨域信任*。此外，EMR 叢集可以使用外部 KDC 來驗證主體。

建立跨域信任或使用外部 KDC 的常見案例是從 Active Directory 網域對使用者進行身分驗證。這可讓使用者在使用 SSH 連接至叢集或使用大數據應用程式時，使用其域帳戶來存取 EMR 叢集。

使用 Kerberos 身分驗證時，Amazon EMR 會為安裝在叢集上的應用程式、元件和子系統設定 Kerberos，使其可互相進行身分驗證。

**重要**  
Amazon EMR 不支援 AWS Directory Service for Microsoft Active Directory 跨領域信任或外部 KDC。

使用 Amazon EMR 設定 Kerberos 之前，建議您先熟悉 Kerberos 概念、在 KDC 上執行的服務、管理 Kerberos 服務的工具。如需詳細資訊，請參閱由 [Kerberos 協會](http://web.mit.edu/kerberos/krb5-latest/doc/)發布的 [MIT Kerberos 文件](http://kerberos.org/)。

**Topics**
+ [使用 Amazon EMR 支援的應用程式](emr-kerberos-principals.md)
+ [搭配 Amazon EMR 的 Kerberos 架構選項](emr-kerberos-options.md)
+ [在 Amazon EMR 上設定 Kerberos](emr-kerberos-configure.md)
+ [使用 SSH 透過 Amazon EMR 連線至 Kerberized 叢集](emr-kerberos-connect-ssh.md)
+ [教學課程：使用 Amazon EMR 設定叢集專用 KDC](emr-kerberos-cluster-kdc.md)
+ [教學課程：使用 Active Directory 域設定跨領域信任](emr-kerberos-cross-realm.md)

# 使用 Amazon EMR 支援的應用程式
<a name="emr-kerberos-principals"></a>

在 EMR 叢集中，Kerberos 主體是在所有叢集節點上執行的大數據應用程式服務和子系統。Amazon EMR 可以設定下列應用程式和元件使用 Kerberos。每個應用程式都有與其相關的 Kerberos 使用者主體。

Amazon EMR 不支援與 AWS Directory Service for Microsoft Active Directory的跨領域信任。

Amazon EMR 只會針對下列應用程式和元件，設定開放原始碼 Kerberos 身分驗證功能。任何其他安裝的應用程式都未 Kerberos 化，可能導致無法與 Kerberos 化的元件通訊，並造成應用程式錯誤。未 Kerberos 化的應用程式和元件無法啟用身分驗證。支援的應用程式和元件可能因不同的 Amazon EMR 版本而異。

Livy 使用者介面是唯一託管在 Kerberos 化叢集上的 Web 使用者介面。
+ **Hadoop MapReduce**
+ **Hbase**
+ **HCatalog**
+ **HDFS**
+ **Hive**
  + 請不要使用 LDAP 身分驗證啟用 Hive。這可能會導致和 Kerberos 化 YARN 的通訊問題。
+ **Hue**
  + Hue 使用者身分驗證未自動設定，可使用組態 API 以設定。
  + Hue 伺服器已 Kerberos 化。Hue 前端 (UI) 並未為身分驗證設定。可為 Hue UI 設定 LDAP 身分驗證。
+ **Livy**
  + Amazon EMR 5.22.0 版及更高版本支援使用 Kerberos 化叢集進行 Livy 模擬。
+ **Oozie**
+ **Phoenix**
+ **Presto**
  + Presto 在 Amazon EMR 6.9.0 版及更高版本中支援 Kerberos 驗證。
  + 若要針對 Presto 使用 Kerberos 驗證，您必須啟用[傳輸中加密](emr-data-encryption-options.md#emr-encryption-intransit)。
+ **Spark**
+ **Tez**
+ **Trino**
  + Trino 在 Amazon EMR 6.11.0 版及更高版本中支援 Kerberos 驗證。
  + 若要針對 Trino 使用 Kerberos 驗證，您必須啟用[傳輸中加密](emr-data-encryption-options.md#emr-encryption-intransit)。
+ **YARN**
+ **Zeppelin**
  + Zeppelin 只會設定為以 Spark 解譯器搭配 Kerberos 使用。其並未為其他轉譯器設定。
  + 除 Spark 之外，Kerberos 化 Zeppelin 解譯器不支援使用者模擬。
+ **Zookeeper**
  + Zookeeper 用戶端不受支援。

# 搭配 Amazon EMR 的 Kerberos 架構選項
<a name="emr-kerberos-options"></a>

將 Kerberos 與 Amazon EMR 搭配使用時，您可以從本章節所列的架構中進行選擇。無論選擇哪個架構，請使用相同的步驟來設定 Kerberos。您建立安全組態、在建立叢集時指定安全組態和相容的叢集特定 Kerberos 選項，並在符合 KDC 中使用者主體的叢集上，為 Linux 使用者建立 HDFS 目錄。如需組態選項的說明和每個架構的範例組態，請參閱[在 Amazon EMR 上設定 Kerberos](emr-kerberos-configure.md)。

## 叢集專用 KDC (主節點上的 KDC)
<a name="emr-kerberos-localkdc-summary"></a>

此組態適用於 Amazon EMR 5.10.0 版及更高版本。

![\[Amazon EMR叢集 architecture with master node, core nodes, and task node within a Kerberos realm.\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/kerb-cluster-dedicated-kdc.png)


**優點**
+ Amazon EMR 具有完整的 KDC 擁有權。
+ EMR 叢集上的 KDC 獨立於集中式 KDC 實作，例如 Microsoft Active Directory 或 AWS Managed Microsoft AD。
+ 對效能的影響微乎其微，因為 KDC 僅管理叢集中本機節點的身分驗證。
+ 或者，其他 Kerberos 化的叢集可以參考 KDC 做為外部 KDC。如需詳細資訊，請參閱[外部 KDC – 不同叢集上的主節點](#emr-kerberos-extkdc-cluster-summary)。

**考量和限制**
+ Kerberos 化叢集不能相互驗證，所以應用程式無法相互運作。如果叢集應用程式需要相互運作，您必須在叢集之間建立跨域信任，或設定一個叢集做為其他叢集的外部 KDC。如果建立跨域信任，KDC 必須有不同的 Kerberos 領域。
+ 您必須在對應到 KDC 使用者主體的主節點 EC2 執行個體上建立 Linux 使用者，以及每個使用者 HDFS 目錄。
+ 使用者主體必須使用 EC2 私有金鑰檔案和 `kinit` 登入資料，以使用 SSH 連接到叢集。

## 跨領域信任
<a name="emr-kerberos-crossrealm-summary"></a>

在這個組態中，來自不同 Kerberos 領域的主體 (通常是使用者) 會向 Kerberos 化 EMR 叢集上的應用程式元件進行驗證，此叢集具有自己的 KDC。主節點上的 KDC 會使用同時存在於兩個 KDC 中的*跨領域主體*，與另一個 KDC 建立信任關係。每個 KDC 中的主體名稱和密碼完全相符。跨域信任最常用於 Active Directory 實作，如下圖所示。也支援在外部 MIT KDC 或另一個 Amazon EMR 叢集上之 KDC 的跨領域信任。

![\[Amazon EMR clusters in different Kerberos realms with cross-realm trust to Active Directory.\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/kerb-cross-realm-trust.png)


**優點**
+ 安裝 KDC 的 EMR 叢集保有 KDC 的完整擁有權。
+ 使用 Active Directory 時，Amazon EMR 會自動建立對應至 KDC 上使用者主體的 Linux 使用者。您仍必須為每個使用者建立 HDFS 目錄。此外，Active Directory 網域中的使用者主體可以使用 `kinit` 登入資料來存取 Kerberos 化叢集，無需使用 EC2 私有金鑰檔案。這讓您不必在叢集使用者之間共用私有金鑰檔案。
+ 因為每個叢集 KDC 管理叢集中節點的身分驗證，因此網路延遲和處理成本對叢集中大量節點的影響可降至最低。

**考量和限制**
+ 如果您要與 Active Directory 領域建立信任，您必須提供當您建立叢集時具備將主體加入網域之許可的 Active Directory 使用者名稱和密碼。
+ 跨域信任無法在具有相同名稱的 Kerberos 領域之間建立。
+ 跨域信任必須明確建立。例如，如果叢集 A 和叢集 B 都與 KDC 建立跨域信任，他們本質上並不會彼此信任，其應用程式也無法相互進行身分驗證以相互運作。
+ KDC 必須獨立地加以維持和協調，使用者主體的登入資料才能完全相符。

## 外部 KDC
<a name="emr-kerberos-extkdc-summary"></a>

Amazon EMR 5.20.0 及更高版本支援搭配外部 KDC 的組態。
+ [外部 KDC – MIT KDC](#emr-kerberos-extkdc-mit-summary)
+ [外部 KDC – 不同叢集上的主節點](#emr-kerberos-extkdc-cluster-summary)
+ [外部 KDC – 叢集 KDC 位於具有 Active Directory 跨領域信任的不同叢集上](#emr-kerberos-extkdc-ad-trust-summary)

### 外部 KDC – MIT KDC
<a name="emr-kerberos-extkdc-mit-summary"></a>

此組態允許一或多個 EMR 叢集使用在 MIT KDC 伺服器中定義和維護的主體。

![\[Amazon EMR叢集 architecture with Kerberos realm, showing master, core, and task nodes.\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/kerb-external-kdc.png)


**優點**
+ 主體管理已整合至單一 KDC。
+ 多個叢集可以使用相同 Kerberos 領域中的相同 KDC。如需詳細資訊，請參閱[使用多個具有相同 KDC 的叢集的需求](#emr-kerberos-multi-kdc)。
+ Kerberos 化叢集上的主節點無須承受與維護 KDC 關聯的效能負擔。

**考量和限制**
+ 您必須在對應到 KDC 使用者主體之每個 Kerberos 化叢集主節點的 EC2 執行個體上建立 Linux 使用者，以及每個使用者的 HDFS 目錄。
+ 使用者主體必須使用 EC2 私有金鑰檔案和 `kinit` 登入資料，以使用 SSH 連接到 Kerberos 化叢集。
+ Kerberos 化 EMR 叢集中的每個節點都必須有連到 KDC 的網路路由。
+ Kerberos 化叢集中的每個 節點都會對外部 KDC 帶來身分驗證負擔，因此 KDC 的組態會影響叢集效能。設定 KDC 伺服器的硬體時，請考慮能同時支援的最大 Amazon EMR 節點數。
+ 叢集效能取決於 Kerberos 化叢集中節點和 KDC 之間的網路延遲。
+ 由於不同的因素相互牽連，疑難排解會比較困難。

### 外部 KDC – 不同叢集上的主節點
<a name="emr-kerberos-extkdc-cluster-summary"></a>

此組態幾乎等同於上述的外部 MIT KDC 實作，除了 KDC 位於 EMR 叢集的主節點上。如需詳細資訊，請參閱[叢集專用 KDC (主節點上的 KDC)](#emr-kerberos-localkdc-summary)及[教學課程：使用 Active Directory 域設定跨領域信任](emr-kerberos-cross-realm.md)。

![\[Diagram of Amazon EMR clusters with Kerberos realm, showing master and core nodes.\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/kerb-external-cluster-kdc.png)


**優點**
+ 主體管理已整合至單一 KDC。
+ 多個叢集可以使用相同 Kerberos 領域中的相同 KDC。如需詳細資訊，請參閱[使用多個具有相同 KDC 的叢集的需求](#emr-kerberos-multi-kdc)。

**考量和限制**
+ 您必須在對應到 KDC 使用者主體之每個 Kerberos 化叢集主節點的 EC2 執行個體上建立 Linux 使用者，以及每個使用者的 HDFS 目錄。
+ 使用者主體必須使用 EC2 私有金鑰檔案和 `kinit` 登入資料，以使用 SSH 連接到 Kerberos 化叢集。
+ 每個 EMR 叢集中的每個節點都必須有連到 KDC 的網路路由。
+ Kerberos 化叢集中的每個 Amazon EMR 節點都會對外部 KDC 帶來身分驗證負擔，因此 KDC 的組態會影響叢集效能。設定 KDC 伺服器的硬體時，請考慮能同時支援的最大 Amazon EMR 節點數。
+ 叢集效能取決於叢集中節點和 KDC 之間的網路延遲。
+ 由於不同的因素相互牽連，疑難排解會比較困難。

### 外部 KDC – 叢集 KDC 位於具有 Active Directory 跨領域信任的不同叢集上
<a name="emr-kerberos-extkdc-ad-trust-summary"></a>

在這個組態中，您先使用與 Active Directory 具有單向跨域信任的叢集專用 KDC，來建立叢集。如需詳細教學，請參閱[教學課程：使用 Active Directory 域設定跨領域信任](emr-kerberos-cross-realm.md)。接著啟動其他叢集，參考具有信任的叢集 KDC 做為外部 KDC。如需範例，請參閱 [外部叢集 KDC 搭配 Active Directory 跨領域信任](emr-kerberos-config-examples.md#emr-kerberos-example-extkdc-ad-trust)。這可讓使用外部 KDC 的每個 Amazon EMR 叢集，驗證在 Microsoft Active Directory 域中定義和維護的主體。

![\[Amazon EMR clusters with Kerberos authentication and Active Directory integration diagram.\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/kerb-external-ad-trust-kdc.png)


**優點**
+ 管理主體已合併至 Active Directory 網域。
+ Amazon EMR 加入 Active Directory 領域，因此無需建立對應至 Active Directory 使用者的 Linux 使用者。您仍必須為每個使用者建立 HDFS 目錄。
+ 多個叢集可以使用相同 Kerberos 領域中的相同 KDC。如需詳細資訊，請參閱[使用多個具有相同 KDC 的叢集的需求](#emr-kerberos-multi-kdc)。
+ Active Directory 網域中的使用者主體可以使用 `kinit` 登入資料來存取 Kerberos 化叢集，無需使用 EC2 私有金鑰檔案。這讓您不必在叢集使用者之間共用私有金鑰檔案。
+ 只有一個 Amazon EMR 主節點需負擔維護 KDC 的責任，而且只有該叢集必須使用 Active Directory 憑證來建立 KDC 與 Active Directory 之間的跨領域信任。

**考量和限制**
+ 每個 EMR 叢集中的每個節點都必須有連到 KDC 和 Active Directory 網域控制器的網路路由。
+ 每個 Amazon EMR 節點都會對外部 KDC 造成身分驗證負擔，因此 KDC 的組態會影響叢集效能。設定 KDC 伺服器的硬體時，請考慮能同時支援的最大 Amazon EMR 節點數。
+ 叢集效能取決於叢集中節點和 KDC 伺服器之間的網路延遲。
+ 由於不同的因素相互牽連，疑難排解會比較困難。

## 使用多個具有相同 KDC 的叢集的需求
<a name="emr-kerberos-multi-kdc"></a>

多個叢集可以使用相同 Kerberos 領域中的相同 KDC。但是，如果叢集同時執行，則在叢集使用衝突的 Kerberos ServicePrincipal 名稱時，叢集可能會失敗。

如果您的多個並行叢集具有相同的外部 KDC，請確定叢集使用不同的 Kerberos 領域。如果叢集必須使用相同的 Kerberos 領域，請確定叢集在不同的子網路中，而且其 CIDR 範圍不重疊。

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

# 使用 SSH 透過 Amazon EMR 連線至 Kerberized 叢集
<a name="emr-kerberos-connect-ssh"></a>

本章節示範 Kerberos 驗證使用者連接到 EMR 叢集主節點的步驟。

用於 SSH 連線的每部電腦必須安裝 SSH 用戶端和 Kerberos 用戶端應用程式。Linux 電腦很可能預設已包含這些項目。例如，大多數的 Linux、Unix 和 macOS 作業系統都會安裝 OpenSSH。您可以藉由在命令列鍵入 **ssh** 來檢查 SSH 用戶端。如果您的電腦無法識別該命令，請安裝 SSH 用戶端以連接至主節點。OpenSSH 專案提供 SSH 工具完整套件的免費實作。如需詳細資訊，請參閱 [OpenSSH](http://www.openssh.org/) 網站。Windows 使用者可以使用應用程式 (例如 [PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/)) 做為 SSH 用戶端。

如需 SSH 連線的詳細資訊，請參閱「[連線至 Amazon EMR 叢集](emr-connect-master-node.md)」。

SSH 使用 GSSAPI 來驗證 Kerberos 用戶端，而您必須在叢集主節點上為 SSH 服務啟用 GSSAPI 身分驗證。如需詳細資訊，請參閱[為 SSH 啟用 GSSAPI](emr-kerberos-configuration-users.md#emr-kerberos-ssh-config)。SSH 用戶端也必須使用 GSSAPI。

在下列範例中，針對 *MasterPublicDNS*，使用**主要公有 DNS** 顯示的值 (位於叢集詳細資訊窗格的**摘要**標籤中)，例如 *ec2-11-222-33-44.compute-1.amazonaws.com*。

## krb5.conf 的先決條件 (非 Active Directory)
<a name="emr-kerberos-conffile"></a>

使用未與 Active Directory 整合的組態時，除了 SSH 用戶端和 Kerberos 用戶端應用程式，每個用戶端電腦還必須擁有符合叢集主節點上 `/etc/krb5.conf` 檔案的 `/etc/krb5.conf` 檔案副本。

**複製 krb5.conf 檔案**

1. 使用 EC2 金鑰對和預設 `hadoop` 使用者，以 SSH 連接到主節點 – 例如 `hadoop@MasterPublicDNS`。如需詳細說明，請參閱 [連線至 Amazon EMR 叢集](emr-connect-master-node.md)。

1. 從主節點，複製 `/etc/krb5.conf` 檔案的內容。如需詳細資訊，請參閱[連線至 Amazon EMR 叢集](emr-connect-master-node.md)。

1. 在每個將連接到叢集的用戶端電腦上，根據您在上一個步驟所製作的副本，建立相同的 `/etc/krb5.conf` 檔案。

## 使用 Kinit 和 SSH
<a name="emr-kerberos-kinit-ssh"></a>

每次使用者從用戶端電腦使用 Kerberos 登入資料進行連線時，使用者必須先在用戶端電腦上為其使用者續約 Kerberos 票證。此外，SSH 用戶端也必須設定為使用 GSSAPI 身分驗證。

**使用 SSH 連接到 Kerberos 化 EMR 叢集**

1. 使用 `kinit` 續約您的 Kerberos 票證，如下列範例所示

   ```
   kinit user1
   ```

1. 使用 `ssh` 用戶端以及您在叢集專用 KDC 中建立的主體或 Active Directory 使用者名稱。請確定已啟用 GSSAPI 身分驗證，如以下範例所示。

   **範例：Linux 使用者**

   `-K `選項指定 GSSAPI 身分驗證。

   ```
   ssh -K user1@MasterPublicDNS
   ```

   **範例：Windows 使用者 (PuTTY)**

   請確定已啟用工作階段的 GSSAPI 身分驗證選項，如下所示：  
![\[PuTTY Configuration window showing GSSAPI authentication options and library preferences.\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/kerb-gssapi-putty.png)

# 教學課程：使用 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)。

# 教學課程：使用 Active Directory 域設定跨領域信任
<a name="emr-kerberos-cross-realm"></a>

當您設定跨域信任時，可允許來自不同 Kerberos 領域的主體 (通常為使用者) 來驗證在 EMR 叢集上的應用程式元件。叢集專用的*金鑰分佈中心 (KDC)* 會使用同時存在兩個 KDC 中的*跨領域主體*，來和另一個 KDC 建立信任關係。主體名稱和密碼完全相符。

跨域信任需要 KDC 可以透過網路連接彼此，並解析各自的網域名稱。以下提供使用以 EC2 執行個體方式執行的 Microsoft AD 網域控制站來建立跨域信任關係的步驟，以及提供需要連線能力和網域名稱解析的網路設定範例。任何允許 KDC 之間所需網路流量的網路設定都是可以接受的。

或者，在您使用一個叢集上的 KDC 與 Active Directory 建立跨域信任後，您可以使用參考第一個叢集上 KDC 做為外部 KDC 的不同安全組態來建立另一個叢集。如需安全組態和叢集設定範例，請參閱 [外部叢集 KDC 搭配 Active Directory 跨領域信任](emr-kerberos-config-examples.md#emr-kerberos-example-extkdc-ad-trust)。

如需 Kerberos 和 KDC 的 Amazon EMR 支援的詳細資訊，以及 MIT Kerberos 文件的連結，請參閱 [使用 Kerberos 透過 Amazon EMR 進行身分驗證](emr-kerberos.md)。

**重要**  
Amazon EMR 不支援跨領域信任 AWS Directory Service for Microsoft Active Directory。

[步驟 1：設定 VPC 和子網路](#emr-kerberos-ad-network)

[步驟 2：啟動和安裝 Active Directory 域控制器](#emr-kerberos-ad-dc)

[步驟 3：新增帳戶到 EMR 叢集的域](#emr-kerberos-ad-users)

[步驟 4：設定在 Active Directory 域控制器上的傳入信任](#emr-kerberos-ad-configure-trust)

[步驟 5：使用 DHCP 選項集將 Active Directory 域控制器指定為 VPC DNS 伺服器](#emr-kerberos-ad-DHCP)

[步驟 6：啟動 Kerberos 化 EMR 叢集](#emr-kerberos-ad-cluster)

[步驟 7：建立 HDFS 使用者並在 Active Directory 帳戶的叢集上設定許可](#emr-kerberos-ad-hadoopuser)

## 步驟 1：設定 VPC 和子網路
<a name="emr-kerberos-ad-network"></a>

以下步驟示範建立 VPC 和子網路，讓叢集專用 KDC 可以連接 Active Directory 網域控制站並解析其網域名稱。在這些步驟中，透過參考 Active Directory 網域控制站做為在 DHCP 選項集中的網域名稱伺服器，提供網域名稱解析。如需詳細資訊，請參閱[步驟 5：使用 DHCP 選項集將 Active Directory 域控制器指定為 VPC DNS 伺服器](#emr-kerberos-ad-DHCP)。

KDC 和 Active Directory 網域控制站必須能夠解析另一個網域名稱。如此一來，Amazon EMR 可將電腦加入域，並在叢集執行個體上自動設定對應的 Linux 帳戶和 SSH 參數。

如果 Amazon EMR 無法解析域名稱，您可以使用 Active Directory 域控制器的 IP 地址參考信任。不過，您必須手動新增 Linux 帳戶、新增對應的主體至叢集專用 KDC 和設定 SSH。

**設定 VPC 和子網路**

1. 建立具有單一公有子網路的 Amazon VPC。如需詳細資訊，請參閱《Amazon VPC 入門指南》**中的[步驟 1：建立 VPC](https://docs.aws.amazon.com/AmazonVPC/latest/GettingStartedGuide/getting-started-ipv4.html#getting-started-create-vpc)。
**重要**  
當您使用 Microsoft Active Directory 網域控制站時，請選擇 EMR 叢集的 CIDR 區塊，讓所有 IPv4 地址的長度少於 9 個字元 (例如 10.0.0.0/16)。這是因為當電腦加入 Active Directory 目錄時，會使用叢集電腦的 DNS 名稱。 會根據 IPv4 地址 AWS 指派 [DNS 主機名稱](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-hostnames)，這樣較長的 IP 地址可能會導致 DNS 名稱超過 15 個字元。Active Directory 限制註冊加入電腦名稱為 15 個字元，而截斷較長的名稱可能會導致無法預測的錯誤。

1. 移除指派至 VPC 的預設 DHCP 選項集。如需詳細資訊，請參閱[變更 VPC 以使用無 DHCP 選項](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html#DHCP_Use_No_Options)。之後，新增指定 Active Directory 網域控制站為 DNS 伺服器的新 VPC。

1. 確認 DNS 支援已為 VPC 啟用，也就是說，該 DNS 主機名稱和 DNS 解析都已啟用。預設為皆啟用。如需詳細資訊，請參閱[更新 VPC 的 DNS 支援](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)。

1. 確認您的 VPC 已連接到網際網路閘道，此為預設。如需詳細資訊，請參閱[建立和連接網際網路閘道](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Attach_Gateway)。
**注意**  
此範例中使用網際網路閘道，因為您正在為 VPC 建立新的網域控制站。您的應用程式可能不需要網際網路閘道。唯一的要求是，叢集專用 KDC 可以存取 Active Directory 網域控制站。

1. 建立自訂路由表，新增以網際網路閘道為目標的路由，然後將其連接到您的子網路。如需詳細資訊，請參閱[建立自訂路由表](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Routing)。

1. 當您為網域控制站啟動 EC2 執行個體時，其必須擁有靜態公有 IPv4 地址，讓您可使用 RDP 連接到該執行個體。最簡單的方法是設定您的子網路為自動指派公有 IPv4 地址。這不是子網路建立時的預設設定。如需詳細資訊，請參閱[修改子網路的公有 IPv4 定址屬性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)。您可以選擇在啟動執行個體時指派地址。如需詳細資訊，請參閱[在執行個體啟動期間指派公有 IPv4 地址](https://docs.aws.amazon.com/vpc/latest/userguide/using-instance-addressing.html#public-ip-addresses)。

1. 完成後，請記下您的 VPC 和子網路 ID。您稍後啟動 Active Directory 網域控制站和叢集時，便可以使用。

## 步驟 2：啟動和安裝 Active Directory 域控制器
<a name="emr-kerberos-ad-dc"></a>

1. 根據 Microsoft Windows Server 2016 Base AMI 啟動 EC2 執行個體。我們建議使用 m4.xlarge 或更好的執行個體類型。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[啟動 AWS Marketplace 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/launch-marketplace-console.html)。

1. 請記下與 EC2 執行個體相關聯之安全群組的 Group ID (群組 ID)。您需要它用於 [步驟 6：啟動 Kerberos 化 EMR 叢集](#emr-kerberos-ad-cluster)。我們使用 *sg-012xrlmdomain345*。或者，您可以為 EMR 叢集指定不同的安全群組，以及這個執行個體允許它們之間的流量。如需詳細資訊，請參閱《Amazon EC2 使用者指南》**中的[適用於 Linux 執行個體的 Amazon EC2 安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)一節。

1. 使用 RDP 連接到 EC2 執行個體。如需詳細資訊，請參閱《*Amazon EC2 使用者指南》中的*[連線至 Windows 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.html)。

1. 啟動**伺服器管理員**，以在伺服器上安裝和設定 Active Directory 域服務角色。將伺服器升級為網域控制站並指派網域名稱 (此處使用的範例是 `ad.domain.com`)。請記下網域名稱，因為您稍後建立 EMR 安全組態和叢集時會需要此網域名稱。如果您是第一次設定 Active Directory，可以遵循[如何在 Windows Server 2016 中設定 Active Directory (AD)](https://ittutorials.net/microsoft/windows-server-2016/setting-up-active-directory-ad-in-windows-server-2016/) 中的指示進行操作。

   執行個體在您完成後會重新啟動。

## 步驟 3：新增帳戶到 EMR 叢集的域
<a name="emr-kerberos-ad-users"></a>

RDP 到 Active Directory 域控制器為每個叢集使用者在 Active Directory 使用者和電腦中建立帳戶。如需詳細資訊，請參閱 *Microsoft 學習*網站上的[在 Active Directory 使用者和電腦中建立使用者帳戶](https://technet.microsoft.com/en-us/library/dd894463(v=ws.10).aspx)。請記下每個使用者的 **User logon name (使用者登入名稱)**。您稍後在設定叢集時需要這些使用者登入名稱。

此外，建立具備足夠權限的帳戶，可將電腦加入域。您在建立叢集時指定此帳戶。Amazon EMR 使用此帳戶將叢集執行個體加入域。您會在 [步驟 6：啟動 Kerberos 化 EMR 叢集](#emr-kerberos-ad-cluster) 中指定此帳戶和其密碼。若要委派電腦加入權限給帳戶，建議您建立具備加入權限的群組，再將使用者指派給群組。如需說明，請參閱《AWS Directory Service 管理指南》**中的[委派目錄加入權限](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_join_privileges.html)。

## 步驟 4：設定在 Active Directory 域控制器上的傳入信任
<a name="emr-kerberos-ad-configure-trust"></a>

以下的範例命令在 Active Directory 中建立信任，這是具有叢集專用 KDC 的單向、連入、非轉移、領域信任。我們用於叢集領域的範例為 `EC2.INTERNAL`。將 *KDC-FQDN* 取代為託管 KDC 的 Amazon EMR 主節點列出的**公有 DNS** 名稱。`passwordt` 參數會指定 **cross-realm principal password (跨域主體密碼)**，這是您在建立叢集時，連同叢集 **realm (領域)** 一起指定的項目。領域名稱衍生自叢集的 `us-east-1` 中的預設網域名稱。該 `Domain` 是您在建立信任時的 Active Directory 網域，慣例為小寫。該範例使用 `ad.domain.com`。

以管理員權限開啟 Windows 命令提示，輸入下列命令，在 Active Directory 網域控制站上建立信任關係：

```
C:\Users\Administrator> ksetup /addkdc EC2.INTERNAL KDC-FQDN
C:\Users\Administrator> netdom trust EC2.INTERNAL /Domain:ad.domain.com /add /realm /passwordt:MyVeryStrongPassword
C:\Users\Administrator> ksetup /SetEncTypeAttr EC2.INTERNAL AES256-CTS-HMAC-SHA1-96
```

## 步驟 5：使用 DHCP 選項集將 Active Directory 域控制器指定為 VPC DNS 伺服器
<a name="emr-kerberos-ad-DHCP"></a>

現在 Active Directory 網域控制站已設定，您必須設定 VPC，以將其做為您 VPC 中名稱解析的網域名稱伺服器。若要執行此操作，連接 DHCP 選項集。將**域名稱**指定為您叢集的域名稱 – 例如，如果您的叢集位於 us-east-1 或其他區域的 `region.compute.internal`，則指定 `ec2.internal`。針對 **Domain name servers (網域名稱伺服器)**，您必須指定 Active Directory 網域控制器的 IP 地址 (必須能夠從叢集存取) 做為第一個項目，接著是 **AmazonProvidedDNS (AmazonProvidedDNS)** (例如 ***xx.xx.xx.xx*、AmazonProvidedDNS**)。如需詳細資訊，請參閱[變更 DHCP 選項集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html#DHCPOptions)。

## 步驟 6：啟動 Kerberos 化 EMR 叢集
<a name="emr-kerberos-ad-cluster"></a>

1. 在 Amazon EMR 中建立安全組態，其指定您在先前步驟中建立的 Active Directory 域控制器。範例命令顯示如下：以您在 `ad.domain.com` 中指定的網域名稱取代 [步驟 2：啟動和安裝 Active Directory 域控制器](#emr-kerberos-ad-dc) 網域。

   ```
   aws emr create-security-configuration --name MyKerberosConfig \
   --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"
           }
         }
       }
     }
   }'
   ```

1. 使用下列屬性建立一個叢集：
   + 使用 `--security-configuration` 選項來指定您建立的安全組態。我們在範例中使用 *MyKerberosConfig*。
   + 使用的 `--ec2-attributes option` 的 `SubnetId` 屬性來指定您在 [步驟 1：設定 VPC 和子網路](#emr-kerberos-ad-network) 中建立的子網路。我們在範例中使用 *step1-subnet*。
   + 使用 `--ec2-attributes` 選項的 `AdditionalMasterSecurityGroups` 和 `AdditionalSlaveSecurityGroups`，指定從 [步驟 2：啟動和安裝 Active Directory 域控制器](#emr-kerberos-ad-dc) 和 AD 域控制器關聯的安全群組與叢集主節點、核心節點和任務節點關聯。我們在範例中使用 *sg-012xrlmdomain345*。

   使用 `--kerberos-attributes` 指定下列叢集特定的 Kerberos 屬性：
   + 您設定 Active Directory 網域控制站時指定的叢集領域。
   + 您在 `passwordt` 中指定為 [步驟 4：設定在 Active Directory 域控制器上的傳入信任](#emr-kerberos-ad-configure-trust) 的跨域信任主體密碼。
   + 您可用來管理叢集專用 KDC 的 `KdcAdminPassword`。
   + 您在 [步驟 3：新增帳戶到 EMR 叢集的域](#emr-kerberos-ad-users) 中建立具有電腦加入權限的 Active Directory 帳戶使用者登入名稱和密碼。

   下列範例啟動 Kerberos 化叢集。

   ```
   aws emr create-cluster --name "MyKerberosCluster" \
   --release-label emr-5.10.0 \
   --instance-type m5.xlarge \
   --instance-count 3 \
   --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2KeyPair,\
   SubnetId=step1-subnet, AdditionalMasterSecurityGroups=sg-012xrlmdomain345,
   AdditionalSlaveSecurityGroups=sg-012xrlmdomain345\
   --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,\
   ADDomainJoinUser=ADUserLogonName,ADDomainJoinPassword=ADUserPassword,\
   CrossRealmTrustPrincipalPassword=MatchADTrustPwd
   ```

## 步驟 7：建立 HDFS 使用者並在 Active Directory 帳戶的叢集上設定許可
<a name="emr-kerberos-ad-hadoopuser"></a>

使用 Active Directory 設定信任關係時，Amazon EMR 會為每個 Active Directory 帳戶在叢集上建立 Linux 使用者。例如，在 Active Directory 中的使用者登入名稱 `LiJuan` 擁有 `lijuan` 的 Linux 帳戶。Active Directory 使用者名稱可包含大寫字母，但 Linux 不會使用 Active Directory 的大小寫。

若要讓您的使用者登入叢集以執行 Hadoop 作業，您必須為 Linux 帳戶新增 HDFS 使用者目錄，並授予每位使用者目錄的擁有權。若要執行此操作，建議您執行以叢集步驟儲存至 Amazon S3 的指令碼。或者，您可以執行下面的指令碼中的命令，其來自主節點的命令列。使用您建立叢集時所指定的 EC2 金鑰對，透過 SSH 連接到主節點，以作為 Hadoop 使用者。如需詳細資訊，請參閱[針對 Amazon EMR 的 SSH 登入資料使用 EC2 金鑰對](emr-plan-access-ssh.md)。

執行下列的指令，來將步驟新增到執行 *AddHDFSUsers.sh* 指令碼的叢集。

```
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 and KDC principals 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
```

### Active Directory 群組映射至 Hadoop 群組
<a name="emr-kerberos-ad-group"></a>

Amazon EMR 使用系統安全服務常駐程式 (SSD)，以將 Active Directory 群組映射至 Hadoop 群組。若要確認群組映射，如 [使用 SSH 透過 Amazon EMR 連線至 Kerberized 叢集](emr-kerberos-connect-ssh.md) 所述登入主節點後，您可以使用 `hdfs groups` 命令，確認您 Active Directory 帳戶所屬的 Active Directory 群組已映射至叢集上對應 Hadoop 使用者的 Hadoop 群組。您也可以使用命令，例如 `hdfs groups lijuan`，指定一個或多個使用者名稱，查看其他使用者的群組映射。如需詳細資訊，請參閱 [Apache HDFS 命令指南](https://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html#groups)中的「[群組](https://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html)」。