[Windows]Windows的存取控制模型

來源:互聯網
上載者:User

經過12月份的奮鬥,OJ的判題程式已經初具雛形了,不過安全性仍然是一個令我非常頭疼的問題,在這個問題上幾乎耗了半個月的時間。雖然還沒有找到完美的解決方案,但總算瞭解了Windows的安全性是如何工作的。下面分享一下在這方面的心得。

 

首先說一下Windows中的存取控制模型(Access Control Model),它是Windows安全性的基礎構件。存取控制模型有兩個主要的組成部分,存取權杖(Access Token)和安全性描述元(Security Descriptor),它們分別是訪問者和被訪問者擁有的東西。通過存取權杖和安全性描述元的內容,Windows可以確定持有令牌的訪問者能否訪問持有安全性描述元的對象。

 

存取權杖是與特定的Windows賬戶關聯的。當一個Windows賬戶登入的時候,系統會從內部資料庫裡讀取該賬戶的資訊,然後使用這些資訊產生一個存取權杖。在該賬戶環境下啟動的進程,都會獲得這個令牌的一個副本,進程中的線程預設持有這個令牌。線程要想去訪問某個對象,或者執行某些系統管理相關的操作時,Windows就會使用這個線程持有的令牌進行訪問檢查。

 

安全性描述元是與被訪問對象關聯的,它含有這個對象所有者的SID,以及一個存取控制清單(ACL,Access Control List),存取控制清單又包括了DACL(Discretionary Access Control List)和SACL(System Access Control List)——目前還不知道這兩個東西的確切翻譯——其中,DACL是安全性描述元中最重要的,它裡麵包含零個或多個存取控制項目(ACE,Access Control Entry),每個存取控制項目的內容描述了允許或拒絕特定賬戶對這個對象執行特定操作。至於SACL,它很少用到,主要是用於系統審計的,它的內容指定了當特定賬戶對這個對象執行特定操作時,記錄到系統日誌中。

 

好了,上面粗略地介紹了一下存取權杖和安全性描述元,可是仍然沒有講到它們兩者是如何協同工作的。要瞭解它們怎樣保障Windows的安全性,需要進入它們的內部,看看裡面有什麼。

 

存取權杖中主要含有以下的內容:
當前登入賬戶的SID,也就是與令牌關聯的賬戶的SID;
當前登入賬戶所屬的賬戶組的SID列表;
受限制的SID(Restricted SID)列表;
當前登入賬戶以及它所屬賬戶組的許可權(Privileges)列表。

 

SID(Security Identity)是Windows中每個賬戶和賬戶組都有的一個標識符,平常我們看到的Administrator,Users等賬戶或者賬戶組在Windows內部是使用SID來標識的。例如S-1-5-21-1004336348-1275210071-725345543-1003就是一個完整的SID。每個SID在同一個系統中都是唯一的。

 

再來看看安全性描述元中ACE的具體內容:
特定賬戶或者賬戶組的SID;
一個存取遮罩(Access Mask),該掩碼指定了具體的存取權限(Access Rights),也就是可以對該對象執行的操作;
一個位標記,指示了這個ACE的類型;
一組位標記,指示了安全性描述元所屬對象的子物件是否繼承這個ACE。

 

所有的可訪問對象都有三種ACE,分別是Access-denied ACE,Access-allowed ACE,System-audit ACE。Access-denied ACE用於拒絕賬戶訪問,Access-allowed ACE用於允許賬戶訪問,而System-audit ACE用於SACL中。

 

當一個線程嘗試去訪問一個對象時,系統會檢查線程持有的令牌以及被訪問對象的安全性描述元中的DACL。如果安全性描述元中不存在DACL,則系統會允許線程進行訪問。

 

如果存在DACL,系統會順序遍曆DACL中的每個ACE,檢查ACE中的SID線上程的令牌中是否存在。當滿足以下條件時,遍曆會終止:

 

某個Access-denied ACE中的SID線上程令牌中存在,而且該ACE中的許可權與線程要求的許可權相符,此時系統拒絕該線程訪問對象。
某個Access-allowed ACE中的SID線上程令牌中存在,而且該ACE中的許可權與線程要求的許可權相符,此時系統允許線程訪問對象。
所有ACE中的SID線上程令牌中均不存在,此時系統拒絕線程訪問對象。

 

是轉自MSDN的,Object對象的DACL中含有三個ACE,第一個ACE拒絕Andrew賬戶對Object進行讀取,寫入和執行操作;第二個ACE允許Group A賬戶組中的所有賬戶對Object進行寫入操作;第三個ACE允許任何賬戶對Object進行讀取和執行操作。

 

 

線程A試圖訪問Object,在遍曆DACL的時候,遇到第一個ACE,滿足上述的條件,遍曆終止,線程A被拒絕訪問Object,儘管線程A的存取權杖中含有Group A賬戶組的SID,並滿足第二個ACE。同理,第三個ACE也沒有被檢查。對於線程B的分析是一樣的,這裡就不囉嗦了。可見ACE的排列順序對線程能否訪問對象是很重要的。

 

前面在介紹存取權杖的內容時,提到一個“受限制的SID列表”,對於這個東西,我曾經迷惑了很久,始終搞不懂它是幹什麼用的。經過一些實驗之後,猜出了它的用途,儘管不一定對,這裡簡單說一下。

 

當一個存取權杖中含有受限制的SID列表時,系統在遍曆ACE的時候只會與這些受限制的SID進行匹配,而忽略令牌中其餘的SID,也就是相當於從存取權杖中刪除了其它的SID。

 

另外,還有令牌中的許可權列表,許可權與對象訪問無關,所以與安全性描述元,SID等無關。當線程執行一些管理相關的操作時,系統會檢查該線程的令牌中是否含有特定的許可權,如果有,則允許線程執行該操作,否則拒絕。要查看完整的許可權列表,可以運行gpedit.msc,然後定位到“電腦配置-Windows設定-安全設定-本地策略-使用者權利指派”。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.