【windows安全性 之訪問控制】 訪問控制 詳細解說


windows的安全性的兩個基本支柱是身份驗證(登入)和授權(訪問控制)

身份驗證是標識用戶的過程 ,授權在驗證了所標識用戶是否可以訪問特定資源之后進行。

相關的命名空間和類:

System.Security Namespace
System.Security.Principal Namespace
WindowsIdentity Class

System.Security.AccessControl Namespac
FileSystemSecurity Class
DirectorySecurity Class
FileSecurity
AccessRule Class

FileSystemAccessRule Class
 AccessControlType  Enum

FileSystemRights Enum

目錄

1、訪問控制模型(Access Control Model)

  • 1.1訪問控制模型的各個部分
  • 1.2線程與安全對象之間的交互
  • 1.3DACL 和 AES
  • 1.4AccessCheck 的工作原理

 2、訪問控制編輯器(Access Control Editor)

 

1.1訪問控制模型的各個部分

訪問控制模型兩個基本部分:

  1. 訪問令牌(Access Token)
    其中包含有關登錄用戶的信息(User SID,Group SIDS,特權列表privileges),訪問令牌是與Windows的賬戶相互對相應的,當某一賬戶登錄時,系統會生成此用戶的訪問令牌並分發給啟動的進程

  2. 安全描述符(Security descriptor)
    描述一個安全對象的安全信息,如什么樣的用戶的什么訪問請求可以被允許,什么樣的用戶或者組的什么訪問要被拒絕。安全描述符具體由ACL、 對象擁有者SID 、此擁有者所在主群的SID、安全描述符意思相符的控制位集合一起組成。ACL由 自由訪問控制列表 (DACL) 和系統訪問控制列表 (SACL)組成。

訪問控制的工作原理:

簡述:用戶經過身份認證成為 安全主體》安全主體 獲取訪問令牌》安全主體持有訪問令牌 操作 安全對象》操作系統比對 安全主體持有的訪問令牌 與 安全對象的安全描述符 是否匹配》如匹配允許操作(刪除 、移動 、添加等13項操作),不匹配拒絕操作。

具體:用戶登錄時 ,系統會對用戶 的帳戶名和密碼進行身份驗證, 如果登錄成功,我們就把該用戶稱為安全主體,LSA(Local Security Authority)將創建訪問令牌 ,安全主體將獲取此令牌(access token)。

安全主體持有訪問令牌,安全主體訪問安全對象時候,操作系統將檢查安全主體的訪問令牌內容和安全對象的安全描述是否匹配。如果匹配操作系統將允許安全主體對安全對象進行相應的操作。

相關知識點:訪問令牌的組成、安全描述符、安全標識符(SID)、計算機上本地安全機構(LSA)、權限列表

 

 

 

 

安全描述符標識對象的所有者,還可以包含以下 訪問控制列表

  • DACL (的) 訪問控制列表,用於標識允許或拒絕訪問對象的用戶和組
  • SACL ( 訪問控制) ,用於 控制系統審核 嘗試訪問對象

ACL 包含 AES (訪問控制) 。 每個 ACE 指定一組訪問權限,並包含一個 SID,用於標識允許、拒絕或審核其權限的受信者。 受信者可以是用戶帳戶、組帳戶或 登錄會話

使用函數操作安全描述符、SID 和 ACL 的內容,而不是直接訪問它們。 這有助於確保這些結構在語法上保持准確,並防止將來對安全系統的增強功能破壞現有代碼。

以下主題提供有關訪問控制模型的各個部分的信息:

 

1.2線程與安全對象之間的交互

當線程嘗試使用安全對象 ,系統會先執行訪問檢查,然后再允許線程繼續。 在訪問檢查中,系統將線程的訪問令牌中的安全信息與對象的安全描述 符 中的安全信息 進行比較

  • 訪問令牌包含 標識與 (關聯的) ID 的安全標識符。
  • 安全描述符標識對象的所有者,並包含 DACL (的) 。 DACL 包含 AES (訪問控制) ,其中每個條目都指定允許或拒絕特定用戶或組的訪問權限。

