共用方式為


Active Directory

瞭解 AD LDS 中的代理身份驗證

Ken St. Cyr

 

概覽:

  • 定義代理身份驗證
  • 為什麼代理身份驗證很重要
  • 深入瞭解代理物件
  • 實際執行身份驗證期間發生的情況

目錄

什麼是代理身份驗證?
代理身份驗證的優點
深入瞭解代理物件
實際執行身份驗證的方式
建立代理身份驗證實驗室
結論

與任何啟用 LDAP 的目錄服務一樣,Microsoft Active Directory 輕型目錄服務(AD LDS,前稱 ADAM)也要求使用者進行綁定後,才能對目錄執行任何 LDAP 操作。 這類綁定可通過幾種不同的方法來完成,包括簡單的 LDAP 綁定、簡單的身份驗證及安全層 (SASL) 綁定,甚至是綁定重定向。 也可以進行匿名綁定,在這種情況下,使用者需要提供空密碼。 在本文中,我將特別針對一種方法進行討論和分析 — 綁定重定向,亦稱作代理身份驗證。

什麼是代理身份驗證?

代理身份驗證允許使用者對 AD LDS 實例執行簡單的綁定,同時仍與 Active Directory 帳戶保持關聯。 事務中涉及到兩個帳戶:第一個是 AD LDS 中的特殊物件,稱為 userProxy 物件。 第二個是使用者在 Active Directory 中的帳戶。

AD LDS userProxy 物件是 Active Directory 帳戶的表示形式。 代理物件通過 Active Directory 帳戶的安全性識別字 (SID) 與帳戶相關聯。 實際代理物件本身上並沒有存儲任何密碼。

當使用者通過代理物件對 LDS 實例執行簡單的綁定時,該綁定會通過將 SID 和密碼傳送給網域控制站而重定向到 Active Directory。 AD LDS 伺服器將執行身份驗證,而且整個過程對最終使用者來說不可見。 此過程如圖 1 所示,其中 Lucy 正使用她的 AD LDS 使用者帳戶連接到稱為“CN=AppDir,DC=contoso,DC=com”的 AD LDS 實例。

fig01.gif

圖 1 使用 AD LDS 帳戶進行連接(按一下圖像可查看大圖)

為了進行身份驗證,Lucy 使用的是簡單綁定,而且就跟在正常的 LDAP 綁定過程中一樣,她提供了可分辨名稱 (DN) 和密碼。 雖然 Lucy 看起來使用的是典型的 LDS 使用者帳戶進行連接,但她實際上使用的是代理物件。 對 Active Directory 的身份驗證是在後臺進行的,而 Lucy 完全不知道她實際上是在使用她的 Active Directory 帳戶進行綁定。

代理身份驗證的優點

代理身份驗證的優點在於:它可授予應用程式開發人員對使用者物件的存取權限,而不授予他們對 Active Directory 帳戶的存取權限。 設想一下,如果構建了啟用新目錄的應用程式且該應用程式需要將一些資料存儲在 Active Directory 中,此時會發生什麼情況。 該應用程式可能會使用一個現有的屬性或創建一個新屬性。

使用一個未使用的現有屬性的危險之處在于該屬性很可能將用於其他用途。 即使現在未使用,將來可能會用到,如果它有一些其他用途,Active Directory 管理員就必須跟蹤它的使用情況。 而且如果應用程式開發人員需要多個屬性呢?

通過代理身份驗證,AD LDS 目錄中會存在 Active Directory 使用者物件的表示形式。 特定于應用程式的目錄允許應用程式開發人員在 AD LDS 環境中任意修改架構。 開發人員可通過所選的任何一種方式對屬性執行添加、更改或重設用途操作,而 Active Directory 管理員不必擔心需要進行多項架構更改,也不用跟蹤屬性的使用情況。 如果有另一應用程式連線,並且想要使用相同的屬性,也不成問題,因為它可以是不同的 AD LDS 實例,而且不會有任何屬性衝突。

