AD Connector 入門 - AWS Directory Service

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

AD Connector 入門

使用 AD Connector,您可以連接 AWS Directory Service 到現有的企業Active Directory。連線至現有目錄時,所有目錄資料都會保留在網域控制站上。 AWS Directory Service 不會複寫您的任何目錄資料。

AD Connector 事前準備

若要使用 AD Connector 連線到現有目錄,您需要準備下列項目:

Amazon VPC

進行下列 VPC 設定:

  • 至少兩個子網路。每個子網路皆必須位於不同的可用區域。

  • VPC 必須透過虛擬私有網路 (VPN) 連線或 AWS Direct Connect連線到您的現有網路。

  • VPC 必須具有預設硬體租用。

AWS Directory Service 使用兩個 VPC 結構。構成目錄的 EC2 執行個體在您的 AWS 帳戶之外執行,並由管理 AWS。其使用兩種網路轉接器,ETH0ETH1ETH0 是管理轉接器,而且位於您的帳戶外部。ETH1 則是建立於您的帳戶內部。

目錄的 ETH0 網路的管理 IP 範圍以程式設計方式選擇,以確保它不會與部署目錄的 VPC 發生衝突。此 IP 範圍可以是以下任一對 (因為目錄在兩個子網路中運作):

  • 10.0.1.0/24 & 10.0.2.0/24

  • 169.254.0.0/16

  • 192.168.1.0/24 & 192.168.2.0/24

我們透過檢查 ETH1 CIDR 的第一個八位元組來避免衝突。如果以 10 開頭,則我們選擇具有 192.168.1.0/24 和 192.168.2.0/24 子網路並且地址為 192.168.0.0/16 的 VPC。如果第一個八位元位元組不是 10,我們會選擇具有 10.0.1.0/24 和 10.0.2.0/24 子網路並且地址為 10.0.0.0/16 的 VPC。

選取演算法不包含 VPC 上的路由。因此,這種情況可能會導致 IP 路由衝突。

如需詳細資訊,請參閱 Amazon VPC 使用者指南 中的下列主題:

若要取得有關的更多資訊 AWS Direct Connect,請參閱AWS Direct Connect 使用者指南

現有 Active Directory

您需要連接到具有Active Directory域的現有網絡。

注意

AD Connector 不支援單一標籤域

此Active Directory網域的功能層級必須是Windows Server 2003或更高。AD Connector 也支援連線到託管於 Amazon EC2 執行個體上的域。

注意

當 AD Connector 與 Amazon EC2 加入域功能結合使用時,不支援唯讀域控制站 (RODC)。

服務帳戶

您必須具備在現有目錄中,已委派下列權限之服務帳戶的登入資料:

  • 讀取使用者和群組 – 必要

  • 將電腦加入網域-僅在使用無縫網域加入和 WorkSpaces

  • 建立電腦物件-僅在使用無縫網域加入和 WorkSpaces

  • 服務帳戶密碼應符合 AWS 密碼需求。 AWS 密碼應該是:

    • 長度介於 8 到 128 個字元之間,包括在內。

    • 至少包含以下四種類別中的三個字符:

      • 小寫字母 (a-z)

      • 大寫字母 (A-Z)

      • 數字 (0-9)

      • 非英數字元 (~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/)

如需詳細資訊,請參閱 委派權限給您的服務帳戶

注意

AD Connector 使用 Kerberos 對 AWS 應用程式進行身分驗證和授權。LDAP 僅用於使用者和群組物件查詢 (讀取操作)。對於 LDAP 交易,任何內容都不可變,並且憑證不會以明文形式傳遞。驗證是由 AWS 內部服務處理,該服務使用 Kerberos 票證以使用者身分執行 LDAP 作業。

使用者權限

所有 Active Directory 使用者必須具有讀取自己屬性的許可。特別是下列屬性:

  • GivenName

  • SurName

  • Mail

  • SamAccountName

  • UserPrincipalName

  • UserAccountControl

  • MemberOf

在預設情況下,Active Directory 使用者具有讀取這些屬性的許可。不過,管理員可能隨時間變更這些許可,所以您在首次設定 AD Connector 前,可能需先確認您的使用者擁有這些讀取許可。

IP 地址

取得您現有目錄中兩個 DNS 伺服器或網域控制器的 IP 地址。

