


理解Windows文件和注冊表權(quán)限
只要系統(tǒng)中有所動作,主體(可以是代表用戶或服務(wù)執(zhí)行操作的進程或線程)都會在對象上執(zhí)行一些操作。比較常見的對象有文件、目錄和注冊表項。 Windows 的基本安全機制包括使用可信的系統(tǒng)組件在執(zhí)行操作之前檢查權(quán)限和權(quán)利 (AccessCheck)。因此,可以通過設(shè)置權(quán)限和權(quán)利管理系統(tǒng)行為。因為在尚未理解權(quán)限和權(quán)利工作原理的情況下可能無法正確設(shè)置權(quán)限,所以我將首先介紹對象的安全設(shè)置及其處理方式,然后介紹如何為它們設(shè)置值。
在深入探討技術(shù)細(xì)節(jié)之前,讓我們先使用Windows 訪問控制列表 (ACL) GUI 看看 Windows Server 2008 中的系統(tǒng)驅(qū)動器根目錄權(quán)限。如果打開 Windows 資源管理器,選擇“安全”選項卡、右鍵單擊“本地磁盤 (C:)”,并選擇“屬性”,我們會看到管理員具備完全控制權(quán)限。如果單擊“組或用戶名”下的 SYSTEM,將會看見 SYSTEM 同樣具有完全控制權(quán)限。當(dāng)單擊“組或用戶名”下的 Users 時,權(quán)限情況則比較復(fù)雜:圖1 中系統(tǒng)上的用戶組具備 Read & Execute、List、Read 等權(quán)限。單擊“高級”按鈕將顯示出與該用戶組相關(guān)聯(lián)的權(quán)限的詳細(xì)視圖(請參閱圖2)。
用戶組的成員可以在系統(tǒng)驅(qū)動器根目錄下創(chuàng)建文件夾并向文件添加數(shù)據(jù)。如果單擊“編輯”按鈕,您將看到另一項對子文件夾的“特殊”授權(quán),如圖3 所示。此操作需要管理員權(quán)限。
您可以看到在 Windows Server 2008 中,普通用戶默認(rèn)可以在系統(tǒng)驅(qū)動器的根目錄創(chuàng)建子文件夾,并向這些文件夾添加內(nèi)容。為 Windows Server 2008 中用戶組的成員提供該功能的原因是某些第三方軟件假定存在這些權(quán)限,而 Microsoft 不想破壞應(yīng)用程序的兼容性。
現(xiàn)在讓我們開始討論這些問題涉及的技術(shù),并了解這些權(quán)限在用戶所能看見的 GUI 界面之下的工作原理。在 Windows 中所有命名的對象都具有安全描述符,它提供有關(guān)其所有者的信息,并列出哪些用戶和主體具有特定權(quán)限。描述符還可以指定必須在系統(tǒng)事件日志中記錄哪些對象訪問權(quán)限。
允許哪些主體(用戶、進程等)操作某個對象或資源的信息在稱為 ACL 的數(shù)據(jù)結(jié)構(gòu)中指定。ACL 枚舉誰(哪個主體)對具體對象具有哪類訪問權(quán)限。自由 ACL (DACL) 是 ACL 的一種,在這種類型中對象的所有者可以更改權(quán)限。無論何時訪問對象,都會將安全描述符與主體的權(quán)限進行比較以檢驗是否允許所請求的訪問。
請注意:Windows 還支持針對對象的系統(tǒng) ACL (SACL),并已在許多版本中使用 SACL 設(shè)置建立了需要記錄到審核日志的事件。在 Windows Server 2008 和 Windows Vista 中,SACL 已擴展至能夠攜帶完整性級別信息。
該完整性標(biāo)簽將用于建立“低級”標(biāo)簽,用它標(biāo)記 LowRights Internet Explorer 中的 Internet Explorer 進程。“系統(tǒng)”和“高級”標(biāo)簽用于保護重要的系統(tǒng)資源。Windows 消息泵可以根據(jù)消息的完整性級別過濾消息。例如,中級進程不會接收低級進程發(fā)送的消息,而高級進程不會接收來自低級或中級進程的消息。
此時,完整性級別保護起到的是緩解的作用,而不是真正用于安全保護的安全屏障。在后續(xù)版本中,隨著它逐漸成為真正的安全屏障,它的作用會大大加強。
與其它現(xiàn)代操作系統(tǒng)一樣,Windows 依靠 DACL 進行常規(guī)訪問控制決策。此處我將重點介紹 DACL。系統(tǒng)要決定是否允許某個主體對某個對象執(zhí)行操作需要檢查以下幾項內(nèi)容:主體的權(quán)限、主體的令牌,以及對象的安全描述符。對象的二進制安全描述符將隨主體的令牌一起傳遞給 AccessCheck 例程。隨后將準(zhǔn)備所請求的訪問掩碼位向量,該向量代表訪問權(quán)限檢查成功所必須具備的訪問權(quán)利。該向量將隨主體的安全描述符一同傳遞給 AccessCheck 例程,然后由該例程根據(jù)所請求的訪問和對象的 DACL 檢查用戶的安全令牌并考量主體權(quán)限(通;诮巧虺蓡T關(guān)系,例如管理員)。
如果主體的權(quán)限滿意所請求的訪問,則授予訪問權(quán)限。否則將按順序檢查 DACL 訪問控制條目 (ACE)。一旦安全系統(tǒng)能夠證明允許所有請求的訪問組件或拒絕其中任何請求,它將相應(yīng)返回成功或失敗。
因此,ACE 的 DACL 列表應(yīng)該按照適當(dāng)?shù)捻樞蚺判。?biāo)準(zhǔn)(規(guī)范)的排序應(yīng)當(dāng)是首先安排顯式拒絕,然后是顯式允許、一般(組)拒絕和組允許。如果不使用規(guī)范排序可能會導(dǎo)致預(yù)想不到的允許或拒絕。
對象安全描述符
雖然安全描述符是二進制數(shù)據(jù)結(jié)構(gòu),但它需要依賴安全描述符字符串格式提供便于用戶閱讀的文本格式。字符串格式的安全描述符是以 null 結(jié)尾的字符串,它包含指明以下四個主要組件的令牌:所有者 (O:)、主要組 (G:)、DACL (D:) 和 SACL (S:),如圖4 所示。
圖4 安全描述符
安全描述符 (SID) 通過結(jié)構(gòu)化提供解析信息,并包含 96 位隨機信息(并有可能包含 32 位序列計數(shù)器)以作為所有者的唯一標(biāo)識符。string_aces(以字符串格式表示的 ACE)是 DACL 中顯式授予或拒絕權(quán)限和 SACL 中設(shè)置策略的結(jié)構(gòu)。每個 string_ace 都包含在圓括號當(dāng)中并采用以下結(jié)構(gòu):
(ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid)
只有那些正常訪問相關(guān)對象所必需的權(quán)限必須存在。通常,安全描述符將省略 owner_sid 和 group_sid。如果在創(chuàng)建時未明確指定,那么安全描述符的所有者字段將設(shè)置為調(diào)用對象創(chuàng)建的主體的 SID。組字段設(shè)置為主體安全令牌的主要組。如果不需要審核對象或設(shè)置完整性標(biāo)簽,則不存在 SACL。
在string_aces 中,只包含那些必要的字段(最小集合為 ace_type、權(quán)利和對象,通常為 account_sid)。一般不包含 object_guid 和 inherit_object_guid。系統(tǒng)將按從前到后的順序解析 ACE,直到授予或拒絕訪問權(quán)限為止。因此,ACE 的順序很重要!熬芙^權(quán)限”應(yīng)該放置在“允許權(quán)限”之前。
不包含 ACE 的 ACL 是空 DACL。因為 ACE 授予特定主體對某個對象的訪問權(quán)限,所以任何主體都無法訪問具有空 DACL 的對象。沒有 DACL 的對象稱為 NULL DACL。具有 NULL DACL 的對象沒有安全性,任何人都可以完全控制這種對象。因此,請不要設(shè)置空 DACL 或 NULL DACL。
現(xiàn)在我們有必要看看安全描述符的實際內(nèi)容。下面是 Windows Server 2008 系統(tǒng)驅(qū)動器根目錄的安全描述符(請注意 cacls 是用于檢查和設(shè)置 ACL 的早期命令行例程,現(xiàn)已由 icacls 代替。遺憾的是,icacls 不支持使用命令行開關(guān)輸出以標(biāo)準(zhǔn)安全描述符定義語言 (SDDL) 表示的結(jié)果,在 cacls 中該開關(guān)為 /S 標(biāo)志):
C:\>cacls c:/ /s c:\"D:PAI(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;0x1200a9;;;BU)(A;CI;LC;;;BU)(A;CIIO;DC;;;BU)(A;OICIIO;GA;;;CO)" |
根據(jù)我們已經(jīng)了解的有關(guān)安全描述符的知識,您可以從開頭的“D:”看出尚未聲明所有者關(guān)系或組成員關(guān)系,而且該描述符是 DACL。該 DACL 是受保護的:已經(jīng)設(shè)置了“P”和 Windows NT 5.0 繼承標(biāo)記。隨后是一組需要進行解釋的 ace_strings。
理解安全描述符 string_aces
回想一下前面講述的 string_aces 格式。圖5 中定義了有效的 ace_types,圖6 中定義了有效的 ace_flags。用于繼承的 ace_flags 是 ACE 繼承的決定因素。
ACE 權(quán)利由字符串表明,該字符串指出 ACE 控制的訪問權(quán)利。它可以是訪問權(quán)利的十六進制字符串表示(例如“0x7800003F”),也可以是連續(xù)的 Rights 字符串(例如“CCLCSWLOCRRC”),稍后我將介紹后面這種格式。十六進制表示及其各個數(shù)位的值如圖7所示。
系統(tǒng)對所有對象使用一種 ACE 權(quán)利位圖表示。對不同的對象來說,并不是所有的位都有意義。只應(yīng)用那些適用于某個對象的權(quán)利。標(biāo)準(zhǔn)權(quán)利是對所有安全對象都通用的權(quán)限。泛型權(quán)利是為各種對象指定相似類型權(quán)利的簡便方法。泛型權(quán)利的規(guī)范映射為一組適當(dāng)?shù)木唧w權(quán)限集合。當(dāng)指定 SACL 時,完整性標(biāo)簽也將使用 ACE 權(quán)利字段進行編碼。圖8 中列出了各種對象的可用權(quán)利。
有許多大致等同的權(quán)利映射在使用時并無區(qū)別。完全控制 (FC) 等同于 Generic_All (GA)。對于文件系統(tǒng),F(xiàn)ile All (FA) 是適用的完全控制聲明。Key All (KA) 是適用于注冊表的完全控制聲明。泛型聲明常用于更適合聲明的地方,但會根據(jù)需要映射為適當(dāng)?shù)奈募到y(tǒng)或注冊表項聲明。SDDL 表達式常常混合這些術(shù)語,因此您需要了解等同的術(shù)語。
標(biāo)準(zhǔn)權(quán)利和特定權(quán)利
許多對象都可以分配權(quán)利。除文件和目錄外,還有注冊表項、進程、桌面等。要查看完整的列表,請參閱圖 A 到圖 J。我們將會討論文件系統(tǒng)和注冊表的權(quán)限,圖9和圖10中提供了這些對象的特定權(quán)利。
完整性標(biāo)簽及其用法
前面提到過,如果存在完整性標(biāo)簽,則它將存儲在對象的 SACL 中。對象隱含具有中級完整性,因此如果某個對象沒有完整性標(biāo)簽,則它將具備中級完整性。同樣地,如果安全令牌沒有完整性標(biāo)簽,則它也將具備中級完整性。低級完整性標(biāo)簽用于標(biāo)記低權(quán)利進程,例如低權(quán)利 Internet Explorer 及相關(guān)的非受信對象!案呒墶焙汀跋到y(tǒng)”級別用于幫助將這些對象從中級和低級進程和對象中隔離出來。完整性標(biāo)簽如圖11所示。
Object_guid 和 inherit_object_guid
Object_guid 和 inherit_object_guid 用于指定 Active Directory 中對象的安全性。不會使用它們來保護文件系統(tǒng)和注冊表安全。ACE 字符串內(nèi) ace_type 字段中的“OA”和“OD”分別對應(yīng)于對象允許和對象拒絕 ACE。在本例中,object_guid 持有正在請求權(quán)限的對象的 guid,而 inherit_object_guid 持有它所繼承權(quán)限的那個對象的 guid。
ACE 結(jié)構(gòu)中的 account_sid 字段代表將授予或拒絕 ACE 中所指定訪問權(quán)利的安全主體。account_sid 字段可能持有某個 SID,它可能是對用戶基本無用的長結(jié)構(gòu)標(biāo)識符,或者是某個通用帳戶的簡寫“SID 字符串”標(biāo)記。只要有利于增加系統(tǒng)的可讀性,就可以使用通用帳戶的 SID 字符串標(biāo)記。通用或公認(rèn)帳戶及其 SID 字符串表如圖 J 所示。
“所有者權(quán)利”的 OW 聲明是 Windows Server 2008 和 Windows Vista 中新增的聲明。在以前版本中,對象的創(chuàng)建者/所有者 (CO) 具有讀控制 (RC) 標(biāo)準(zhǔn)權(quán)限和對該對象的 Write_DAC (WD) 權(quán)限,以便所有者能夠設(shè)置該對象的安全性。如果用戶是某個組的成員并創(chuàng)建了大量對象,這種方法會出現(xiàn)問題。如果該用戶離開該組,他可能仍然會擁有對這些對象的控制,因為他是這些對象的所有者,所以可以獲得這些對象的 RC 和 Write_DAC 權(quán)限。對 OW 所有者的 ACE 限制可以防止向所有者隱性授予 RC/WD 權(quán)限,除非在 ACL 中向任何其它相關(guān) ACE 的所有者 ACE 顯式授予這些權(quán)限。這種方法可以抑制以前版本中的安全隱患。
解釋安全描述符 string_aces
對系統(tǒng)驅(qū)動器根目錄運行 cacls 命令的輸出如下:
"D:PAI(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;0x1200a9;;;BU)(A;CI;LC;;;BU)(A;CIIO;DC;;;BU) (A;OICIIO;GA;;;CO)" |
為提高可讀性對其進行解析后,結(jié)果如下:
"D:PAI (A;OICI;FA;;;SY) (A;OICI;FA;;;BA) (A;OICI;0x1200a9;;;BU)(A;CI;LC;;;BU)(A;CIIO;DC;;;BU) (A;OICIIO;GA;;;CO)" |
這是一個受保護的 DACL,設(shè)置了流行文件系統(tǒng)的自動繼承標(biāo)志。受保護標(biāo)志的含義是不會繼承可繼承的父權(quán)利;該 DACL 受到保護,不能繼承父對象的權(quán)利。在本例中沒有父項,因為它是根目錄。
內(nèi)置管理員和系統(tǒng)將得到文件(來自對象繼承)和目錄(來自容器繼承,即 CI)可繼承的 File All 權(quán)利。這意味著此 DACL 將遞歸授予根目錄下所有文件和目錄的 File All 權(quán)限—必須檢查受保護 DACL 中的授權(quán)是唯一的例外,那會禁止繼承。CO 將獲得根目錄下所有文件和目錄的 Generic_All 權(quán)限(由于僅繼承標(biāo)記),該權(quán)限將映射為 File All。
對內(nèi)置用戶的授權(quán)更為有趣。第一個 string_ace 將應(yīng)用到根目錄及其子目錄中所有的文件和目錄,授予 List、Read、ReadEA、Traverse、Execute、ReadAttr、ReadControl 和 Sync 權(quán)限。第二個 string_ace 授予在根目錄及其子目錄中 AddSubDir 的權(quán)限(由于 IO—僅繼承標(biāo)志),而第三個 string_ace 授予子目錄的 AddFile 權(quán)限。這與您使用 Windows 資源管理器的 ACL 圖形化界面查看這些權(quán)限時看到的一樣。
Windows 資源保護
從 Windows Server 2008 和 Windows Vista 開始,組件將在其清單中聲明所需的安全設(shè)置,該清單將由 Microsoft 代碼簽名根項進行簽名。該清單指定 ACL 及與文件關(guān)聯(lián)的其他權(quán)限。因此,當(dāng)安裝某個組件時,它將自帶適當(dāng)?shù)陌踩O(shè)置。此外,系統(tǒng)管理員還可以使用 Windows 資源保護 (WRP) 防止操作系統(tǒng)文件受到意外損壞。WRP 依賴新的系統(tǒng)級別實體 Trusted Installer 擁有并管理系統(tǒng)文件和文件夾。
在 Windows Vista 中還增加了允許普通用戶安裝授權(quán)組件的便利功能。“超級用戶”角色將不再需要,因此將刪除包含“超級用戶”SID 的 ACE 實例!俺売脩簟苯M仍然存在,但會對組件清單進行掃描并刪除所有 PU 權(quán)限授予實例。
讓我們看看系統(tǒng)目錄中有哪些新權(quán)限。同時這也是閱讀并理解 SDDL 的一個良機:
C:\>cacls c:\windows /s C:\Windows "D:PAI(A;;FA;;;S-1-5-80-956008885-3418522649-18310 38044-1853292631-2271478464)(A;CIIO;GA;;;S-1-5-80-956008885-3 418522649-1831038044-1853292631-2271478464)(A;;0x1301bf;;;SY} (A;OICIIO;GA;;;SY)(A;;0x1301bf;;;BA)(A;OICIIO;GA;;;BA)(A;;0x1200a9;;;BU) (A;OICIIO;GXGR;;;BU)(A;OICIIO;GA;;;CO)" |
“可信的安裝程序”的 SID 是 S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464。使用 TI 作為簡寫,我們可以發(fā)現(xiàn)下面的內(nèi)容:
C:\Windows "D:PAI (A;;FA;;;TI)(A;CIIO;GA;;;TI) (A;;0x1301bf;;;SY)(A;OICIIO;GA;;;SY) (A;;0x1301bf;;;BA)(A;OICIIO;GA;;;BA) (A;;0x1200a9;;;BU)(A;OICIIO;GXGR;;;BU) (A;OICIIO;GA;;;CO)" |
通過解讀,您可以看出這是受保護的 ACE,它使用 Windows NT 5.0 繼承模型應(yīng)用到 C:\Windows。
“可信的安裝程序”對 C:\Windows 具有完全控制權(quán)限,并具有 C:\Windows 下所有子容器(由于是 CI,僅繼承)的 Generic_All 權(quán)限。
系統(tǒng)和管理員擁有對 C:\Windows 的 Read、Write、Append、ReadEA、WriteEA、Execute、ReadAttr、WriteAttr、Del、RCtl 和 Sync 權(quán)限(等于 SDGRGWGX 權(quán)限)。這相當(dāng)于 Generic_All 減去 Write_Owner 和 Write_DAC 權(quán)限;這表示除更改所有者和 ACL 以外,“管理員”和“系統(tǒng)”具有其他全部權(quán)限!癇A”和“SY”擁有對子文件和目錄對象的 Generic_All 權(quán)限。
由于管理員能接管所有權(quán),所以他仍然可以聲明 WriteOwnership 權(quán)限并在任何情況下取得控制權(quán)。管理員和系統(tǒng)在安全方面不相上下。但由于有了該權(quán)限,管理員可以繞開 WRP ACL 控制。
CO 還擁有子文件和目錄對象的 Generic_All 權(quán)限。內(nèi)置用戶擁有對 C:\Windows 的 Read、ReadEA、Execute、ReadAttr、RCtl 和 Sync 權(quán)限(等于 GRGX 權(quán)限),并擁有 C:\Windows 下子目錄和文件的 GRGX 權(quán)限。
所有的系統(tǒng)文件和文件夾都包含受保護的 ACL,它們授予“可信的安裝程序”完全控制權(quán)限!翱尚诺陌惭b程序”對文件的控制不在系統(tǒng)根目錄的聲明中表述,而是在 Windows 組件的單獨聲明中表述。
設(shè)置安全文件系統(tǒng)權(quán)限
在了解文件系統(tǒng) ACL 的工作原理和解讀方法之后,讓我們看看如何進行設(shè)置。如果正在安裝某個應(yīng)用程序,您應(yīng)該將它安裝到默認(rèn)的 Program Files 位置。該位置的默認(rèn) ACL 將為管理員和本地系統(tǒng)提供完全控制權(quán)限,這并無不妥。
如果將應(yīng)用程序安裝到其它位置,或者允許用戶選擇喜歡的位置安裝應(yīng)用程序,那您將會遇到問題:其它驅(qū)動器和系統(tǒng)驅(qū)動器的非系統(tǒng)及非應(yīng)用程序區(qū)域的默認(rèn) ACL 并不十分安全。在這種情況下,您必須使用受保護的適當(dāng) DACL 顯式控制文件夾的 ACL。安裝應(yīng)用程序最簡單安全的方法是復(fù)制 Program Files 文件夾的安全設(shè)置。如果選擇不這么做,那您可以設(shè)置 DACL 使非管理員無法更改 DACL 和可執(zhí)行文件的所有權(quán),并使其無法在包含可執(zhí)行文件的目錄中寫入、附加或刪除文件。
如果您設(shè)置 DACL,基本規(guī)則是不希望管理員或其它用戶執(zhí)行由用戶編寫的代碼。如果存在問題的文件夾位于受信區(qū)域(Windows、Program Files 等),則可假定它也是受信的,這時問題更為突出。這樣做將允許管理員提升權(quán)限 (EoP) 并增加跨用戶攻擊的風(fēng)險。因此,如果某位用戶可以向文件夾寫入文件,則其它用戶和管理員應(yīng)該不能執(zhí)行這些文件。
乍一看似乎任何時候您都不應(yīng)該允許用戶向 Windows、System、Program Files 的文件夾中寫入文件。但有許多充分的理由需要執(zhí)行這類寫入操作。最常見的是記錄錯誤日志數(shù)據(jù)。如果可執(zhí)行文件在用戶憑據(jù)下運行并且需要記錄錯誤,那它需要具備錯誤日志文件夾的寫入/附加權(quán)限。(如果將錯誤記錄到多用戶系統(tǒng)中每個用戶的位置,則需要將記錄數(shù)據(jù)傳遍整個系統(tǒng),而不用與可執(zhí)行文件相關(guān)聯(lián)。應(yīng)用程序和服務(wù)器通常寫入共享文件夾或注冊表項。)您會在注冊表中發(fā)現(xiàn)相同的問題,使用用戶權(quán)限運行的進程經(jīng)常會把錯誤信息存儲在特定的機器注冊表項中。
請不要將用戶可寫的文件與可執(zhí)行文件混放在一起。應(yīng)該使用不同的目錄存放必須信任的文件(例如可執(zhí)行文件)和必須不被信任的文件(例如可能由不受信任的用戶編寫的任何文件)。為目錄設(shè)置適當(dāng)?shù)?ACL—管理員控制可執(zhí)行文件,而用戶可以讀取/執(zhí)行但不能寫入。注冊表項和子項也適用相同的原則。
客戶端和服務(wù)器的不同之處在于:服務(wù)器管理員假定比管理員用戶具備更多的知識。服務(wù)器管理員知道他們必須拒絕執(zhí)行來自系統(tǒng)非受信區(qū)域的代碼。通過建立命名規(guī)范將數(shù)據(jù)文件與系統(tǒng)中的可執(zhí)行文件隔離,您可以就可執(zhí)行文件的可靠性為管理員提供指南—日志子目錄并不可信,因此必須禁止用戶創(chuàng)建或更改這些子目錄,防止他們欺騙安全命名規(guī)則。
在客戶端環(huán)境中,更容易誘騙管理員用戶執(zhí)行某些代碼。對于此類天真的管理員來說,具備用戶寫入權(quán)限的目錄必須禁止管理員具有執(zhí)行特權(quán),以防止用戶在其中安裝可執(zhí)行文件并誘騙管理員用戶運行這些文件而導(dǎo)致系統(tǒng)遭到破壞。例如,如果您的應(yīng)用程序或服務(wù)需要存儲以用戶權(quán)限寫入的日志信息,那您應(yīng)該創(chuàng)建日志子目錄以存儲這些數(shù)據(jù)。管理員不應(yīng)有該子目錄的執(zhí)行權(quán)限?梢栽谇懊骘@式拒絕任何人執(zhí)行文件,例如添加 D;OI;WP;;;WD。這樣可以防止在允許用戶寫入或更改文件的目錄中發(fā)生跨用戶攻擊。
在很多情況下可能需要用戶能夠共享數(shù)據(jù)(盡管我們不希望用戶在共享區(qū)域共享和執(zhí)行代碼)。例如,家庭用戶(或者他的照片查看應(yīng)用程序)可能會創(chuàng)建類似 C:\Photos 這樣的目錄。該用戶希望能夠允許多個用戶在此目錄中寫入文件并使其能夠編輯該目錄中的各種照片。 Windows Vista 中系統(tǒng)驅(qū)動器根目錄的默認(rèn) ACL 支持這種應(yīng)用。另一種常見的共享情況是用戶希望在某個文件夾中放置數(shù)據(jù)供其它用戶讀取。只允許數(shù)據(jù)創(chuàng)建者刪除或修改這些數(shù)據(jù),但其他用戶可以復(fù)制數(shù)據(jù)和編輯副本。這是一種共享讀取方案,Windows Server 2008 的系統(tǒng)驅(qū)動器默認(rèn)使用此方案。
現(xiàn)在考慮另外一種情形:您選擇鎖定系統(tǒng)驅(qū)動器,或具體而言,針對共享使用 ACL 設(shè)置文件夾。您需要選擇適合這兩種情況的 ACL,而不是常見方案。我們希望管理員能夠管理對象,同時還希望防止因在這些文件夾中執(zhí)行代碼而出現(xiàn)安全問題(請注意:此處的 ACE 甚至?xí)柚顾姓邚倪@些文件夾執(zhí)行代碼)。
以下是共享讀取 ACE:
D:P(D;OI;WP;;;WD)(A;OICI;FA;;;BA)(A;OICI;FA;;;SY)(A;OICI;FA;;;CO)(A;CI;0x1200af;;;AU)(A;OI;GR;;;AU) |
以下是協(xié)作性 ACE:
D:P(D;OI;WP;;;WD)(A;OICI;FA;;;BA)(A;OICI;FA;;;SY)(A;OICI;FA;;;CO)(A;OICI;SDGRGW;;;AU) |
請注意:兩個ACL 都以拒絕所有人執(zhí)行 ACE、對象繼承(應(yīng)用到文件)開始,從而防止用戶系統(tǒng)和跨用戶攻擊。然后為管理員,系統(tǒng)(系統(tǒng)實際上不需要)和 CO 提供完全控制權(quán)限 (File All)。
對于“共享讀取”方案來說,因為此授權(quán)在 CI 和目錄方面的限制,經(jīng)過驗證的用戶將獲得 List、AddFile、AddSubDir、ReadEA、Traverse、ReadAttr、RCtl 和 Sync 權(quán)限,單獨得到對所有文件的 Generic Read 權(quán)限。對于“協(xié)作”方案來說,經(jīng)過驗證的用戶將獲得文件和目錄的 Delete、Generic Read 和 Generic Write 權(quán)限。
管理注冊表及其權(quán)限
Windows 將許多狀態(tài)信息存儲在 Windows 注冊表中。注冊表數(shù)據(jù)以“配置單元”格式存儲,數(shù)據(jù)存儲在項和子項當(dāng)中,可以將二者視為容器(子項不視為對象)。
用戶特定數(shù)據(jù)存儲在 Hive Key Users (HKEY_USERS) 的相應(yīng)用戶中。如您所料,這種數(shù)據(jù)大多可由用戶寫入。在任何會話內(nèi),HKey_Current_User (HKCU) 都將指向 HKEY_USERS 的適當(dāng)部分。
系統(tǒng)和機器信息存儲在 HKEY_LOCAL_MACHINE (HKLM) 配置單元中。HKLM 中包含的是各種系統(tǒng)服務(wù)的信息,其中大多數(shù)現(xiàn)在均使用本地服務(wù)或網(wǎng)絡(luò)服務(wù)組的有限權(quán)限運行。服務(wù)和應(yīng)用程序可以在其注冊表項中存儲狀態(tài)信息。這些信息應(yīng)該存儲在子項(隸屬服務(wù)項或服務(wù)項包含的項)當(dāng)中。切勿通過 ACL 處理服務(wù)項,使該服務(wù)具有對其自身服務(wù)項的 SetKey 權(quán)限(或者 WDac 或 WOwn 權(quán)限,這些權(quán)限可能會導(dǎo)致此類攻擊),因為這樣會使該服務(wù)能夠指向不同的可執(zhí)行文件。此類錯誤可能導(dǎo)致服務(wù)主機遭到 EoP 攻擊,因為服務(wù)控制管理器可能會在系統(tǒng)加載時也加載該服務(wù)所指向的可執(zhí)行文件。
為 HKLM 設(shè)置 DACL 的一般原則是必須使用戶不能寫入或修改此數(shù)據(jù)、相關(guān)聯(lián)的 ACL 和所有權(quán)。與設(shè)置系統(tǒng)區(qū)域中文件系統(tǒng) DACL 的指導(dǎo)原則一樣,使用用戶權(quán)限或在受限環(huán)境中運行的應(yīng)用程序或服務(wù)需要記錄錯誤消息時,屬于特例情況。對這種情況的指導(dǎo)原則與文件系統(tǒng)中解決類似問題的原則相似—為此類信息創(chuàng)建單獨的項并為其設(shè)置適當(dāng)?shù)?ACL。因此,敏感信息可以通過 ACL 設(shè)置給受信主體(管理員、系統(tǒng)等),而日志數(shù)據(jù)也可在需要時允許寫入。
您需要盡力避免的情況是用戶修改受信任的參數(shù)(例如關(guān)閉反病毒或防間諜軟件服務(wù))或使用用戶或管理員使用的工具篡改數(shù)據(jù)。假設(shè)當(dāng)調(diào)用“記事本” 時它會加載 C:\windows\notepad.exe。C:\windows 的默認(rèn) ACL 不允許攻擊者修改此可執(zhí)行文件。如果攻擊者可以重寫從“記事本”圖標(biāo)到其可執(zhí)行文件的鏈接,則攻擊者可以將該圖標(biāo)鏈接到其他文件(例如 C:\tools\load_rootkit.exe)并加載它。這樣可以在加載 rootkit 之后再加載“記事本”,從而使用戶感覺不到系統(tǒng)已經(jīng)遭到破壞。
如果攻擊者可以通過注冊表驅(qū)動鏈接,那文件系統(tǒng)中保護性的 ACL 將起不到多大作用。您還可能受到從受限系統(tǒng)服務(wù)向其它系統(tǒng)服務(wù)發(fā)起的攻擊。在 Windows Vista 和 Windows Server 2008 中,服務(wù)將按照其所需要的權(quán)限劃分為不同的組。這種服務(wù)隔離技術(shù)提供的深度防御保護需要服務(wù)權(quán)限配置,這樣服務(wù)(特別是跨服務(wù)組的服務(wù))之間將無法互相篡改數(shù)據(jù)。
正如我們需要考慮防止用戶添加或鏈接到惡意可執(zhí)行文件一樣,我們還必須防止服務(wù)更改其權(quán)限和功能。服務(wù)的 ChangeConf 權(quán)限必須限定給管理員、系統(tǒng)或可信的安裝程序,因為該權(quán)限允許處理器更改服務(wù)的權(quán)限。
總結(jié)
Windows 提供了非常豐富的權(quán)限控制功能,它們可用于允許操作、阻止操作并提供對新威脅的深度防御。這一豐富的訪問控制功能自然會令加大復(fù)雜性。
以下幾項一般指導(dǎo)原則可以幫助您避免出現(xiàn)各種問題。例如,系統(tǒng)默認(rèn)配置相對比較安全。您應(yīng)該盡可能使用這些配置。如果將應(yīng)用程序安裝到 Program Files 以外的位置,請使用程序文件 ACL。在某些情況下,您可能希望限制一些默認(rèn)權(quán)限,例如默認(rèn)授予用戶的驅(qū)動器權(quán)限;但請記住如果確實需要這么做,您應(yīng)該準(zhǔn)備好查找和處理潛在的應(yīng)用程序兼容性問題。
最重要的指導(dǎo)原則是嚴(yán)禁管理員或系統(tǒng)帳戶執(zhí)行或通過指針指向用戶能夠?qū)懭牖蛐薷牡拇a。同樣重要的是用戶不能執(zhí)行或通過指針指向另一個用戶能夠?qū)懭牖蛐薷牡拇a。這些指導(dǎo)原則適合本文中討論的各種安全問題。如果您所做的更改都遵守這些指導(dǎo)原則,那您將可以避免大多數(shù)嚴(yán)重的安全問題。
有關(guān)訪問控制組件的更多信息,請參閱 MSDN 中的“訪問控制組件”。有關(guān) ace_string 訪問掩碼組件的信息,請參閱 MSDN“ACCESS_MASK”文章,其中包含對文件、目錄、注冊表項和共享內(nèi)容特殊權(quán)限的介紹。有關(guān)受限 SID 的其他信息,請參閱 MSDN“受限令牌”文章。
John R. Michener 是Microsoft 的高級安全項目經(jīng)理,Windows 軟件保證團隊的密碼和權(quán)限專家,擁有20多年系統(tǒng)安全方面的經(jīng)驗。
關(guān)鍵字:注冊表、文件、線程、數(shù)據(jù)
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解