再聊Windows的访问控制(Access Control)(三)

        在众多的可保护对象中,有一些是可以有父对象的,包括目录服务对象(Directory Service Objects)、文件(Files)、目录(Directories)、注册表键(Registry Keys)以及桌面(Desktops)等。当这些对象被创建时,系统会尝试将其父对象(如果存在)安全描述符中可继承的ACE合并到新对象的安全描述符中。但最终新建对象能不能成功继承这些ACE还要取决于一些其他因素,除了父对象安全描述符中是否存在可继承的ACE,还要看父对象ACE设置了什么继承标志,子对象是容器对象还是非容器对象,以及子对象是否设置了SE_DACL_PROTECED、SE_SACL_PROTECTED保护措施等。

        ACE的继承是一个稍显复杂的话题,继承的过程受到多个因素的影响,下面粗略地做一下介绍。

一、可继承ACE的自动传播

        Windows API提供了用户操作安全描述符的函数。GetSecurityInfo()和GetNamedSecurityInfo()用于获取一个安全描述符的指针,也可用于获取安全描述符某个组成部分的指针,比如DACL、SACL、所有者SID、主组SID,而SetSecurityInfo()和SetNamedSecurityInfo()用来设置安全描述符各组成部分的信息。这两个设置安全描述符信息的函数在设置的同时会执行ACE的自动(向下)传播机制,比如,用这两个函数之一对NTFS文件系统中的某个文件夹的安全描述符加入了一个可被继承的ACE,此过程中系统会视具体情况将该ACE传播到下面的子文件夹或文件,这就是可继承ACE的自动传播机制。(多说一句,GetSecurityInfo()和SetSecurityInfo()用于使用句柄标识的对象,GetNamedSecurityInfo()和SetNamedSecurityInfo()用于使用名称标识的对象。)

        注意,可继承ACE的传播可能导致子对象安全标识符的语义发生改变,因为自动传播机制有以下规则:

  • 当一个没有DACL的对象继承一个ACE,这个对象就拥有了一个只包含继承ACE的DACL。
  • 当一个有空DACL的对象继承一个ACE,这个对象也会有一个只包含继承ACE的DACL。
  • 当从父对象移除一个可继承ACE时,自动传播机制也会从下级所有继承该ACE的子对象中将其移除,对于只有这一个ACE的子对象来说,结果就剩下一个空的DACL。

        这就会产生一个问题,一个原来没有DACL的子对象在经过继承、移除ACE的过程后变成一个有空DACL的对象,原来是允许任何人完全访问的,现在变成不允许任何人的任何访问了,语义产生了一个大转折。要确保没有DACL的对象不受自动传播机制的影响,应在其安全描述符中设置SE_DACL_PROTECTED标志。也可以用这种方式保护SACL,但无法阻止SYSTEM_RESOURCE_ATTRIBUTE_ACE和SYSTEM_SCOPED_POLICY_ID_ACE的继承。

        至此我们描述了ACE继承的两种机制,新建对象时以及父对象的ACE被改动时。当这些机制使ACE作用到子对象时,还会收到ACE中继承标志位的设置以及子对象类型的影响。

二、ACE中的继承标志

        首先,系统在将继承的ACE放入子对象的ACL中时仍会遵守首选的排序规则(见上一篇描述),而且所有继承的ACE都会被设置INHERITED_ACE标志,以标明该ACE是从上级对象中继承来的。

        ACE中的ACE_HEADER结构包含一组与继承相关的标志,放在AceFlags成员中,可以控制ACE的继承过程以及被继承后在目标对象上的实际效果。

下面是ACE_HEADER中与继承相关的标志。

标志值说明
CONTAINER_INHERIT_ACE

如果设置了该标志,下级容器子对象将该ACE继承为“有效ACE(Effective ACE)"。

如果没有设置NO_PROPAGATE_INHERIT_ACE,那么该ACE被继承后仍是可继承的。

OBJECT_INHERIT_ACE

如果设置了该标志,下级非容器子对象将该ACE继承为”有效ACE“。

如果没有设置NO_PROPAGATE_INHERIT_ACE,下级容器子对象将该ACE继承为”只继承ACE(Inherit-only ACE)“。

INHERIT_ONLY_ACE

”只继承ACE“标志。此标志被设置说明该ACE是一个”只继承ACE“,它不对可保护对象起到实际的访问控制作用。

如果不设置此标志,该ACE就是一个”有效ACE“,它对可保护对象实施访问控制。

NO_PROPAGATE_INHERITANCE如果设置了该标志,子对象继承该ACE的同时会清除OBJECT_INHERIT_ACE和CONTAINNER_INHERIT_ACE标志,从而防止更下一级对象再继承该ACE,即如果设置了该标志,该ACE最多只被继承一级。
INHERITED_ACE

标明该ACE是从上级对象继承而来。当系统将此ACE传播到下级对象时会设置该标志。

        从这些标志的逻辑关系我们可以看出所谓可继承的ACE就是被设置了CONTAINER_INHERIT_ACE和/或OBJECT_INHERIT_ACE标志的ACE。子容器对象和非容器对象根据这两个标志的不同组合会呈现不同的继承效果,下表列出这两个标志的组合以及对继承的影响:

父对象ACE继承标志组合在子对象中的效果
只设置OBJECT_INHERIT_ACE

对于非容器子对象:将该ACE继承为”有效ACE“

对于容器子对象:如果NO_PROPAGATE_INHERIT_ACE被设置了,则什么也不继承,否则继承为一个”只继承ACE“

只设置CONTAINER_INHERIT_ACE

对于非容器子对象:无效果

