【windows 訪問控制】四、訪問控制項ACE


 訪問控制項

 

 

 

具體內容 : https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ifs/access-control-entry

 

訪問控制條目(ACE)是訪問控制列表(ACL)中的元素。一個ACL可以包含零個或多個ACE。每個ACE控制或監視指定受托者(Trustees)對對象的訪問。
ACE有六種類型,所有安全對象都支持其中三種。其他三種類型是目錄服務對象支持的特定於對象的ACE.
所有類型的ACE都包含以下訪問控制信息:

  • 安全標識符(SID),用於標識ACE適用於的受托者
  • 一個訪問掩碼(Access Mask),該掩碼指定了具體的訪問權限(Access Rights),也就是可以對該對象執行的操作(此掩碼非常重要,后續很多漏洞會用到)
  • 一個位標記,指示ACE類型的標志。拒絕(deny)還是允許(allow)
  • 一組位標志,指示了安全描述符所屬對象的子對象是否繼承這個ACE。訪問控制項


 

 DACL中的ACE順序  

當進程嘗試訪問安全對象時,系統逐步瀏覽該對象的任意訪問控制列表(DACL)中的訪問控制項(ACE),直到找到允許或拒絕所請求訪問的ACE。 DACL允許用戶的訪問權限可能會根據DACL中ACE的順序而有所不同。因此,Windows XP操作系統在安全對象的DACL中為ACE定義了首選順序。首選順序提供了一個簡單的框架,可確保拒絕訪問的ACE實際上拒絕訪問。上一節已經對該順序有過介紹。
  對於Windows Server 2003和Windows XP,引入特定於對象的ACE和自動繼承會使得ACE的正確順序變得復雜。
以下步驟描述了首選順序:
1、對於繼承的ACE的每個級別,將拒絕訪問的ACE放置在允許訪問的ACE之前。
2、另外,並不是ACL中需要所有ACE類型
3、將所有顯式ACE(即手動設置的ACE)放在一個組中,然后放在任何繼承的ACE之前。
4、在顯式ACE組中,拒絕訪問的ACE放置在允許訪問的ACE之前。
5、繼承的ACE按照繼承的順序放置。從子對象的父對象繼承的ACE首先出現,然后是從祖父母那里繼承的ACE,依此類推。

ACE繼承

    對象的ACL可以包含從其父容器繼承的ACE。例如,注冊表子項可以從注冊表層次結構中位於其上方的項繼承ACE。同樣,NTFS文件系統中的文件可以從包含該文件的目錄繼承ACE。
    ACE的ACE_HEADER結構(該結構見本節最后一小節)包含一組繼承標志,這些繼承標志控制ACE繼承以及ACE對它所連接的對象的影響。系統根據ACE繼承規則解釋繼承標志和其他繼承信息。
    這些規則通過以下功能得到增強:
    1、支持自動傳播可繼承的ACE。
    2、  一個標志,用於區分繼承的ACE和直接應用於對象的ACE。
   3、 特定於對象的ACE,允許指定可以繼承ACE的子對象的類型。
   4、 通過將除SYSTEM_RESOURCE_ATTRIBUTE_ACE和SYSTEM_SCOPED_POLICY_ID_ACE之外的安全描述符的控制位中的SE_DACL_PROTECTED或SE_SACL_PROTECTED位設置來防止DACL或SACL繼承ACE的能力。

自動傳播可繼承的ACE

SetNamedSecurityInfo和SetSecurityInfo函數支持可繼承訪問控制項(ACE)的自動傳播。例如,如果使用這些功能將可繼承的ACE添加到NTFS中的目錄,則系統會將ACE適當地應用於任何現有子目錄或文件的訪問控制列表(ACL)。
直接應用的ACE優先於繼承的ACE。系統通過將直接應用的ACE放在任意訪問控制列表(DACL)中繼承的ACE之前來實現此優先級。當調用SetNamedSecurityInfo和SetSecurityInfo函數設置對象的安全信息時,系統會將當前繼承模型強加於目標對象下方層次結構中所有對象的ACL上。對於已轉換為當前繼承模型的對象,在對象的安全描述符的控制字段中設置SE_DACL_AUTO_INHERITED和SE_SACL_AUTO_INHERITED位。
當構建一個反映當前繼承模型的新安全描述符時,注意不要更改安全描述符的語義。因此,允許和拒絕ACE絕不會彼此相對移動。如果需要進行此類移動(例如,將所有非繼承的ACE放在ACL的前面),則將該ACL標記為受保護,以防止語義更改。
將繼承的ACE傳播到子對象時,系統使用以下規則:
1、如果自動繼承導致從子對象的DACL中刪除所有ACE,則子對象具有空的DACL,而不是沒有DACL。

2、如果沒有DACL的子對象繼承了ACE,則結果是帶有DACL的子對象僅包含繼承的ACE。
3、如果帶有空DACL的子對象繼承了ACE,則結果是帶有DACL的子對象僅包含繼承的ACE。
4、如果從父對象中刪除可繼承的ACE,則自動繼承將刪除子對象繼承的ACE的所有副本。
這些規則可能會產生意外結果,即將沒有DACL的對象轉換為具有空DACL的對象。沒有DACL的對象允許完全訪問,但是具有空DACL的對象不允許訪問。作為這些規則如何創建空DACL的示例,假設將可繼承的ACE添加到對象樹的根對象。自動繼承將可繼承的ACE傳播到樹中的所有對象。現在,沒有DACL的子對象具有帶有繼承的ACE的DACL。如果從根對象中刪除可繼承的ACE,則系統會自動將更改傳播到子對象。現在,沒有DACL(允許完全訪問)的子對象具有空的DACL(不允許訪問)。
為確保沒有DACL的子對象不受繼承ACE的影響,在對象的安全描述符中設置SE_DACL_PROTECTED標志。

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

方式一、

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

 

方式二、

FileSystemAccessRule ace =new FileSystemAccessRule("HP",FileSystemRights.Write,InheritanceFlags.ContainerInherit,PropagationFlags.InheritOnly,AccessControlType.Allow);
DirectorySecurity ds= substrDir1.GetAccessControl();
ds.AddAccessRule(ace);
substrDir1.SetAccessControl(ds);
 
        
"HP":表示賬戶名,也可以是IdentityReferenc類型
InheritanceFlags.ContainerInherit
:指定繼承給目錄,如果要繼承給文件和目錄請用InheritanceFlags.ObjectInherit
PropagationFlags.InheritOnly:這個是配合InheritanceFlags一起用的。構成

 


免責聲明!

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



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