代理身份驗證在要求使用 X.500 格式的情況下也相當實用。 Active Directory 不會對 DN 使用典型的 X.500 命名。 例如,使用者物件在 Active Directory 中的 DN 是“CN=Lucy D. Smith,CN=Users,DC=contoso,DC=com”。 而在 AD LDS 中,該使用者的 DN 可能是“CN=Lucy D. Smith,CN=Users,O=Contoso,C=US”,也就是與 X.500 相容的格式。

如果您使用的是協力廠商 LDAP 用戶端或嘗試與要求使用 X.500 格式的協力廠商目錄集成,則此功能非常有用。 因為這樣一來,LDS 可作為協力廠商目錄和 Active Directory 之間的中間目錄。 使用代理身份驗證,協力廠商目錄與 LDS 實例綁定需要使用的服務帳戶便可以保存在 Active Directory 中,而不是 LDS 本身中。

深入瞭解代理物件

到目前為止,我簡單地介紹了 LDS 代理物件如何與 Active Directory 使用者帳戶相關聯。 我現在要更深入地探討並分析後臺的運作情況,先從物件類講起。

在 Windows Server 2008 中,%SYSTEMROOT%\ADAM 目錄包含兩個表示代理物件的 LDF 檔。

  • MS-UserProxy.LDF
  • MS-UserProxyFull.LDF

MS-UserProxy.LDF 包含簡單 userProxy 類的定義,其中有基本屬性並包含 msDS-BindProxy 輔助類。 MS-UserProxyFull.LDF 也包含 msDS-BindProxy 輔助類,但是它還將更多使用者屬性預填充到類的 mayContain 屬性。 因此,屬性類必須事先就存在。 所以當導入 userProxyFull 類時,必須先導入使用者或 inetOrgPerson 類。 使用者和 inetOrgPerson 都包含 userProxyFull 使用的屬性的屬性類定義。 圖 2 顯示了 userProxy 類與 userProxyFull 類之間的差異。

fig02.gif

圖 2 userProxy 與 userProxyFull 類(按一下圖像可查看大圖)

兩個類都包含 msDS-BindProxy 作為輔助類,這一點很重要。 輔助類是一種可為結構類提供其他資料的類。 例如,在 LDS 中,User 類是從 Organizational-Person 類繼承的結構類,也就是說 User 類擁有 Organizational-Person 類所擁有的一切。 但是 User 類還有一個稱為 msDS-BindableObject 的輔助類,也就是說 User 類除了包含 Organizational-Person 類的屬性之外,還包含 msDS-BindableObject 所有的強制屬性和可選屬性。 在本實例中,使用 msDS-Bindable­Object 作為輔助類使 User 類可綁定。

由於 userProxy 類有 msDS-BindProxy 作為輔助類(如圖 3 所示),因此它現在還包含 msDS-BindProxy 的全部強制和可選屬性集。 msDS-BindProxy 輔助類可使物件轉變成代理物件。 因此即使您擁有自訂類,您也可以添加 msDS-BindProxy 輔助類,然後使用自訂物件進行代理身份驗證。

fig03_L.gif

圖 3 創建代理物件(按一下圖像可查看大圖)

如果您仔細看一下 msDS-BindProxy 類,就不難發現其中只定義了一個強制屬性 — objectSID。 在這個屬性中填充 Active Directory 使用者帳戶的 SID,即可在 LDS 中的代理物件與 Active Directory 中的使用者物件之間建立關聯。 此屬性只能在創建物件時進行填充,若要對其進行更改,必須刪除物件,然後再重新創建物件。

實際執行身份驗證的方式

為了真正瞭解後臺的運作情況,我們必須更加深入地探討執行身份驗證的方式。 我將逐步介紹兩個網路跟蹤,它們將説明您瞭解代理身份驗證的運作方式。 第一個跟蹤是代理使用者從 Windows XP 工作站簡單綁定到 Windows Server 2008 LDS 實例的網路捕獲。 在這個捕獲中,Lucy 使用工作站的 LDP.EXE 與她的代理使用者物件進行綁定。

