Active Directory災難恢復詳解一
Active Directory的重要性對于系統(tǒng)管理員來說是不言而喻的,下面就介紹了有關Active Directory進行災難恢復的相關內容。
Active Directory 是 Windows 網絡中最為關鍵的服務之一。為了避免出現(xiàn)停機時間和損失生產力,對與 Active Directory 有關的問題制訂有效的災難恢復計劃是至關重要的。這一點聽起來容易,但令人吃驚的是,有很多管理員甚至沒有為最常見的一個 Active Directory 故障方案 - 意外刪除數據 - 制定計劃。
意外刪除對象是服務失敗最常見的根本原因之一。當我參加研討會和會議時,我常常詢問有誰曾經因為意外刪除數據而導致 Active Directory 失敗。而每次幾乎所有人都舉手。
要理解為何數據恢復是如此復雜,必須先理解以下內容:Active Directory 如何恢復和復制對象、如何刪除對象以及權威還原和非權威還原的結構。
存儲對象
Active Directory 是一個實施 X.500/LDAP 數據模型的專門的對象數據庫。數據存儲(稱為目錄信息樹或 DIT)基于可擴展存儲引擎 (ESE),這是一個索引順序訪問方法 (ISAM) 數據庫引擎。從概念上說,Active Directory 將 DIT 存儲在兩張表中:數據表(包含實際的 Active Directory 對象和屬性)和鏈接表(包含對象之間的關系)。
每個 Active Directory 對象存儲在數據表中單獨的一行,每個屬性一列。數據表包含存儲在域控制器 (DC) 上的所有副本的所有條目。在一個常規(guī) DC 上,數據表包含來自域 NC(命名上下文)、配置 NC 和架構 NC 的條目。在全局編錄上,數據表包含林中每個對象的條目。
Active Directory 使用可分辨名稱標記 (DNT)(一個 32 位的整數)來唯一標識數據表中的每一行。用于內部引用對象的 DNT 比其他標識符如可分辨名稱 (DN) 和 objectGUID(一個 16 字節(jié)的二進制結構)都小得多。但是與 objectGUID 不同的是,DNT 是一個本地標識符,并且在每個 DC 上都不同。
Active Directory 如何鏈接對象
Active Directory 管理 DIT 中對象間的兩類關系:父子關系(也稱為容器關系)和引用關系(也稱為鏈接關系)。為了實施父子關系,Active Directory 在數據表中存儲了一個稱為父可分辨名稱標記(或 PDNT)的附加列。該列始終包含對象的父對象的 DNT。
Active Directory 中的每個屬性均由 Active Directory 架構容器中的 attributeSchema 對象定義。Active Directory 中的某些屬性定義為鏈接屬性,由 attributeSchema 對象的 linkID 屬性中的一個非零偶數值確定。鏈接屬性建立了目錄中對象間的關系,可以是單值或多值。組對象的成員屬性是多值鏈接屬性的一個例子 — 它建立了組對象及其成員對象之間的鏈接。
即使看起來組的成員屬性包含成員的 DN(例如,通過 Active Directory 用戶和計算機管理單元顯示),但這不是 Active Directory 存儲它們的方式。當您將成員對象的 DN 添加到組的成員屬性時,Active Directory 存儲對象的 DNT 而并非其 DN。由于即使將對象重命名 DNT 也不會改變,因此可以重命名用戶對象,而且 Active Directory 不用對系統(tǒng)中所有的組排序以更新每個成員屬性的 DN。這就是 Active Directory 如何在 DIT 內維護引用完整性的原理。圖 1 所示為一個經過大大簡化的數據表和鏈接表如何彼此關聯(lián)的示意圖。這些表所示的三個用戶對象(Molly Clark、Alexander Tumanov 和 Makoto Yamagishi)都是 Senior Engineers 組的成員。
這些鏈接稱為前向鏈接。類似地,Active Directory 還提供了后向鏈接屬性。這為從鏈接指向的對象返回到引用鏈接的對象提供了引用,意味著該對象具有前向鏈接。用戶和組的 memberOf 屬性是后向鏈接屬性的一個例子。屬性 Schema 對象描述了一個后向鏈接屬性,該屬性具有 linkID 值,其值比相應的前向鏈接屬性以偶數編號的 linkID 值大 1。 例如,Windows Server® 2003 R2 架構中成員屬性的 linkID 值為 2,作為后向鏈接的 memberOf 屬性的 linkID 值為 3。有關詳細信息,圖 2 提供了一個默認情況下 Windows Server 2003 R2 架構中定義的鏈接屬性列表。
后向鏈接屬性總是多值的,由 Active Directory 自動維護。實際上,您不能直接修改后向鏈接屬性。盡管看起來可以通過 Active Directory 用戶和計算機 MMC 管理單元修改用戶或組的 memberOf 屬性,但該管理單元實際上修改的是相應組的成員屬性,而 Active Directory 將在后臺更新 memberOf 屬性。這就是為什么無需有關用戶對象的權限即可添加用戶到組的原因;因為您實際上修改的是組對象的成員屬性。因為每個 DC 都在本地管理其后向鏈接屬性,所以永遠不會復制對后向鏈接的更改。只復制對前向鏈接屬性的更改(如組的成員屬性)。
在一個常規(guī) DC 上,數據表包含域對象的條目以及來自配置和架構容器的對象條目。但一些組類型可能包含對位于其他域中對象的引用。Active Directory 如何存儲不在其數據表中的對象的 DNT?答案在于基礎結構主機 FSMO(靈活單主機操作)角色所有者和稱為幻影對象的對象。
幻影對象
當將一個成員從一個域添加到其他域中的組時,Active Directory 在數據表中自動創(chuàng)建一個稱為幻影的特殊對象,它包含新成員的 objectGUID、objectSid 和 DN。這提供了可存儲在組的成員屬性中的 DNT。如果域控制器是全局編錄,則將無需創(chuàng)建幻影,因為在其數據表中林中每個對象都已有一個條目。
擁有基礎結構 FSMO 角色的 DC 定期根據全局編錄檢查其數據表中的條目,當它發(fā)現(xiàn)有對象被移動、重命名或刪除時,它將更新數據表中的幻影并將更改復制到域中的其他 DC。根據引用計數,基礎結構主機還會刪除域中任何前向鏈接屬性都不再引用的幻影。
幻影允許 DC 管理指向林內其他域中對象的引用,但前向鏈接屬性還可以引用林外的對象 — 例如受信任的域。在這種情況下,Active Directory 在域 NC 中的 CN=ForeignSecurityPrincipals 容器內創(chuàng)建一個稱為外部安全主體 (FSP) 的對象。FSP 包含外部對象的安全標識符 (SID) 和標識外部域中對象的其他屬性,但沒有流程確保 FSP 保持最新。出于數據恢復的目的,我們將象對待其他任何 Active Directory 對象一樣對待 FSP。
刪除對象
在這里,我將焦點主要放在還原用戶及其組成員身份上。但是,同樣的原則也適用于恢復其他鏈接屬性。
當 Active Directory 刪除一個對象時,它并沒有從 DIT 物理刪除該對象。相反地,它將該對象的 isDeleted 屬性設置為 true 從而將其標記為已刪除,這樣使得該對象對常規(guī)目錄操作不可見。按照架構定義,Active Directory 刪除所有未指定要保存的屬性并將對象的相對可分辨名稱 (RDN) 更改為 <old RDN>\0aDEL:<objectGUID>。然后,它將對象移動到 NC 的 CN=Deleted Objects 容器。(配置 NC 中有一些對象類 Active Directory 不移動到“已刪除對象”容器。)Active Directory 刪除任意指向已刪除對象保留的其他對象的前向鏈接 — 這樣在鏈接表中降低了其引用計數。如果有其他對象包含指向現(xiàn)在已刪除對象的前向鏈接,Active Directory 同樣也會刪除這些鏈接。
得到的對象稱為 tombstone。Active Directory 將此 tombstone 復制到其中做了同樣更改的其他 DC。請注意,Active Directory 不會復制對指向已刪除對象的前向鏈接所做的更改。每個 DC 在本地進行同等更改,因此不需要復制更改。我將在本文稍后的部分討論恢復組成員身份的后續(xù)結果。
Active Directory 維護 DIT 中邏輯上刪除的對象由 CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=<root domain> 對象的 tombstoneLifetime 屬性決定。對每個 DC 的垃圾收集流程將刪除比配置的 tombstone 生存期更老的 tombstone。默認情況下,tombstone 生存期對 Windows® 2000、Windows Server 2003 和 Windows Server 2003 R2 是 60 天,對 Windows Server 2003 SP1 是 180 天。
Tombstone 生存期對還原過程有著重大意義。不能還原比 tombstone 生存期更老的備份。因為已刪除并從域中作為垃圾收集的對象不再有 tombstone,所以永遠不會將刪除操作重新復制到還原的 DC。接下來,已刪除的對象將作為延遲對象保留在還原的 DC 中,而還原的 DC 將永遠不能正確地與域中其他 DC 聚合。
復制對象
無論何時域控制器執(zhí)行任何類型的更新操作(例如添加對象或修改屬性)時,DC 都會為更新操作分配一個唯一的 64 位數字,稱為更新序列號 (USN)。Active Directory 使用 USN 標記更新的對象和屬性以幫助確定是否需要復制它們。
Active Directory 逐個屬性地復制對象。也就是說,如果修改一個對象的屬性,Active Directory 將只復制該屬性,而非整個對象。要做到這一點,Active Directory 使用復制元數據跟蹤它對每個屬性所做的更改。一個屬性的復制元數據包括:
本地 USN,標識本地 DC 上的更改操作。
引起更改的 DC 的 invocationID(特別是 DC 相應的 nTDSSettings 對象的 invocationID 屬性),標識域控制器上 DIT 的特定生成。
源操作位于源 DC 上時的 USN。
時間戳,包含進行源更改時的 DC 系統(tǒng)時間。
32 位版本序號,每次值更改時遞增。
當目標 DC 從其源 DC 合作伙伴請求更改時,它將最近成功進行復制更改的 USN 發(fā)送到源 DC,同時附帶包含最大源 USN 的最新向量。這些源 USN 是目標 DC 從每個具有所復制 NC 副本的 DC 上所見的最大源 USN 。源 DC 使用此信息以便只發(fā)送目標 DC 尚未看見的那些更新。
當目標 DC 處理傳入的屬性更新時,它將核對每個屬性的版本號。如果傳入屬性的版本號大于 DC 已有的該屬性版本,則 DC 將存儲該傳入值。如果傳入版本號等于 DC 已有的版本,則 DC 將比較時間戳并使用時間戳最新的屬性。如果時間戳相同,目標 DC 將選擇具有最大 invocationID 的值。這樣可以確保每個 DC 最終為每個復制的屬性確定相同的值。
鏈接值復制
在 Windows 2000 中,Active Directory 復制多值屬性的方式與復制單值屬性相同。這對那些多值成員屬性可能在不同 DC 上經常更改的大型動態(tài)組對象可能帶來問題。如果一位管理員添加用戶到一個 DC 上的組,而另一位管理員在復制延遲窗口內添加其他用戶到另一個 DC 上的組,則 Active Directory 將選擇后一個添加并完全丟失前一個添加。Microsoft 在 Windows Server 2003 中使用一個稱為鏈接值復制 (LVR) 的進程處理此問題。
憑借 Windows Server 2003 林的功能級別或過渡林的功能級別,Active Directory 分別復制多值前向鏈接屬性的單個值,每個值擁有其自己的復制元數據。這有效解決了在 Windows 2000 中發(fā)現(xiàn)的問題,即在不同 DC 上幾乎同步的組成員身份更新可能導致數據丟失。
但是,有一點需要指出。提升林的功能級別不會自動使用新的復制元數據修復現(xiàn)有的多值鏈接屬性。只有那些在提升林的功能級別之后添加的值才有新的元數據。這對恢復組成員身份具有重大影響,您很快就會看到。
備份
Windows 包括非?;镜?NTBACKUP 實用程序,可以使用它來執(zhí)行 DC 的系統(tǒng)狀態(tài)備份。域控制器的系統(tǒng)狀態(tài)包括其注冊表、SYSVOL、Active Directory DIT 文件和關鍵系統(tǒng)文件。大多數第三方備份實用程序也有備份和還原 DC 系統(tǒng)狀態(tài)的功能。
要執(zhí)行對磁盤文件的系統(tǒng)狀態(tài)備份,請使用以下命令:
NTBACKUP backup systemstate /F “<filename>&rdquo
此處,<filename> 是要創(chuàng)建的備份文件的名稱,應使用 .bkf 擴展名。
欲知更多內容,請點擊Active Directory災難恢復詳解二。
【編輯推薦】