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

我們檢查 的第一個八位元組以避免衝突ETH1CIDR。如果其以 10 開頭,則我們選擇 192.168.0.0/16 VPC 搭配 192.168.1.0/24 和 192.168.2.0/24 子網路。如果第一個八位元組是 10 以外的任何其他八位元組,我們會選擇 10.0.0.0/16 VPC 搭配 10.0.1.0/24 和 10.0.2.0/24 子網路。

選擇演算法不包含 上的路由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 網域控制器,現有網路的防火牆必須CIDRs針對 Amazon 中的兩個子網路,對 開啟下列連接埠VPC。

  • TCP/UDP 53 - DNS

  • TCP/UDP 88 - Kerberos 身分驗證

  • TCP/UDP 389 - LDAP

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

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

注意

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

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

Kerberos 預先驗證

您的使用者帳戶必須啟用 Kerberos 預先驗證。如需詳細的說明了解如何啟用此設定,請參閱 確定已啟用 Kerberos 預先驗證。如需此設定的一般資訊,請前往 http://technet.microsoft.com/en-us/library/cc961961.aspx 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 組織的管理帳戶中設定。

  • Identity IAM Center 的執行個體位於 AD Connector 設定的相同區域中。

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

多重要素驗證先決條件

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

  • 現有網路中的遠端驗證撥入使用者服務 (RADIUS) 伺服器,具有兩個用戶端端點。RADIUS 用戶端端點有下列需求:

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

    • 兩個RADIUS端點都必須使用相同的共用密碼。

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

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

如需搭配 使用 AD Connector 的詳細資訊MFA,請參閱 啟用 AD Connector 的多重要素身分驗證

委派權限給您的服務帳戶

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

此程序必須在加入目錄且已安裝 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 使用者和電腦導覽樹狀目錄中,選取識別要建立電腦帳戶的組織單位 (OU)。在選單中,選取 Action (動作),再選取 Delegate Control (委派控制)。您可以將父 OU 選取為網域,以將許可傳播給子 OUs。如果您的 AD Connector 連線至 AWS Managed 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 連線到現有的目錄,現有網路的防火牆必須針對 中的CIDRs兩個子網路,對 開啟特定連接埠VPC。若要測試是否符合這些條件,請執行下列步驟:

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

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

    注意

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

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

    注意

    只有在網域和樹系功能層級設定為 Windows Server 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. 選擇VPC和子網路頁面上,提供以下資訊,然後選擇下一步。

    VPC

    目錄VPC的 。

    子網

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

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

    目錄DNS名稱

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

    Directory NetBIOS 名稱

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

    DNS IP 地址

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

    服務帳戶使用名稱

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

    服務帳戶密碼

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

    • 小寫字母 (a-z)

    • 大寫字母 (A-Z)

    • 數字 (0-9)

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

    Confirm password (確認密碼)

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

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

如需使用 AD Connector 建立內容的詳細資訊,請參閱 使用 AD Connector 建立的內容