圖 4 顯示了在捕獲中我們需要分析的三個數據包。 資料包 1 是從工作站 (10.0.0.107) 發送到 Active Directory LDS 伺服器 (10.0.0.201) 的綁定請求。 綁定請求包含 Lucy 的 DN“cn=lucy,cn=people,cn=appdir,dc=contoso,dc=com”。 資料包 2 是從 Active Directory LDS 伺服器發送到工作站的回應,指示已綁定成功。 資料包 3 是從工作站發送到 Active Directory LDS 伺服器的確認資訊,指示已確認綁定回應。

fig04.gif

圖 4 綁定請求和回應(按一下圖像可查看大圖)

如果深入研究資料包 1 的詳細內容(如圖 5 所示),您會大吃一驚。 那就是 Lucy 提供的密碼 (P@ssw0rd) 在捕獲中會以明文的形式顯示。 這事實上是使用簡單 LDAP 綁定進行身份驗證的缺點之一。 除非將綁定封裝在 SSL 加密中,否則使用者的密碼將向網路上接聽的任何人公開。

fig05.gif

圖 5 SSL 關閉情況下的簡單綁定(按一下圖像可查看大圖)

預設情況下,Active Directory LDS 會啟用 SSL。 您必須設法手動將其關閉,為了讓網路跟蹤具有可讀性,我在此練習中執行了該項操作。 此外,我沒有費事地將證書分配給 Active Directory LDS 伺服器,但在實際實施中,您必須確保 Active Directory LDS 伺服器擁有可用於 SSL 的有效證書。

第二個跟蹤是從 Active Directory LDS 伺服器到網域控制站 (DC) 的網路捕獲。 這個跟蹤比第一個稍微大一點,因此我將分幾部分進行介紹。 這個跟蹤的前 9 個數據包顯示在圖 6 中。

fig06.gif

圖 6 連接到網域控制站的 AD LDS(按一下圖像可查看大圖)

第一個資料包對您來說應該不陌生,它位於從工作站傳入的綁定請求中。 此資料包同樣以明文的形式提供了 Lucy 的 DN 和密碼。 資料包 2 至 9 顯示了連接到網域控制站 (10.0.0.200) 的 AD LDS 伺服器 (10.0.0.201)。 這包含一些位址解析通訊協定 (ARP) 消息,隨後是到 DC 的遠端程序呼叫 (RPC) 連接。

圖 7 中,資料包 10 和 11 調用一個名為 LsarLookupSids3 的方法,此 RPC 調用將告知 DC 取得一批 SID,然後返回其對應的名稱。 AD LDS 伺服器在資料包 10 中提出要求,並在資料包 11 中收到來自 DC 的回應。

fig07.gif

圖 7 Kerberos 身份驗證嘗試(按一下圖像可查看大圖)

然後,經過簡短的 TCP 握手來啟動 Kerberos 會話(資料包 12-14)之後,在資料包 15 中,AD LDS 伺服器試圖從金鑰發佈中心 (KDC) 獲取身份驗證服務票證 (AS-REQ)。 在資料包 16 中,身份驗證服務票證請求被拒絕,因為 AD LDS 伺服器沒有提供 DC 預期的一些預先身份驗證資料。 在這種情況下,DC 希望使用時間戳記進行身份驗證。 Kerberos 會話結束並請求重置(資料包 17–19)。

圖 8 顯示了捕獲的其餘部分。 資料包 20–22 建立了新的 Kerberos 會話,在資料包 23 中新的身份驗證服務請求從 AD LDS 伺服器發送到 DC。 此新請求包含必要的預先身份驗證資料,資料包 25 中 DC 返回的成功答覆表明了這一點。 AD LDS 伺服器現在已擁有身份驗證服務票證,而且可以向票證授予服務提出請求以對 Lucy 的憑據進行身份驗證。

fig08.gif

圖 8 成功的身份驗證(按一下圖像可查看大圖)

