【windows 访问控制】四、访问控制项ACE


 访问控制项

访问控制条目(ACE)是访问控制列表(ACL)中的元素。一个ACL可以包含零个或多个ACE。每个ACE控制或监视指定受托者(Trustees)对对象的访问。
ACE有六种类型,所有安全对象都支持其中三种。其他三种类型是目录服务对象支持的特定于对象的ACE.
所有类型的ACE都包含以下访问控制信息:
安全标识符(SID),用于标识ACE适用于的受托者
一个访问掩码(Access Mask),该掩码指定了具体的访问权限(Access Rights),也就是可以对该对象执行的操作(此掩码非常重要,后续很多漏洞会用到)
一个位标记,指示ACE类型的标志。
一组位标志,指示了安全描述符所属对象的子对象是否继承这个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标志。