系統檢查對象的 DACL,從線程的訪問令牌中查找應用於用戶和組 SID 的 AES。 系統會檢查每個 ACE,直到授予或拒絕訪問,或者直到沒有要檢查的 ACE。 可以想象 ,ACL (訪問控制) 可能有幾個適用於令牌的 SID 的 AES。 如果發生這種情況,則每個 ACE 授予的訪問權限都會累積。 例如,如果一個 ACE 授予對組的讀取訪問權限,而另一個 ACE 授予對作為該組成員的用戶的寫入訪問權限,則用戶可以同時擁有對 對象的讀取和寫入訪問權限。

下圖顯示了這些安全信息塊之間的關系:

進程、aces 和 dacls 之間的關系

 

1.3Dacl 和 Ace

如果 Windows 對象沒有 (DACL) 的 自由訪問控制列表,則系統允許每個人對其進行完全訪問。 如果對象具有 DACL,系統只允許 (Ace) 的 訪問控制項 顯式允許的訪問。 如果 DACL 中沒有 Ace,則系統不允許任何人訪問。 同樣,如果 DACL 包含允許訪問有限的一組用戶或組的 Ace,則系統將隱式拒絕對 Ace 中未包含的所有受信者的訪問。

 

 

 

在大多數情況下,你可以通過使用允許訪問的 Ace 來控制對對象的訪問。不需要顯式拒絕對對象的訪問。 例外情況是,ACE 允許訪問組,而你希望拒絕對組成員的訪問。 為此,請在組的訪問允許的 ACE 前面的 DACL 中放置用戶的 "拒絕訪問" ACE。 請注意, ace 的順序 非常重要,因為系統會按順序讀取 ace,直到授予或拒絕訪問權限。 用戶的 "拒絕訪問" ACE 必須首先出現;否則,當系統讀取組的 "允許的訪問" ACE 時,它將向受限用戶授予訪問權限。

下圖顯示了拒絕訪問一個用戶並授予對兩個組的訪問權限的 DACL。 組 A 的成員可以通過累積允許對每個用戶進行分組和權限的權限來獲取讀取、寫入和執行訪問權限。 例外情況是 Andrew 的,拒絕訪問的 ACE (盡管是 Everyone 組的成員)拒絕了訪問。

基於組成員身份授予不同訪問權限的 dacl

1.4AccessCheck 的工作原理

當線程嘗試訪問安全對象時,系統將授予或拒絕訪問。 如果該對象沒有 DACL (自由 訪問控制) , 則系統會授予訪問權限;否則, 系統會在對象的 DACL 中查找 (AES) 應用於線程的訪問控制條目。 對象的 DACL 中的每個 ACE 都指定受信者(可以是用戶帳戶、組帳戶或登錄會話)允許或拒絕 的訪問權限

 

 




2、window 訪問控制編輯器(Access Control Editor)

右鍵(文件、目錄、程序)》選擇屬性》安全》高級   進入訪問控制編輯器

 

 

2.1權限屬性頁

 

 

術語表


 

 安全描述符(Security Descriptors)

MSDN說安全描述符包含了描述一個安對象的安全信息。如什么樣的用戶的什么訪問請求可以被允許,什么樣的用戶或者組的什么訪問要被拒絕。只是是大概上的。讓我們具體看看安全描述符到底描述了哪些東西?

安全描述符包括:

1.與安全描述符關聯的安全對象的擁有者的SID和此擁有者所在主群的SID

2.一個DACL(discretionary access control list)

3.一個SACL(system access control list)

4.和安全描述符意思相符的控制位集合

安全對象(Securable Objects)

具有安全描述符的對象就是安全對象。window上的安全對象有:NTFS 文件系統上的文件或目錄\命名管道  匿名管道\進程 線程\文件映射對象\本地或遠程打印機\網絡共享

知識點:https://docs.microsoft.com/zh-cn/windows/win32/secauthz/securable-objects

Security Descriptor:安全描述符,被訪問者持有安全描述符。

安全標識符(SID Security Identifiers)

SID是用來標識安全主體。就是給安全主體一個唯一的ID。用戶層面通過用戶賬戶名識別,程序和資源之間通過SID識別。

如何獲取SID

1、獲取windows 10操作系統的 SID,已經測試過,是有些的

1.簡單點的: System.Security.Principal.WindowsIdentity currentUser = System.Security.Principal.WindowsIdentity.GetCurrent(); string sid = currentUser.User.ToString();

 2、cmd 命令行獲取SID

 

