官术网_书友最值得收藏!

1.1.2 Windows訪問控制模型

1.訪問控制模型簡介

訪問控制模型(Access Control Model)是Windows操作系統中一個關于安全性的概念,由訪問令牌和安全描述符兩部分構成,其中:訪問令牌(Access Token)由當前登錄Windows賬號的用戶持有,它包含該賬號的基礎信息,如用戶賬戶的標識和權限信息;安全描述符由要訪問的對象持有,它包含當前對象的安全信息。假設當用戶登錄時,操作系統會對用戶的賬戶名和密碼進行身份驗證,則當登錄成功時,系統會自動分配訪問令牌。訪問令牌包含安全標識符(SID),SID用于標識用戶的賬戶及其所屬的任何組賬戶。當我們創建一個進程,也就是訪問一個資源(進程資源)的時候,訪問令牌會被復制一份并交給進程,進程根據它的創建者為它設置的安全描述符中的訪問控制列表(ACL)來判斷我們是否可以訪問,是否有權限執行某步操作。

2.訪問令牌

Windows的訪問令牌分為兩種類型——主令牌(Primary Token)和模擬令牌(Imperson-ation Token),它代表某種請求或登錄機制的憑據,使用戶可以在短時間內執行某種身份認證或權限操作的驗證信息。Windows系統中每個用戶登錄賬號都生成一個對應的訪問令牌。當用戶使用賬號登錄操作系統時,系統會將所登錄的賬號與安全數據庫(SAM)中存儲的數據進行對比驗證,驗證成功后才會生成訪問令牌。如果我們打開的進程或線程正在與具有安全描述符的對象交互,則系統將會攜帶令牌進行訪問,以此來表示用戶身份,如圖1-1所示。

圖1-1 訪問令牌流程

創建進程時,Windows操作系統的內核都會為進程創建并分配一個主令牌。每個進程都含有一個主令牌,主令牌描述了進程相關用戶賬號的安全上下文。同時,一個線程可以模擬一個客戶端賬號,允許此線程在與安全對象交互時使用客戶端的安全上下文。一個正模擬客戶端的線程擁有一個主令牌和一個模擬令牌。(主令牌是與進程相關的,而模擬令牌是與線程相關的。)

(1)主令牌

主令牌也叫授權令牌(Delegation Token),是一種認證機制,用于交互式登錄,是為了減少不必要的認證工作而出現的,由Windows操作系統的內核創建并分配給進程的默認訪問令牌。主令牌描述了登錄進程返回的安全標識SID,與當前進程相關的用戶賬戶的安全組的權限列表,代表系統可以使用令牌控制用戶可以訪問哪些安全對象、執行哪些相關系統操作。主令牌通常用于本地登錄及通過RDP遠程登錄的場景。

一個完整的主令牌包含如下內容:

?當前賬號SID

?當前賬戶所處安全組的SID

?該令牌的來源,即它是由哪個進程創建的

?所有者的SID

?主要組的SID

?訪問控制列表

?用戶或組擁有的權限列表

?模擬級別

?統計信息

?限制SID

(2)模擬令牌

在默認情況下,當線程開啟的時候,其所在進程的主令牌會自動附加到該線程上作為它的安全上下文。而線程可以在另一個非主令牌的訪問令牌下執行,這個令牌被稱為模擬令牌,通常會用于客戶端/服務器之間的通信。假設在文件共享的時候,服務器需要訪問令牌來驗證用戶的權限,但它無法直接獲取用戶的訪問令牌(該令牌是鎖死在內存中的,無法訪問),所以它就需要生成一個模擬令牌。

3.安全標識符

在Windows操作系統中,通常使用安全標識符(Security IDentifier,SID)來標識在系統中執行操作的實體。SID是一個唯一的字符串,可以代表用戶、用戶組、域、域組、域成員等角色身份。

(1)SID組成部分

SID是一種可變長度的數值,其組成部分如圖1-2所示。

圖1-2 SID的組成部分

其中:48位標識符機構值一般代指頒發機構,主要用于標識發布SID授權,通常為本地系統或域;子機構代表該頒發機構的委托人;