对于容器子对象:将该ACE继承为”有效ACE“。如果NO_PROPAGATE_INHERIT_ACE被设置了,那么该继承的ACE不可再被继承,否则仍是可继承的。

两者都设置了

对于非容器子对象:将此ACE继承为”有效ACE".

对于容器子对象:将此ACE继承为”有效ACE".

如果NO_PROPAGATE_INHERIT_ACE被设置了,那么该继承的ACE不可再被继承,否则仍是可继承的。

两者都未设置对容器子对象及非容器子对象均无影响

        表中有两个术语:“有效ACE”和“只继承ACE”。有效ACE是可以启动实际的访问控制作用的“真实”ACE。如果子对象将父对象的可继承ACE继承为有效ACE,ACE中包含的通用权限(Generic Rights)会被映射成与该子对象类型匹配的特定权限(Specific Rights)。比如对于文件对象,通用权限GENERIC_READ被映射到文件特定权限FILE_GENERIC_READ(含FILE_READ_ATTRIBUTES,FILE_READ_DATA,FILE_READ_EA,STANDARD_RIGHTS_READ,SYNCHRONIZE)。除此之外,ACE中的通用SID(比如CREATOR_OWNER)会被映射到具体的受信任实体的SID。

        “只继承ACE"可被理解成占位用的”虚“ACE,它没有访问控制作用。当子对象将父对象的可继承ACE继承为”只继承ACE“,ACE中包含的通用信息不会做具体化映射,而是保留原样,当更下一级的对象将其继承有效ACE时再视具体情况做具体映射。

        当某容器对象继承来自父对象的ACE时,如果既将其继承为自身的有效ACE,有希望其被下级子对象继续继承,在ACE含有通用信息的情况下,该容器对象会继承两条ACE,一条作为有效ACE作用于容器对象自身,其中的通用信息被具体化,另一条为只继承ACE,保留通用信息不变,用于支持下级对象继续继承。

        上一篇提到了在对象特定ACE中含有两个GUID,其中的InheritedObjectType可以在目录服务中规定可继承该ACE的子对象的类型。

        现在已经介绍了与继承相关的话题,下面可以看一下安全描述符的编辑器了。

三、访问控制编辑器(Access Control Editor)

        访问控制编辑器是系统提供的一套用于查看和编辑安全描述符的用户界面,主要由一组对话框组成。我们熟知的是在资源管理器中可以右键点击文件或文件夹,在属性对话框中选择“安全”页面,这是查看文件或文件夹的安全描述符的方法,至于其他可保护对象可以通过编程查看。

        访问控制编辑器包含两大部分,一个是基本安全属性页,它提供了编辑DACL中ACE的简化界面,通常它包含一个“高级”按钮,用于显示第二部分——高级安全属性页,它可以允许用户变更对象所有者,编辑SACL,以及对DACL进行更细致的编辑。以下分别是某文件夹对象的基本安全属性页和高级安全属性页:

        基本属性页包含一个DACL中受信任实体的列表,一个受保护对象支持的权限列表。当用户选择一个受信任实体时,权限列表中每个权限相邻的复选框表明该受保护对象向所选择受信任实体授权的情况。用户可通过点选或清除复选框来设置该授权。用户也可在此界面增减授权的受信任实体。

        高级安全属性页包含变更所有者功能,以及“权限”、“审核”、“有效访问”三个页面。”权限“页可对DACL进行详细的编辑,比如控制ACE的继承,也可对对象特定ACE进行编辑。在高级安全属性页中该页面总是可用的。

        ”审核“页可查看和编辑SACL。

        ”有效访问“可以查看用户、组或设备账户对该受保护对象的有效权限。通过”选择用户“,可查看所选用户或组的有效权限,如上图所示。

        对于其他不那么容易看到其安全属性的可保护对象,可通过编程显示其访问控制编辑器。CreateSecurityPage()函数可创建对象的基本安全属性页。再用PropertySheet()或PSM_ADDPAGE消息将该页加到对话框中。也可以用EditSecurity()直接显示含有基本安全属性的对话框。

        不论哪种方法,调用者都必须向函数传递一个指向ISecurityInformation接口实现代码的指针(关于接口及接口实现的理论大家可参考COM编程资料)。访问控制编辑器会调用该接口的方法获取受保护对象的访问控制信息,以及将用户的编辑成果传递到应用程序。

ISecurityInformation有以下功能:

  • 初始化属性页。应用程序事项GetObjectInformation方法,向编辑器传递SI_OBJECT_INFO结构。比如,要在基本安全属性页显示”高级“按钮,可在SI_OBJECT_INFO结构中设置SI_ADVANCED标志,要包含”审核“页,还要加SI_EDIT_AUDITED标志,要允许变更所有者,要增加SI_EDIT_OWNER标志。可以通过设置SI_OBJECT_INFO结构的pszPageTitle成员来设置基本安全属性页的标题,默认为”安全“。
  • 提供与受保护对象相关的安全信息。应用程序实现GetSecurity方法向编辑器传送受保护对象的安全描述符。编辑器调用GetAcessRights和MapGeneric方法获取对象的访问权限信息,调用GetInheritType方法获取如何继承ACE的信息。
  • 将用户编辑结果传递给应用程序。当用户点击”确定“或”应用“按钮时,编辑器调用SetSecurity()方法将经过编辑的安全描述符传递到应用程序。

        本篇大致介绍了ACE的继承,并以前面介绍的内容为基础简单介绍了访问控制编辑器,大家可以结合这些知识点规划自己电脑的资源的访问控制策略,并实际操作实施,体验一下效果。下一篇介绍一下安全描述符的文本形式——字符串表示。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值