安全主體(security principal)?

安全主體是任何可通過操作系統進行身份驗證的實體,例如用戶帳戶、計算機帳戶、在用戶或計算機帳戶的安全上下文中運行的線程或進程,或者這些帳戶的安全組。 安全主體一直是控制對計算機中安全資源Windows的基礎。 每個安全主體在操作系統中由 SID (唯一) 。

來源:docs.microsoft.com

個人理解:不管是從本地還是遠程 登入操作系統的的賬戶或程序都是安全主體

身份驗證

身份驗證是驗證對象或人員身份的過程。 當你對某個對象進行身份驗證時,目的就在於驗證該對象是否為正版。 當你對某個用戶進行身份驗證時,其目標是驗證該用戶是否不是冒名頂替者。  因此,身份驗證不能保證對資源的訪問權限,也不能授權使用資源。

在網絡環境中,身份驗證是向網絡應用程序或資源證明身份的行為。

來源:docs.microsoft.com

個人理解:登入操縱系統、服務器、應用軟件的過程就是身份驗證的過程,登入成功就是驗證成功。

計算機帳戶:加入域服務器的計算機,在域服務器中會生成一個賬戶就叫計算機帳戶

用戶帳戶:每個安全主體都分配有一個唯一標識符,它將在其整個生命周期內保留。 本地用戶帳戶和安全組是在本地計算機上創建的,它們可用於管理對該計算機上資源的訪問權限。 本地用戶帳戶和安全組由本地計算機上安全帳戶管理器 (SAM) 管理。

window內置的安全主體:

雖然內置安全主體有很多,但正常能在權限設置中使用到的並不多,所以下面僅說明其中幾個較重要的:
①Anonymous Logon:任何沒有經過Windows XP驗證程序(Authentication),而以匿名方式登錄域的用戶均屬於此組;
②Authenticated Users:與前項相反,所有經過Windows XP驗證程序登錄的用戶均屬於此組。設置權限和用戶權力時,可考慮用此項代替Everyone組;
③BATCH:這個組包含任何訪問這台 計算機批處理程序(Batch Process);
④DIALUP:任何通過撥號網絡登錄的用戶;
⑤Everyone:指所有經驗證登錄的用戶及來賓(Guest);
⑥Network:任何通過網絡登錄的用戶;
⑦Interactive:指任何直接登錄本機的用戶;
⑧Terminal server user:指任何通過 終端服務登錄的用戶。

來源:百度百科

 

 

 

訪問控制模型(DAC,MAC,RBAC,ABAC)

 

內容來源:https://blog.csdn.net/weixin_39638859/article/details/110464921

 

 

 

安全標識符如何工作

用戶通過使用帳戶名稱來引用帳戶,但操作系統內部指使用其安全標識符或 SID 在帳戶的安全上下文中運行的帳戶 (進程) 。 對於域帳戶,安全主體的 SID 創建方法為:將域的 SID 與帳戶的相對標識符相連接 (RID) 。 SID 在其作用域內是唯一 (或本地) ,並且永遠不會重復使用。

創建帳戶或組時,操作系統將生成標識特定帳戶或組的 SID。 本地帳戶或組的 SID 由計算機上本地安全機構 (LSA) 生成,並與其他帳戶信息一起存儲在注冊表的安全區域中。 域帳戶或組的 SID 由域安全機構生成,並作為 User 或 Group 對象的屬性存儲在 Active Directory 域服務中。

對於每個本地帳戶和組,SID 對於創建它的計算機都是唯一的。 計算機上沒有兩個帳戶或組共享同一 SID。 同樣,對於每個域帳戶和組,SID 在企業內都是唯一的。 這意味着,在一個域中創建的帳戶或組的 SID 將永遠不會與在企業內任何其他域中創建的帳戶或組的 SID 匹配。

SID 始終保持唯一。 安全機構從不發出兩次相同的 SID,並且從不對已刪除的帳戶重復使用 SID。 例如,如果某個用戶在域中擁有用戶帳戶Windows離開工作,則管理員將刪除其 Active Directory 帳戶,包括標識該帳戶的 SID。 如果稍后她回到同一公司的不同工作,則管理員將創建一個新帳戶,Windows Server 操作系統將生成一個新的 SID。 新 SID 與舊 SID 不匹配;因此,用戶不會從舊帳戶訪問任何帳戶轉移到新帳戶。 她的兩個帳戶代表兩個完全不同的安全主體。