票證授予服務請求和回應在資料包 33 和 34 中捕獲。 在資料包 34 中收到 KRB_TGS_REP 表示 Lucy 已順利通過身份驗證。 最後,在資料包 38 中,AD LDS 伺服器將綁定回應返回到工作站,讓 Lucy 知道她已順利綁定到 AD LDS 實例。 雖然這個過程涉及到幾個步驟,但整個事務所花的總時間大約僅為 1/10 秒。

如果 Lucy 輸入密碼錯誤會發生什麼情況呢?在我們的示例中,身份驗證服務請求會在資料包 25 失敗。 身份驗證服務請求的失敗將告知 AD LDS 伺服器 Lucy 的憑據無效。 AD LDS 伺服器會將綁定回應發回工作站(而不是票證授予服務),指明憑據無效。

以下簡要概述了成功交換過程中發生的情況:

  1. 工作站向 AD LDS 伺服器發送綁定請求。
  2. AD LDS 伺服器與 DC 建立連接。
  3. AD LDS 伺服器請求 DC 將 Lucy 的 SID 轉換成它可用來進行身份驗證的識別字。
  4. DC 將 Lucy 的 ID 提供給 AD LDS 伺服器。
  5. AD LDS 伺服器使用 Lucy 的 ID 從 DC 取得授予票證的票證 (TGT)。
  6. AD LDS 伺服器使用 Lucy 的 TGT 為自己取得會話票證。
  7. AD LDS 伺服器將成功的綁定回應返回工作站。

這個過程顯示了從工作站到 AD LDS 伺服器的連接是標準的 LDAP 綁定事務。 而從 AD LDS 伺服器到 DC,則使用 Kerberos 安全地對使用者進行身份驗證。

建立代理身份驗證實驗室

現在您已經瞭解了代理身份驗證的工作方式,讓我們來看看如何在實驗室環境中進行代理身份驗證。 請注意,在此練習中,我將禁用代理身份驗證中的 SSL 要求。 但是,正如我之前提到的,您不應該在實際實施過程中禁用該要求。

在開始之前,您需要有一個功能完備的域,其中包含一個 Windows Server 2008 成員伺服器和一個工作站。 Windows Server 2008 成員伺服器將運行 AD LDS,而工作站將作為用戶端端點。 分開這些電腦的優點在於您可以網路捕獲它們之間的交互。 為了建立實驗室,我將指導您逐步完成下列步驟:

  • 在成員伺服器上安裝 AD LDS。
  • 禁用代理身份驗證的 SSL 要求。
  • 將 userProxy 類導入 AD LDS 架構。
  • 創建代理物件並為其分配許可權。
  • 通過代理物件綁定到 AD LDS 目錄。

第一步是在 Windwos Server 2008 成員伺服器上安裝 AD LDS。 在“伺服器管理器”中,您將在“添加角色”嚮導中找到安裝 LDS 的選項。 角色安裝好之後,“管理工具”功能表中將出現一個新的選項,稱為“Active Directory 輕型目錄服務安裝嚮導”。 使用此嚮導創建新的 LDS 實例。

當嚮導提示輸入應用程式分區的名稱時,輸入任何您想要的 DN。 請記住,LDS 支援以 X.500 格式命名,因此您並不僅限於使用“DC=”風格的名稱。 在我的示例中,我使用的是“cn=appdir,dc=contoso,dc=com”,但也可以使用“cn=appdir,o=contoso,c=us”。

AD LDS 實例安裝好之後,下一步是禁用代理身份驗證的 SSL 要求。 在 ADSI 編輯管理單元 (adsiedit.msc) 中,您應該使用在安裝期間指定的管理員帳戶連接到 AD LDS 實例的配置分區。 如果您不知道配置分區的 DN,可在 ADSI 編輯的連接設置對話方塊內,從“選擇一個已知命名內容”下拉清單中選擇“配置”。

流覽到容器“CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,CN={guid}”並打開“CN=Directory Service”容器的屬性對話方塊。 屬性清單中包含一個名為 msDS-Other-Settings 的多值字串屬性,該屬性列出了多個字串,每個字串都表示一種不同的 AD LDS 實例設置。 編輯該屬性並將“RequireSecureProxyBind”字串的值更改為 0。