當 AD Connector 連線到您的目錄時,要從這些伺服器取得 _ldap._tcp.<DnsDomainName>_kerberos._tcp.<DnsDomainName> SRV 記錄,所以這些伺服器必須含有這些 SRV 記錄。AD Connector 會嘗試找到同時提供 LDAP 和 Kerberos 服務的常見域控制站,因此這些 SRV 記錄必須至少包含一個常見域控制站。如需 SRV 記錄的詳細資訊,請前往 Microsoft 上的 SRV 資源記錄。 TechNet

子網路的連接埠

若要讓 AD Connector 將目錄請求重新導向至您現有的網Active Directory域控制站,您現有網路的防火牆必須對 Amazon VPC 中兩個子網路的 CIDR 開放下列連接埠。

  • TCP/UDP 53 - DNS

  • TCP/UDP 88 - Kerberos 身分驗證

  • TCP/UDP 389 - LDAP

您至少需要這些連接埠,AD Connector 才可連線到您的目錄。您特定的組態可能需要開啟其他連接埠。

如果您想要使用 AD Connector 器和 Amazon WorkSpaces,您的網域控制站必須設定為 0。這是網域控制站的預設設定。如果已啟用停用 LvLvSupport 屬性,則 AD Connector 將無法查詢目錄中的使用者。如此可防止 AD Connector 使用 Amazon WorkSpaces。

注意

如果您現有網域的 DNS 伺服器或網Active Directory域控制站伺服器位於 VPC 內,則與這些伺服器相關聯的安全性群組必須對 VPC 中兩個子網路的 CIDR 開放上述連接埠。

如需其他連接埠需求,請參閱Microsoft文件中的 AD 和 AD DS 連接埠需求

Kerberos 預先驗證

您的使用者帳戶必須啟用 Kerberos 預先驗證。如需詳細的說明了解如何啟用此設定,請參閱 確定已啟用 Kerberos 預先驗證。如需有關此設定的一般資訊,請移至預先驗證的Microsoft TechNet。

加密類型

AD Connector 在透過 Kerberos 對您的 Active Directory 網域控制站進行身分驗證時,支援下列加密類型:

  • AES-256-HMAC

  • AES-128-HMAC

  • RC4-HMAC

AWS IAM Identity Center 前提

如果您打算將 IAM Identity Center 與 AD Connector 搭配使用,您需要確保符合下列條件:

  • 您的 AD Connector 是在 AWS 組織的管理帳戶中設定的。

  • 您的 IAM Identity Center 執行個體與 AD Connector 是在相同區域中設定。

如需詳細資訊,請參閱 AWS IAM Identity Center 使用指南中的 IAM 身分中心先決條件

多重要素驗證先決條件

若要使用 AD Connector 目錄支援多重驗證,您需要準備下列項目:

  • 您現有網路中具有兩個用戶端端點的遠端驗證撥號使用者服務 (RADIUS) 伺服器。RADIUS 用戶端端點的要求如下:

    • 若要建立端點,您需要 AWS Directory Service 伺服器的 IP 地址。這些 IP 地址可從您目錄詳細資訊的 Directory IP Address (目錄 IP 地址) 欄位取得。

    • 這兩個 RADIUS 端點必須使用同一個共享秘密代碼。

  • 您現有的網路必須允許來自伺服器的預設 RADIUS AWS Directory Service 伺服器連接埠 (1812) 輸入流量。

  • RADIUS 伺服器與現有目錄之間的使用者名稱必須相同。

如需搭配 MFA 使用 AD Connector 的詳細資訊,請參閱 為 AD Connector 啟用多重因素認證

委派權限給您的服務帳戶

若要連線到現有目錄,您必須具備在現有目錄中,已委派特定權限之 AD Connector 服務帳戶的登入資料。雖然 Domain Admins (網域管理員) 群組的成員具有連線到目錄的足夠權限,但最佳實務應該使用只具有連線到目錄所需之最低權限的服務帳戶。下列程序示範如何建立名為的新群組Connectors、委派連線 AWS Directory Service 至此群組所需的必要權限,然後將新的服務帳戶新增至此群組。

此程序必須在已加入您目錄且已安裝 Active Directory User and Computers (Active Directory 使用者和電腦) MMC 嵌入的電腦上執行。您也必須以網域管理員的身分登入。

委派權限給您的服務帳戶
  1. 開啟 Active Directory User and Computers (Active Directory 使用者和電腦),並在導覽樹狀目錄中選取您的根網域。

  2. 在左側窗格的清單中,對 Users (使用者) 按一下滑鼠右鍵,選取 New (新增),再選取 Group (群組)。

  3. New Object - Group (新增物件 - 群組) 對話方塊中,輸入下列內容並按一下 OK (確定)。

    欄位 值/選項
    Group name (群組名稱) Connectors
    Group scope (群組範圍) 全域
    Group type (群組類型) 安全性
  4. Active Directory User and Computers (Active Directory 使用者和電腦) 導覽樹狀目錄中,選取您的根網域。在選單中,選取 Action (動作),再選取 Delegate Control (委派控制)。如果您的 AD 連接器連線到 AWS 受管理的 Microsoft AD,您將無法存取網域根層級的委派控制項。在這種情況下,要委派控制,請選取將在其中建立電腦物件的目錄 OU 下的 OU。

  5. Delegation of Control Wizard (委派控制精靈) 頁面上,按一下 Next (下一步),然後按一下 Add (新增)。

  6. Select Users, Computers, or Groups (選取使用者、電腦或群組) 對話方塊中,輸入 Connectors,並按一下 OK (確定)。如果找到多個物件,請選取在上述步驟中建立的 Connectors 群組。按一下 Next (下一步)

  7. Tasks to Delegate (要委派的任務) 頁面上,選取 Create a custom task to delegate (建立要委派的自訂任務),然後選擇 Next (下一步)。

  8. 選取 Only the following objects in the folder (僅限資料夾中的下列物件),再選取 Computer objects (電腦物件) 和 User objects (使用者物件)。

  9. 選取 Create selected objects in this folder (在此資料夾中建立選取的物件) 和 Delete selected objects in this folder (在此資料夾中刪除選取的物件)。然後選擇下一步

    委派控制精靈-只會選取資料夾中的下列物件、使用者物件、在此資料夾中建立選取的物件,以及刪除此資料夾中的選取物件選項。
  10. 選取 Read (讀取),然後選擇 Next (下一步)

    注意

    如果您將使用無縫網域加入 WorkSpaces,或者,您也必須啟用入權限,以便 Active Directory 可以建立電腦物件。

    委派控制精靈-在 [顯示這些權限] 下,會選取 [一般]、[屬性特定] 和 [讀取]。
  11. 驗證 Completing the Delegation of Control Wizard (完成委派控制精靈) 頁面中的資訊,然後按一下 Finish (完成)。

  12. 建立使用高強度密碼的使用者帳戶,並將此使用者新增至 Connectors 群組。此使用者將稱為您的 AD Connector 服務帳戶,因為它現在是Connectors群組的成員,因此現在擁有足夠的權限可連線 AWS Directory Service 至目錄。

測試您的 AD Connector

若要讓 AD Connector 連線至您的現有目錄,現有網路的防火牆必須向 VPC 中兩個子網路的 CIDR 開放特定連接埠。若要測試是否符合這些條件,請執行下列步驟:

測試連線
  1. 在 VPC 中啟動 Windows 執行個體,並透過 RDP 與其連線。該執行個體必須為您現有網域的成員。其餘步驟皆在此 VPC 執行個體上執行。

  2. 下載並解壓縮DirectoryServicePortTest測試應用程式。其中已包含來源碼與 Visual Studio 專案檔案,您可視需要修改測試應用程式。

    注意

    Windows Server 2003 或較舊的作業系統不支援此指令碼。

  3. 在 Windows 命令提示下,運用下列選項執行 DirectoryServicePortTest 測試應用程式:

    注意

    只有當網域和樹系功能層級設定為 Windows 伺服器 2012 R2 及以下版本時,才能使用 DirectoryServicePortTest 測試應用程式。

    DirectoryServicePortTest.exe -d <domain_name> -ip <server_IP_address> -tcp "53,88,389" -udp "53,88,389"
    <domain_name>

    完全合格的網域名稱。這用於測試森林和網域功能層級。如果您排除網域名稱,就不會測試功能層級。

    <server_IP_address>

    現有網域中網域控制器的 IP 地址。將針對此 IP 地址測試連接埠。如果您排除 IP 地址,就不會測試連接埠。

    此測試應用程式會判斷 VPC 連線至您網域的必要連接埠是否開放,以及驗證最低的森林和網域功能層級。

    輸出會類似下列內容:

    Testing forest functional level. Forest Functional Level = Windows2008R2Forest : PASSED Testing domain functional level. Domain Functional Level = Windows2008R2Domain : PASSED Testing required TCP ports to <server_IP_address>: Checking TCP port 53: PASSED Checking TCP port 88: PASSED Checking TCP port 389: PASSED Testing required UDP ports to <server_IP_address>: Checking UDP port 53: PASSED Checking UDP port 88: PASSED Checking UDP port 389: PASSED

