Windows访问控制链表
上一篇 / 下一篇 2009-02-25 10:12:29 / 个人分类:Security
[From]http://www.cppblog.com/windcsn/archive/2006/10/06/13397.aspx
访问控制链表(ACL)
一个ACL是一个ACE链表。每个ACL中的ACE标示一个托管以及指定允许的访问权限、否定或托管的设计。一个对象的安全描述符号包含两种类型的ACL,一个是DACL,一个是SACL。
一个目录访问控制链表(DACL)标示允许或拒绝访问一个安全对象的托管。当一个进程常识访问一个安全对象的时候,系统检查对象的DACL中的ACE来决定是否赋予访问权限。如果对象没有DACL,系统赋予完全的访问权限,如果对象的DACL没有ACE,那么系统拒绝所有访问对象的尝试,因为DACL不允许任何访问权限。系统检查ACE序列直到找到一到多个ACE,或者直到任何请求的访问权限被否定。更多的信息参见:DACL怎么样控制一个对象的。对于创建DACL的信息,见创建一个DACL。
一个系统访问控制链表(SACL)是管理员登录尝试访问一个安全对象。每个ACE指定一个指定的托管尝试的访问类型,这个访问会导致系统产生一个安全事件日志。一个SACL中的ACE能够产生访问尝试失败或成功的时候产生评估记录,在将来的release中,一个SACL在一个未授权用户尝试访问一个对象的时候发出一个警告。更多SACL的信息参见Audit Generation和SACL访问权限。
不要尝试直接使用一个ACL来工作。为了确保ACL能够语义正确的,使用适当的函数来创建和操纵ACL。更多的信息参见:从ACL中取得信息和创建或修改一个ACL。
ACL也提供访问控制微软的Active Directory目录服务对象。活动目录服务接口(ADSI)包括创建和修改ACL内容的程序。更多信息参见:控制访问活动目录对象。
ACE
一个访问控制实体(ACE)是ACL中的一个元素。一个ACL可能包含0到多个ACE。每个ACE通过一个指定的托管来控制或监视一个对象。更多关于添加、删除、改变ACE,见修改ACL对象。
Window Me/98/95:不支持访问控制
有6种类型的ACE,三种被所有的安全对象支持,其他类型是对象特定的ACE,由目录服务对象支持。
所有ACE类型都包含下面访问控制信息:
1. 一个安全标示符号(SID)来标示ACE应用的托管
2. 一个访问掩码指定ACE控制的访问权限
3. 一个指示ACE类型的标志位
4. 一系列位标志决定是否子容器或对象可以继承ACE从基本对象到ACL附着的对象。
下表列出了三个所有安全对象支持的ACE类型:
Type | Description |
访问拒绝ACE | 用在一个DACL中拒绝到一个托管的访问权限 |
访问允许ACE | 用在一个DACL中允许到托管的访问权限 |
系统评估ACE | 用在SACL中,当托管尝试检查指定访问权限时产生一个评估记录 |
对于对象指定的ACE,参见对象指定ACE。
注意,系统警告ACE对象现在不支持。
托管
一个托管是一个用户帐户、组帐户或登录会话到一个ACE应用。每个ACL中的ACE都有一个SID来标示托管。用户帐户包含人使用的帐户或程序帐户(例如,Window服务用来登录到本地计算机的)。组帐户不能用来登录到计算机,但在ACE中非常有用,用来拒绝或允许一到多个用户帐户的访问权限。一个登录SID表示当前的登录会话用来允许和拒绝访问权限,直到用户登出。
NT4.0和后来版本中访问控制函数使用TRUSTEE结构体来表示一个托管。这个结构体能使你用一个字符串或一个SID来表示一个托管。如果你使用一个名字,从TRUSTEE结构创建ACE的函数执行SID缓冲区分配工作并且查询SID对应的帐户名称。有两个助手函数,BuildTrusteeWithSid和BuildTrusteeWithName,可以用SID或名字来初始化一个TRUSTEE结构。BuildTrusteeWithObjectsAndSid和BuildTrusteeWithObjectsAndName允许你使用一个对象指定的ACE信息来初始化一个TRUSTEE结构体。其他3个助手函数,GetTrusteeFrorm、GetTrusteeName和GetTrusteeType,返回TRUSTEE结构各成员的值。
Window XP/2000:TRUSTEE的ptstrName成员可以是一个指向OBJECTS_AND_NAME或OBJECTS_AND_SID结构体的指针。这些结构体说明对象指定ACE的信息,除了托管的名字和SID之外。这可以象SetEntriesInAcl和GetExplicitEntriesFromAcl这样的函数存储对象指定ACE的信息到EXPLICIT_ACCESS结构体的Trustee成员中。
TRUSTEE结构体:
typedef struct _TRUSTEE {
PTRUSTEEpMultipleTrustee;
MULTIPLE_TRUSTEE_OPERATIONMultipleTrusteeOperation;
TRUSTEE_FORM.TrusteeForm;
TRUSTEE_TYPETrusteeType;
LPTSTRptstrName;
} TRUSTEE, *PTRUSTEE;
访问权限和访问掩码
一个访问权限是一个标志位对应到一个特殊操作集合,这个集合表示线程可以在安全对象上执行的操作。例如:注册表键KEY_SET_VALUE访问权限,对应到线程在这个键下设置的值的能力。如果线程想在一个对象执行一个操作,但没有必要的访问权限,系统不执行操作。
一个访问掩码是一个32位的值,它对应到对象支持的访问权限。所有的Windows NT/2000/XP安全对象使用一个Windows访问掩码格式,这个格式包含下面的访问权限位:
1. 通用访问权限
2. 标准访问权限
3. SACL访问权限
4. 目录服务访问权限
当一个线程想打开一个对象的句柄,线程通常指定一个访问掩码来请求一系列的访问权限。例如,需要设置和查询注册表键的程序可以使用一个访问掩码来请求KEY_SET_VALUE和KEY_QUERY_VALUE访问权限来打开该键。
下面表显示了操作每种类型安全对象的信息:
对象类型 | 安全描述符号函数 |
NTFS上的文件或目录系统 | GetNamedSecurityInfo,SetNamedSecurityInfo,GetSecurityInfo,SetSecurityInfo |
命名管道和匿名管道 | |
控制台屏幕缓冲区 | Not supported. |
进程和线程 | |
文件映射对象 | GetNamedSecurityInfo,SetNamedSecurityInfo,GetSecurityInfo,SetSecurityInfo |
Windows管理对象 (windows工作站和桌面) | |
注册表键 | GetNamedSecurityInfo,SetNamedSecurityInfo,GetSecurityInfo,SetSecurityInfo |
Windows服务 | GetNamedSecurityInfo,SetNamedSecurityInfo,GetSecurityInfo,SetSecurityInfo |
本地和远程打印机 | GetNamedSecurityInfo,SetNamedSecurityInfo,GetSecurityInfo,SetSecurityInfo |
网络共享 | GetNamedSecurityInfo,SetNamedSecurityInfo,GetSecurityInfo,SetSecurityInfo |
进程间同步对象(事件, mutexes, semaphores, and waitable timers) | GetNamedSecurityInfo,SetNamedSecurityInfo,GetSecurityInfo,SetSecurityInfo |
作业对象 | GetNamedSecurityInfo,SetNamedSecurityInfo,GetSecurityInfo,SetSecurityInfo |
通用访问权限
安全对象使用Windows访问掩码格式,四个高位说明通用访问权限。每个安全对象类型映射到这些位到一系列标准和对象特殊访问权限。例如:一个Window文件对象映射GENERIC_READ位到READ_CONTROL和SYNCHRONIZE标准访问权限和FILE_READ_DATA、FILE_READ_EA和FILE_READ_ATTRIBUTES对象指定访问权限。其他类型对象映射GENERIC_READ位到与类型对象适应的一些访问权限。
你可以在你打开一个对象句柄的时候使用通用访问权限来指定需要的访问类型;这通常比指定所有对应标准和特指权限要简单。
下表显示了通用访问权限定义的常量。
常量 | 解释 |
GENERIC_ALL | 读、写和执行访问 |
GENERIC_EXECUTE | 执行 |
GENERIC_READ | 读 |
GENERIC_WRITE | 写 |