RID即相對標識符,是Windows在一個通用基準SID的基礎上創建這個SID的唯一方法。

在Windows系統中,SID采用標識符機構值和子機構值的組合,即使不同的SID頒發機構頒發出相同的RID的值,其SID也不會相同,因此在任何計算機或域中,Windows都不會頒發出兩個相同的SID。接下來以實際的SID為例。

(2)SID結構分析

每個SID都包含一個前綴S,不同的部分使用連字符“-”進行分隔。以下述SID為例,詳細為大家介紹SID在Windows操作系統中的組成部分,如圖1-3所示。

?S:表示字符串為SID。

?1:表示修訂級別,開始值為1。

?5:NT Authority,表示標識符頒發機構。

?21-1315137663-3706837544-1429009142:表示域標識符。

?502:表示RID(密鑰分發中心服務所使用的krbtgt賬戶)。

圖1-3 SID結構分析

(3)常見SID

通過上述對SID的結構分析,我們知道SID結構是一組標識通用用戶或通用組的SID,它們的值在所有操作系統中保持不變。Windows操作系統其實內置了一些本地SID和域SID,例如:Domain User組,用于代表域中所有的用戶賬戶,其SID為S-1-5-21-domain-513;Everyone組,代表所有的用戶賬戶,該組的SID為S-1-1-0。表1-1列舉出了當前Windows操作系統中的常見SID及其所屬的名稱和具體作用。

表1-1 常見SID及其所屬的名稱和具體作用

(4)SID構建方式

在Windows操作系統中,因常見的SID名稱可能會有所不同,我們應該通過使用API函數來從預定義的標識符授權和RID定義的常量中構建SID,例如:通過SECURITY_WORLD_SID_AUTHORITY和SECURITY_WORLD_RID這兩個常量來顯示代表所有用戶的特殊組的通用SID——S-1-1-0,其中S表示SID,1表示SID的修訂級別,剩下的1和0分別是S E C U R I T Y_WORLD_SID_AUTHORITY與SECURITY_WORLD_RID的值。如果要確認登錄用戶是不是特定已知組的成員,就需要使用AllocateAndInitializeSid函數為已知組構建SID,用于標識本地計算機的管理員組的眾多所知SID,然后使用EqualSid函數將SID與用戶所在組的組SID進行比較。如果需要釋放由AllocateAndInitializeSid分配的SID,只需要調用FreeSid函數即可,而不能直接使用其SID名稱(考慮到不同版本的操作系統上有不同的名稱)。如果需要使用SID,可以調用其已有的Windows API。表1-2是可供調用的API函數列表。

表1-2 可供調用的API函數列表

(5)構建常見的SID表以及標識符權限和子權限的常量表

接下來將介紹可用于構建常見的SID表以及標識符權限和子權限的常量表。表1-3列出了預定義的標識符頒發機構。

表1-3 預定義的標識符頒發機構

(續)

表1-4中的RID值與通用已知SID一起使用。標識符頒發機構列顯示標識符頒發機構前綴,可以使用該前綴組合RID來創建通用已知SID。

表1-4 RID頒發機構

RID所對應的每一個域如表1-5所示。

表1-5 RID所對應的每一個域

(續)

4.安全描述符

安全描述符(Security Descriptor)包含DACL(任意訪問控制列表)和SACL(系統訪問控制列表),其中SACL用來記載對象訪問請求的日志,DACL又包含ACE(訪問控制項),該項設置了用戶的訪問權限。安全描述符綁定在每個被訪問對象上,當我們攜帶訪問令牌去訪問一個帶有安全描述符的對象時,安全描述符會檢測我們的訪問令牌是否具有訪問權限。

安全描述符包含安全描述組織架構及其關聯的安全信息。下面來詳細介紹安全描述符的組織結構以及它包含的安全信息。

(1)安全描述符的組織結構

安全描述符由SECURITY_DESCRIPTOR結構及其關聯的安全信息組成,其結構體如下:

(2)安全描述符包含的安全信息