下列是 DirectoryServicePortTest 應用程式的來源碼。

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.DirectoryServices.ActiveDirectory; using System.Threading; using System.DirectoryServices.AccountManagement; using System.DirectoryServices; using System.Security.Authentication; using System.Security.AccessControl; using System.Security.Principal; namespace DirectoryServicePortTest { class Program { private static List<int> _tcpPorts; private static List<int> _udpPorts; private static string _domain = ""; private static IPAddress _ipAddr = null; static void Main(string[] args) { if (ParseArgs(args)) { try { if (_domain.Length > 0) { try { TestForestFunctionalLevel(); TestDomainFunctionalLevel(); } catch (ActiveDirectoryObjectNotFoundException) { Console.WriteLine("The domain {0} could not be found.\n", _domain); } } if (null != _ipAddr) { if (_tcpPorts.Count > 0) { TestTcpPorts(_tcpPorts); } if (_udpPorts.Count > 0) { TestUdpPorts(_udpPorts); } } } catch (AuthenticationException ex) { Console.WriteLine(ex.Message); } } else { PrintUsage(); } Console.Write("Press <enter> to continue."); Console.ReadLine(); } static void PrintUsage() { string currentApp = Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location); Console.WriteLine("Usage: {0} \n-d <domain> \n-ip \"<server IP address>\" \n[-tcp \"<tcp_port1>,<tcp_port2>,etc\"] \n[-udp \"<udp_port1>,<udp_port2>,etc\"]", currentApp); } static bool ParseArgs(string[] args) { bool fReturn = false; string ipAddress = ""; try { _tcpPorts = new List<int>(); _udpPorts = new List<int>(); for (int i = 0; i < args.Length; i++) { string arg = args[i]; if ("-tcp" == arg | "/tcp" == arg) { i++; string portList = args[i]; _tcpPorts = ParsePortList(portList); } if ("-udp" == arg | "/udp" == arg) { i++; string portList = args[i]; _udpPorts = ParsePortList(portList); } if ("-d" == arg | "/d" == arg) { i++; _domain = args[i]; } if ("-ip" == arg | "/ip" == arg) { i++; ipAddress = args[i]; } } } catch (ArgumentOutOfRangeException) { return false; } if (_domain.Length > 0 || ipAddress.Length > 0) { fReturn = true; } if (ipAddress.Length > 0) { _ipAddr = IPAddress.Parse(ipAddress); } return fReturn; } static List<int> ParsePortList(string portList) { List<int> ports = new List<int>(); char[] separators = {',', ';', ':'}; string[] portStrings = portList.Split(separators); foreach (string portString in portStrings) { try { ports.Add(Convert.ToInt32(portString)); } catch (FormatException) { } } return ports; } static void TestForestFunctionalLevel() { Console.WriteLine("Testing forest functional level."); DirectoryContext dirContext = new DirectoryContext(DirectoryContextType.Forest, _domain, null, null); Forest forestContext = Forest.GetForest(dirContext); Console.Write("Forest Functional Level = {0} : ", forestContext.ForestMode); if (forestContext.ForestMode >= ForestMode.Windows2003Forest) { Console.WriteLine("PASSED"); } else { Console.WriteLine("FAILED"); } Console.WriteLine(); } static void TestDomainFunctionalLevel() { Console.WriteLine("Testing domain functional level."); DirectoryContext dirContext = new DirectoryContext(DirectoryContextType.Domain, _domain, null, null); Domain domainObject = Domain.GetDomain(dirContext); Console.Write("Domain Functional Level = {0} : ", domainObject.DomainMode); if (domainObject.DomainMode >= DomainMode.Windows2003Domain) { Console.WriteLine("PASSED"); } else { Console.WriteLine("FAILED"); } Console.WriteLine(); } static List<int> TestTcpPorts(List<int> portList) { Console.WriteLine("Testing TCP ports to {0}:", _ipAddr.ToString()); List<int> failedPorts = new List<int>(); foreach (int port in portList) { Console.Write("Checking TCP port {0}: ", port); TcpClient tcpClient = new TcpClient(); try { tcpClient.Connect(_ipAddr, port); tcpClient.Close(); Console.WriteLine("PASSED"); } catch (SocketException) { failedPorts.Add(port); Console.WriteLine("FAILED"); } } Console.WriteLine(); return failedPorts; } static List<int> TestUdpPorts(List<int> portList) { Console.WriteLine("Testing UDP ports to {0}:", _ipAddr.ToString()); List<int> failedPorts = new List<int>(); foreach (int port in portList) { Console.Write("Checking UDP port {0}: ", port); UdpClient udpClient = new UdpClient(); try { udpClient.Connect(_ipAddr, port); udpClient.Close(); Console.WriteLine("PASSED"); } catch (SocketException) { failedPorts.Add(port); Console.WriteLine("FAILED"); } } Console.WriteLine(); return failedPorts; } } }

