说明
系统也提供回报尝试存取安全对象结果(成功及不成功)的能力。称为稽核。稽核事件被记录到事件日志中。任何被允许或拒绝给予对象存取权利的事件也会被稽核。尽管稽核与存取控制的情形相似,但它是单独且不常使用的特色。大部份您所学到关于存取控制的部份皆会应用到稽核,所以最好现在就了解其功能。(本章稍后的〈稽核及SACL〉一节中将讨论稽核的内容)。
安全描述项(Security Descriptor)
如前所述,系统中每个安全对象类型的安全使用任何与其他安全对象相同的方式大量被储存及运用。这是因为在Windows 2000中的所有存取控制皆使用一个称为 安全描述项 的资料结构实作。 安全描述项 维护了一个对象的重要安全资讯,例如它的拥有者,以及和系统使用者相关的权利清单。每个在Windows中的安全对象都有一个安全描述项。图10-1显示安全描述项的样子,表10-3则叙述了元件的内容。您将会发现您常使用到与拥有者及安全描述项之判别存取控制清单(Discretionary Access Control List,DACL)元件相关的部份。
| 图10-1 安全描述项 |
之前曾经讨论过,从一个Windows中的对象安全类型到另一个类型的操作,有很多相同的程序。典型的情形下,安全描述项经由您的软件产生,然后传递到建立对象的系统函数中,并分派安全给对象。
| 表10-3 安全描述项的元件 |
| 元件 | 叙述 |
|---|---|
| Revision | 指出安全描述项结构之修订等级值。 |
| Control | 指出安全描述项之内容意义的一组标记。 |
| Owner | 对象拥有者的安全识别码(SID)。对象拥有者有特殊的权利-即拥有者可以一直读取及修改对象的安全性,不管是否有明确指派DACL中叙述的权利。所有安全对象都有一位拥有者(关于SIDs的讨论,请参阅 第九章 )。 |
| Group | 主要群组对象的SID。Windows 2000在存取控制上没有利用到主要的群组。因为拥有维护资讯,使得Microsoft Windows NT可被用来当作操作系统的文件服务器平台。 |
| DACL | 判别存取控制清单(Discretionary Access Control List,DACL)是叙述对象所有存取权利的存取控制清单。这个清单定义了谁可以或不可以在对象上执行安全动作。假如没有目前的DACL,则每个人都拥有对该对象的所有存取权利。假如当前的DACL是空的,则除了拥有者外,没有人拥有对该对象的存取权利。 |
| SACL | 系统存取控制清单(Sysem Access Control List,SACL)是与以稽核为目的使用者相关的存取权利清单。SACL不会影响对对象的存取情形,但它会将对对象的存取记录到事件日志中。有关此部份的更多资讯,请参阅本章稍后的〈 稽核及SACL 〉一节。 |
您也可以撷取现有安全描述项对象的副本,使用系统函数读取或修改安全描述项,然后再使用系统函数设定安全描述项的原始对象。
说明
一旦您从对象撷取一份副本后,使用系统函数修改安全描述项的方式似乎有效率偏低的情形。您可以想想为何不用您的软件直接存取资料的方法-答案是,在您的处理程序内存中已有一份资料结构的副本。尽管您可以用这种方法存取资料,但最好不要,因为安全描述项预期会被视为一个「不透明」结构而存取,以使您的程序代码在未来的Windows版本上仍然能正确地运作。
ACLs、ACEs及DACL
ACL是多个连续的可变长度结构清单,称为 存取控制项目(Access Control Entries) ,或ACEs。每个ACE皆指出与对象相关之存取权利及信任成员的SID。
DACL及SACL皆是ACLs。DACL被用在对象的存取控制上,它的ACEs内容指出谁被允许或不被允许存取对象。SACL则用在存取稽核的部份。DACL及SACL的结构相同,而且操作它们的程序代码也以同样的方式实作。我将在本章稍后的〈稽核及SACL〉一节中讨论SACL,此处的许多讨论则着重在应用SACL的DACL部份。
当应用程序企图存取安全对象时,系统浏览对象的DACL会寻找ACEs,并指出在应用程序执行之下的使用者信任成员帐户或使用者为其成员的群组信任成员帐户。假如找到符合的ACE,系统便会检查ACE授予或否决应用程序要求执行的存取权利。稍后会对存取检查的部份做更详细的讨论。首先让我们看表10-4中叙述的六种ACE类型。其中,允许存取及拒绝存取的ACE显然是最常用的。
说明
除了目录服务对象之外,Object-type ACEs不与任何系统中的安全对象一起使用。然而,object-type ACEs可以与您自己的私人对象一起使用。此处主要集中在一般的ACE类型上,但本章中仍会对object-type ACEs做简短的讨论。
| 表10-4 Windows 2000中的ACE类型 |
| ACE类型(系统使用的值) | 叙述 |
|---|---|
| 允许存取(ACCESS_ALLOWED_ACE_TYPE) | 定义一组允许指定信任成员帐户的存取权利 |
| 拒绝存取(ACCESS_DENIED_ACE_TYPE | 定义一组拒绝给指定信任成员帐户的存 )取权利 |
| 系统稽核(SYSTEM_AUDIT_ACE_TYPE) | 定义一个假如经由指定的信任成员帐户执行时,将产生稽核报告的安全动作 |
| 允许存取的对象(ACCESS_ALLOWED_OBJECT_ACE_TYPE) | 定义一个允许对象、对象的子对象或属性之指定信任成员帐户的个别存取权利 (通常与目录服务对象一起使用) |
| 拒绝存取的对象(ACCESS_DENIED_OBJECT_ACE_TYPE) | 定义一个拒绝给予对象、对象的子对象或属性之指定信任成员帐户的个别存取权利(通常与目录服务对象一起使用) |
| 系统稽核对象(SYSTEM_AUDIT_OBJECT_ACE_TYPE) | 定义一个假如经由对象、对象的子对象或属性之指定信任成员帐户执行时,产生稽核报告的个别存取权利(通常与目录服务对象一起使用) |
允许及拒绝存取之标准ACEs相当简单。表10-5显示了标准ACE的内容。
| 表10-5 标准(非对象)ACE的内容 |
| ACE元件 | 叙述 |
|---|---|
| ACE类型 | 一个以数值表示的值,指出ACE的类型(表10-4显示了Windows 2000中的ACE类型)。 |
| ACE标记 | 指出ACEs的继承规则与SACL之ACEs的稽核规则(有关可用的继承标记清单,请参阅 表10-11 )。 |
| 存取遮罩 | 一个32位元的值,指出ACE叙述的存取权利。 |
| 信任成员的SID | 指出与ACE的存取权利相关的信任成员使用者、群组或电脑帐户。 |
您在本章稍早已学习到系统定义的叁种存取权利类型:即标准、特殊及通用权利。属于ACE一部份的存取遮罩是个32位元的值,每个对象的可能存取权利都与一个位元相对应。
说明
因为每个存取权利皆对应到ACE存取对应中的单一位元,所以一个个别的ACE可被用来指出信任成员帐户的多重存取权利。
存取遮罩被每个Windows系统支援的叁种存取类型划分成数个区段。图10-2即显示了这些位元及其用途。
| 图10-2 存取遮罩格式 |
ACEs指出了存在于父系—子系关系层级中的系统及私人对象之继承的规则。当我们开始有纲领的讨论ACLs操作时,我将会涵盖更详细的继承内容;然而,现在了解被允许的继承类型是有帮助的。以下的列表说明了这些可能性:
- 一个包含ACE的父对象不会影响到上层,但会影响子对象。相反地,ACE对父对象及子对象的影响是有可能的。
- 拥有ACE的父系会影响子对象,但不会继续让Grandchild、Great-grandchild等对象继承。您也可以指定一个无限继承的ACE。
- 一个让子(或Grandchild)对象继承的ACE,同时也是一个能影响容器对象的容器,或者它可以被设定成只影响非容器的子对象。
- ACE可以被定义为只被同为容器的子对象继承,或者被任何子对象继承。
这些决策方式的每一个都可以组成ACE,不管ACE的其他继承属性。所以如您所见,ACE可以用几种不同的方法继承。
