

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

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