建立 AD Connector

若要使用 AD Connector 連線到您的現有目錄,請執行下列步驟。開始此程序之前,請確定您已完成 AD Connector 事前準備 中所示的必要條件。

注意

您無法使用 Cloud Formation 範本建立 AD Connector。

使用 AD Connector 連線
  1. AWS Directory Service 主控台中,選擇目錄,然後選擇設定目錄

  2. 選取目錄類型 頁面上,選擇 AD Connector,然後選擇下一步

  3. Enter AD Connector information (輸入 AD Connector 資訊) 頁面上,提供下列資訊:

    Directory size (目錄大小)

    選擇 Small (小型)Large (大型) 尺寸選項。如需尺寸的詳細資訊,請參閱 AD Connector

    目錄描述

    選擇填寫其他目錄說明。

  4. Choose VPC and subnets (選擇 VPC 和子網路) 頁面上,提供下列資訊,然後選擇 Next (下一步)

    VPC

    目錄的 VPC。

    子網

    選擇網域控制站的子網路。這兩個子網路必須位於不同的可用區域。

  5. Connect to AD (連結到 AD) 頁面上,提供下列資訊:

    目錄 DNS 名稱

    現有目錄的完整名稱,例如 corp.example.com

    目錄 NetBIOS 名稱

    您現有目錄的簡稱,例如 CORP

    DNS IP 地址

    您現有目錄中至少一個 DNS 伺服器的 IP 地址。這些伺服器皆必須可從步驟 4 指定的各子網路存取。只要指定的子網路和 DNS 伺服器 IP 位址之間有網路連線 AWS,這些伺服器就可以位於的外部。

    服務帳戶使用名稱

    現有目錄中使用者的使用者名稱。如需此帳戶的詳細資訊,請參閱「AD Connector 事前準備」。

    服務帳戶密碼

    現有使用者帳戶的密碼。密碼區分大小寫,長度須介於 8 至 128 個字元 (含) 之間。至少須有一位字元屬於以下四種類型中的三類:

    • 小寫字母 (a-z)

    • 大寫字母 (A-Z)

    • 數字 (0-9)

    • 非英數字元 (~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/)

    Confirm password (確認密碼)

    重新輸入現有使用者帳戶的密碼。

  6. Review & create (檢閱和建立) 頁面上檢閱目錄資訊,並進行必要的變更。若資訊無誤,請選擇 Create directory (建立目錄)。建立目錄需要幾分鐘的時間。建立後,Status (狀態) 值會變更為 Active (作用中)。

什麼獲取與您的 AD Connector 創建

建立 AD Connector 時, AWS Directory Service 會自動建立 elastic network interface (ENI),並將其與每個 AD Connector 執行個體建立關聯。這些 ENI 中的每一個對於 VPC 和 AWS Directory Service AD 連接器之間的連接都是必不可少的,因此不應刪除。您可以 AWS Directory Service 通過以下描述來識別所有保留用於的網絡接口:「為目錄目錄 ID AWS 創建的網絡接口」。如需詳細資訊,請參閱《適用於 Windows 執行個體的 Amazon EC2 使用者指南》中的彈性網路介面一節。

注意

依預設,AD Connector 執行個體會跨區域中的兩個可用區域部署,並連線至您的 Amazon Virtual Private Cloud (VPC)。出現故障的 AD Connector 執行個體將在同一可用區域中使用相同的 IP 地址自動替換。

當您登入任何與 AD Connector 器 (AWS IAM Identity Center 內含) 整合的應用程 AWS 式或服務時,應用程式或服務會將您的驗證要求轉送至 AD Connector 器,然後將要求轉送至您自我管理 Active Directory 中的網域控制站以進行驗證。如果您已成功驗證自我管理的 Active Directory,AD Connector 著會將驗證權杖傳回給應用程式或服務 (類似於 Kerberos 權杖)。此時,您現在可以訪問該 AWS 應用程序或服務。