安全標識符體系結構

安全標識符是二進制格式的數據結構,其中包含可變數量的值。 結構中的第一個值包含有關 SID 結構的信息。 剩余值按層次結構排列 (類似於電話號碼) ,並標識 SID 頒發機構 (例如,"NT 頒發機構") 、SID 頒發域和特定的安全主體或組。 下圖演示 SID 的結構。

安全標識符體系結構。

下表介紹了 SID 的單個值。

 

下表介紹了 SID 的單個值。

安全標識符體系結構
評論 描述
修訂 指示特定 SID 中使用的 SID 結構的版本。
標識符頒發機構 標識可頒發特定類型安全主體的 SID 的最高級別頒發機構。 例如,Everyone 組的 SID 中的標識符頒發機構值為 1 (頒發機構) 。 特定服務器帳戶或組的 SID 中的標識符Windows頒發機構值是 5 (NT authority) 。
Subauthorities >在 SID 中保存最重要的信息,這些信息包含在一系列一個或多個子身份驗證值中。 系列中最后一個值(不包括)的所有值共同標識企業中的域。 本系列的這一部分稱為域標識符。 系列中的最后一個值(稱為"RID (標識符) 標識與域相關的特定帳戶或組。

當使用標准表示法將 SID 從二進制轉換為字符串格式時,SID 的組件更易於可視化:

 
S-R-X-Y1-Y2-Yn-1-Yn

在此表示法中,SID 的組件表示如下表所示。

表 2
評論 描述
S 指示字符串是 SID
R 指示修訂級別
X 指示標識符頒發機構值
Y 表示一系列子身份驗證值,其中 n 是值的數量

 

 

 

 

 

 

 

SID 的最重要的信息包含在一系列子身份驗證值中。 (-Y1-Y2-Yn-1) 是域標識符。 SID 的此元素在具有多個域的企業中變得十分重要,因為域標識符將一個域頒發的 SID 與企業中所有其他域頒發的 SID 相區分。 企業中沒有任何兩個域共享同一域標識符。

子身份驗證值系列中的最后一 (-Yn) 是相對標識符。 它將一個帳戶或組與域中的所有其他帳戶和組區分。 任何域中沒有兩個帳戶或組共享同一相對標識符。

例如,內置 SID 的 SID 管理員組以標准化 SID 表示法表示為以下字符串:

詳細內容:https://docs.microsoft.com/zh-cn/windows/security/identity-protection/access-control/security-identifiers

 

訪問掩碼格式

所有安全對象均使用下圖中所示的 訪問掩碼 格式來排列其訪問權限。

訪問掩碼格式

此格式的低序位16位用於特定於對象的訪問權限,接下來的8位適用於適用於大多數對象類型的 標准訪問權限,4個高序位用於指定 一般訪問權限 ,每個對象類型都可以映射到一組標准和特定於對象的權限。 訪問 _ 系統 _ 安全位對應於 訪問對象的 SACL的權限。

訪問控制列表(ACL:Access Control List)

ACL 中的每個 ACE 標識一個受信者,並指定該受信者訪問規則。安全對象的安全描述符 可以包含兩種類型的 ACL:DACL 和 SACL。

 

 

 

 

 

 

自由訪問控制列表(DACL:Discretionary Access Control List)

就像它的名字一樣,DACL就是一個表明其它所有人的自由的(相應的)訪問控制列表。這是什么意思呢?讓我們具體看看DACL里面是什么東西吧。看下圖你就比較明白了。

 

 

 

Aa446683.accctrl1(en-us,VS.85).png

相信看了這個圖能明白一大半。一個DACL是一個列表。

那么DACL是如何工作的?

系統將每個 ACE 中的受信者與線程的訪問令牌 中標識的受 信者進行比較。通常,系統使用 請求 訪問的線程的主訪問令牌。 但是,如果線程正在模擬其他用戶,則系統將使用線程的 模擬令牌

系統會按順序檢查每個 ACE,直到發生以下事件之一:

  • 拒絕訪問的 ACE 顯式拒絕對線程的訪問令牌中列出的受信者之一的任何請求訪問權限。
  • 線程訪問令牌中列出的受信者允許訪問的一個或多個 AES 顯式授予所有請求的訪問權限。
  • 已檢查所有 AES,並且仍有至少一個請求的訪問權限未顯式允許,在這種情況下,將隱式拒絕訪問。

 

 這個鏈表的比較是順序的,從頭到尾。如果鏈表的順序變了,或許原來訪問請求的結果就樣了。

例如將上圖中ACE3和ACE1的順序調換過來,Thread A的請求就會被允許。所以順序很重要。所以如果要構建一個安全描述符的DACL的話,用API添加ACE的時候,程序員要謹慎處理。注意API函數添加ACE始終實在鏈表末尾添加的。

ACE繼承沒有完全研究,暫且擱淺!

系統訪問控制列表(SACL:System Access Control List)

SACL其實就是一個審計中心,這個列表里面列舉着哪些類型的訪問請求需要被系統記錄。一旦有用戶訪問一個安全對象,其請求的訪問權限和SACL中的一個ACE符合,那么系統會記錄這個用戶的請求是被拒絕了還是被允許了。MSDN提及說,將來可能會實現安全對象會對未經授權的用戶訪問發出警告信息。個人理解:SACL的作用是記錄訪問成功與否,SACL也是由ACE構成,每條ACE的內容是某個用戶訪問成功/失敗某個權限,當訪問跟滿足這條ACE的時候就會被記錄下來。

 

 

訪問控制項 (ACE :Access Control Entry )

一條ACE主要是四個方面

  1. 誰對你有權限
  2. 是允許還是拒絕
  3. 有什么權限
  4. 這個權限能不能被繼承

向不同線程授予不同訪問權限的 dacl

 

相信看了這個圖能明白一大半。每個ACE都是一個對某個SID的訪問控制說明,描述這個SID是被拒絕還是被允許,如果允許的話,對這個SID給予什么權限。當然這個圖很形象,但實際中ACE里面不是一個一個的字符串,這個ACE是怎么樣的呢?

ACE其實由四部分組成,只是上面的圖畫的太好了。

這四部分分別是:

1.可能訪問本ACE某個用戶SID(對應Andrew)

2.該用戶的訪問權限的掩碼(Read,write,execute)

3.ACE的類型,總共有三種。Access-denied ACE,Access-allowed ACE,System-audit ACE。前兩種是DACL類型,最后一種是SACL類型。

4.這個ACE是否可以被其他安全對象繼承。

 

C# 新建一個ACE 代碼如下:

FileSecurity sonFileSecurity=sonFile2.GetAccessControl();
        sonFileSecurity.AddAccessRule(new FileSystemAccessRule("HP", FileSystemRights.Modify, AccessControlType.Deny));
        sonFile2.SetAccessControl(sonFileSecurity);

 

 

 

 

 

 

 

 

 

Access Tokens(訪問令牌)

我們可以這樣理解訪問令牌,不過還是先把完整概念介紹一下。

訪問令牌是包含12項,分別是:

  1. 當前用戶的安全ID(稍后介紹),
  2. 當前用戶所屬組的安全ID。
  3. 當權會話安全ID。
  4. 用戶所有的特權列表(包括用戶本身,和其所屬組)。
  5. 令牌擁有者安全ID。
  6. 用戶所屬主組群安全ID。
  7. 默認的自由訪問控制列表(稍后介紹)。
  8. 源訪問令牌
  9. 表明此令牌是源令牌還是模擬令牌
  10. 可選的鏈表,表明此令牌限制哪些SID
  11. 當前模擬令牌的級別
  12. 其他數據資料

看到這么多數據項,你該知道安全措施需要付出多大的代價了吧。

訪問令牌描述了一個進程或線程的相關的安全信息。這些信息表明與這個進程或者線程關聯的用戶的標識符和特權。當用戶登陸系統是,將用戶密碼和系統內數據庫內的響應密碼對比,如果驗證通過,系統給用戶產生一個訪問令牌。以后這用戶打開的所有線程都是繼承與這個令牌。拿着這個令牌去訪問安全對象。(Windows vista之后已經不一樣了,如果是管理員登陸的話,管理員得到的訪問令牌,和管理員啟動的進行所擁有的令牌不一樣,進程的令牌是被篩選的,或者說是降低權限的,進程要獲得管理員的訪問令牌(或者會所權限),就必須發出申請,系統顯示一個對話框,是否允許這個程序以這種方式啟動。)

每個進程至少有一個訪問令牌,那就是主訪問令牌,為什么是主呢?因為有些進程可能模擬另一個用戶,並會或者另一個用戶的令牌,而那個令牌就是模擬令牌。而系統在將進程的訪問和安全對象進行審核是,使用的是主訪問令牌。具體的暫且未知。

特權

特權是一個帳戶(如用戶或組帳戶)在本地計算機上執行各種系統相關操作(如關閉系統、加載設備驅動程序或更改系統時間)的權限。特權與訪問權限有兩個不同之處:
特權控制對系統資源和系統相關任務的訪問,而訪問權限控制對安全對象的訪問。
系統管理員為用戶和組帳戶分配特權,系統根據安全對象的DACL中的ACE授予的訪問權限授予或拒絕對安全對象的訪問。

相關單詞列表:

principals:主體
subject:主體、主語
identifier:標識符 鑒定人
authority:專家 授權 官方
Access Control Model:訪問控制模型=訪問令牌+安全描述符

,訪問者擁有訪問令牌。用戶成功登入操作系統后,操作系統將分配給訪問者一個令牌,該令牌包含(用戶SID和組SID、特權、其他)。

Security Descriptor:安全描述符,被訪問者持有安全描述符。
訪問者持有令牌,到被訪問對象的門前叩門(用戶雙擊) , 操作系統得到叩門的事件后,就將用戶的訪問令牌中的信息與對象的安全描述 (AES) 中的訪問控制項進行比較。如果符合被訪問對象安全描述,操作系統就同意訪問者對被訪問對象進行相應的操作(刪除 、添加、移動、改名等)。



Authorization Rules:授權規則
AccessRule:訪問規則

Access Token-訪問令牌


SD:Security Descriptors 安全描述符:
LSA:Local Security Authority 計算機上本地安全機構
SID:Security Identifier 安全標識符。本地帳戶或組的 SID 由計算機上本地安全機構 (LSA) 生成,並與其他帳戶信息一起存儲在注冊表的安全區域中。 域帳戶或組的 SID 由域安全機構生成,並作為 User 或 Group 對象的屬性存儲在 Active Directory 域服務中。
ACL :Access Control List 訪問控制列表(DACL+SACL)
DACL:Discretionary Access Control List
SACL:System Access Control List
ACE:Access Control Entry 訪問控制項

AES:Access Control Entries 訪問控制項

SDDL:Security Descriptor Definition Language 安全描述符定義語言

SAM:Security Account Manager安全賬戶管理
identifier authority:標志符的頒發機構
security principal:安全主體

 

 
Windows NT

新技術視窗操作系統 wind10 也叫NT10
AccessControlType:訪問控制類型 ,分為Allow(允許)+deny(拒絕)
FileSystem:文件系統,分為FAT32  和NTFS ,NTFS的優勢是制裁單獨權限管理和文件加密,NTFS權限有13種。

Window Station:對應一個Logon Session。一個Window Station管理一個剪貼板(Clipboard),一個原子表(Atom Table)和一組桌面(Desktop)。也就是說通過Window Station, 把不同的帳號進行隔離,防止他們相互影響

計算機帳戶:域中賬戶  每台加入到域的計算機都有一個計算機帳戶,它們位於活動目錄中,可由管理員進行管理。
用戶帳戶:本機賬戶
安全主體(security principal):任何可通過操作系統進行身份驗證的實體,例如用戶帳戶、計算機帳戶、在用戶或計算機帳戶的安全上下文中運行的線程或進程。 每個安全主體都分配有一個唯一標識符,它將在其整個生命周期內保留。

 

C# 相應的類枚舉和訪問控制的對應




1、AccessControlSections 枚舉 對應 訪問控制的ACL

 

 2、AccessControlModification 枚舉 枚舉 對應 訪問控制的ACL的增加和刪除的操作

 

 

 

 

3、FileSystemAccessRule類對應 訪問控制的ACE

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM