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