下一步是導入 userProxy 類的架構類定義。 您可能在 AD LDS 嚮導提示您執行該操作時已經將其導入,若是如此,可跳過此步驟。 如果您尚未將其導入,請使用下列 LDIFDE.EXE 命令執行該操作。 請確保您在命令中指定了 AD LDS 伺服器的名稱和正確的埠。

C:\> ldifde –i -f c:\windows\adam\ms-userproxy.ldf –s
   server:port –k –j . –c 
   "cn=schema,cn=configuration,dc=X"
   #schemaNamingContext

現在已導入物件類,可創建代理物件。 我將使用 LDP.EXE,但您可以使用其他工具或某種程式設計方法。 使用 LDP 連接到 AD LDS 實例,並使用管理員憑據綁定。 流覽到您 AD LDS 實例的 DN,然後選擇您要在其中創建代理物件的容器。 按右鍵該容器,並從下拉清單中選擇“添加子項”。 在“添加”對話方塊中,您需要在“DN”欄位中輸入新代理物件的 DN。 例如,您可以使用“cn=lucy,cn=appdir,o=contoso,c=us”。

您還需要為此物件來創建兩個屬性。 第一個屬性是 objectClass,用以表示創建的物件類型。 此示例的值應該是 userProxy。 將此資訊添加到對話方塊的“編輯條目”部分中,然後按一下“輸入”按鈕。

第二個要添加的屬性是 objectSID,其中包含與此代理物件相關聯的 Active Directory 使用者帳戶的 SID。 您可以通過各種方法獲取此 SID,但我是直接在單獨的 LDP 實例中連接到 Active Directory,並從該處的使用者帳戶中複製 objectSID 屬性。 輸入此資訊之後,“添加”對話方塊應與圖 9 中所示的對話方塊類似。 最後,按一下“運行”按鈕,提交更改。

fig09.gif

圖 9 創建代理物件

為了使用您剛剛創建的代理物件,您將需要為它授予一些許可權。 您可以通過在 LDP 中的“CN=Roles”容器下選擇“CN=Readers”物件,輕鬆完成這項任務。 按右鍵並從下拉清單中選擇“修改”。 添加名為 member 的屬性,並輸入您創建的 userProxy 物件的 DN 作為值。 切記按一下“運行”之前先按一下“輸入”按鈕。 現在,userProxy 物件應該是 LDS 實例中 Readers 組的成員。

一切應該已經就緒,所以您現在就可以測試代理身份驗證。 打開一個新的 LDP 實例,並連接到 AD LDS 伺服器。 不過,這次在綁定到實例時,請選擇“簡單綁定”,並在使用者名稱欄位中鍵入代理物件的 DN。 至於密碼,請輸入您將此代理物件關聯到的 Active Directory 帳戶的密碼。 按一下“確定”,現在您應該已在唯讀模式下綁定到實例。

花一些時間進行網路跟蹤,並嘗試使用不同的綁定方法。 您可以練習重新打開 SSL,然後捕獲 LDAP 綁定過程。 您甚至可以故意鍵入錯誤的使用者名稱或密碼,然後查看身份驗證過程會發生什麼情況。

結論

在使用代理身份驗證時,不要遇到困難就驚慌失措。 我採用的方法是通過 LDP 和 ADSI 編輯演示此過程,因為這樣可以更好地瞭解後臺操作。 正因為如此,我在本文中逐步介紹的示例從實際操作角度說明如何進行代理身份驗證。

實際上,創建和操作 userProxy 物件的漫長過程通常通過身份管理系統或自訂開發的用於創建帳戶的前端進行處理。 我鼓勵您構建自己的 LDS 實驗室,親自瞭解一下如何使用代理身份驗證集成協力廠商目錄和應用程式。

Ken St. Cyr 是 Microsoft 的一位顧問,自 Active Directory 問世以來,他已在其基礎上設計和實施了多種目錄解決方案。 最近,他成為首批獲得目錄服務的 Microsoft Certified Master 認證的人員之一。 可通過電子郵件 ken.stcyr@microsoft.com與他聯繫。