安全描述符包含如下安全信息。

?對象的所有者和所屬組的SID。

?DACL:包含ACE,每個ACE的內容描述了允許或拒絕特定賬戶對這個對象執行特定操作。

?SACL:主要用于系統審計,它的內容指定了當特定賬戶對這個對象執行特定操作時,將其記錄到系統日志中。

?控制位:一組限制安全描述符或各個成員的含義控制位。

(3)安全描述符查看

當我們需要查看某個對象具有什么安全描述符時,可以右擊該對象,選擇“屬性”選項,并進一步查看“安全”選項卡,如圖1-4所示。

圖1-4 當前對象具有的安全描述符

(4)DACL

DACL包含ACE,決定當前用戶以哪種權限訪問對象。系統使用以下方式為新對象構建DACL。

1)對象當前的DACL是對象創建者指定的安全描述符中的DACL。除非在安全描述符的控制位中設置了SE_DACL_PROTECTED位,否則系統會將所有可繼承的ACE合并到指定的DACL中。

2)如果創建者未指定安全描述符,則系統將從可繼承的ACE構建對象的DACL。

3)如果未指定安全描述符,并且沒有可繼承的ACE,則對象的DACL是來自創建者的主令牌或模擬令牌的默認DACL。

4)如果沒有指定的、繼承的或默認的DACL,則系統將創建不具有DACL的對象,從而允許所有人完全訪問該對象。

(5)SACL

SACL主要用于系統審計,同時可以指定哪些用戶的行為操作記錄會被保存到系統日志中。系統使用以下方式為新對象構建SACL。

1)對象的SACL是對象創建者指定的安全描述符中的SACL。除非在安全描述符的控制位中設置了SE_SACL_PROTECTED位,否則系統會將所有可繼承的ACE合并到指定的SACL中。即使SE_SACL_PROTECTED位置已經設置,來自父對象的SYSTEM_RESOURCE_ATTRIBUTE_ACE和SYSTEM_SCOPED_POLICY_ID_ACE也將合并到新對象。

2)如果創建者未指定安全描述符,則系統將從可繼承的ACE構建對象的SACL。

3)如果沒有指定的或繼承的SACL,則該對象沒有SACL。

4)要為新對象指定SACL,對象的創建者必須啟用SE_SECURITY_NAME特權。如果為新對象指定的SACL僅包含SYSTEM_RESOURCE_ATTRIBUTE_ACE,則不需要SE_SECURITY_NAME特權。如果對象的SACL是從繼承的ACE構建的,則創建者不需要此特權。應用程序不能直接操縱安全描述符的內容。Windows API提供了在對象的安全描述符中設置和檢索安全信息的功能。此外,還有用于創建和初始化新對象的安全描述符的函數。

(6)安全描述符字符串

安全描述符字符串是指在安全描述符中存儲或傳輸信息的文本格式。安全描述符包含二進制格式的安全信息,Windows API提供了在二進制安全描述符與文本字符串之間進行相互轉換的功能。字符串格式的安全描述符不起作用,但是對于存儲或傳輸安全描述符信息很有用。要將安全描述符轉換為字符串格式,需要調用ConvertSecurityDescriptorToStrin gSecurityDescriptor函數;要將字符串格式的安全描述符轉換回有效的功能性安全描述符,需要調用ConvertStringSecurityDescriptorToSecurityDescriptor函數。

主站蜘蛛池模板: 岑巩县| 浠水县| 颍上县| 松江区| 南岸区| 呼图壁县| 卓尼县| 砀山县| 泰宁县| 衡阳县| 双城市| 大田县| 旺苍县| 志丹县| 易门县| 瑞丽市| 沐川县| 于田县| 福清市| 潜山县| 顺昌县| 闵行区| 手游| 青浦区| 靖宇县| 西昌市| 隆昌县| 瑞安市| 本溪市| 楚雄市| 平顶山市| 澳门| 卓资县| 收藏| 曲靖市| 德化县| 敦煌市| 红河县| 大荔县| 黑山县| 龙川县|