DACL&SACL&ACE

来源:互联网 发布:mac版cad破解安装教程 编辑:程序博客网 时间:2024/04/29 16:53
任意访问控制列表( Discretionary ACL )、系统访问控制列表( System ACL )。任意访问控制列表包含了用户和组的列表,以及相应的权限,允许或拒绝。每一个用户或组在任意访问控制列表中都有特殊的权限。而系统访问控制列表是为审核服务的,包含了对象被访问的时间
他们都是在sd中的!
什么是sd呢?先来看看安全对象吧
安全对象Securable Object是拥有SD的Windows的对象。
所有的被命名的Windows的对象都是安全对象。一些没有命名的对象是安全对象,如:进程和线程,也有安全描述符SD。安全对象Securable Object是拥有SD的Windows的对象。
在Windows系统中,其是用一个安全描述符(Security Descriptors)的结构来保存其权限的设置信息,简称为SD,其在Windows SDK中的结构名是“SECURITY_DESCRIPTOR”,这是包括了安全设置信息的结构体。一个安全描述符包含以下信息:
? 一个安全标识符(Security identifiers),其标识了该信息是哪个对象的,也就是用于记录安全对象的ID。简称为:SID。 
? 一个DACL(Discretionary Access Control List),其指出了允许和拒绝某用户或用户组的存取控制列表。 当一个进程需要访问安全对象,系统就会检查DACL来决定进程的访问权。如果一个对象没有DACL,那么就是说这个对象是任何人都可以拥有完全的访问权限。 
? 一个SACL(System Access Control List),其指出了在该对象上的一组存取方式(如,读、写、运行等)的存取控制权限细节的列表。 
? 还有其自身的一些控制位。
DACL和SACL构成了整个存取控制列表Access Control List,简称ACL,ACL中的每一项,我们叫做ACE(Access Control Entry),ACL中的每一个ACE
Windows访问控制链表

访问控制链表(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 GenerationSACL访问权限。

不要尝试直接使用一个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对应的帐户名称。有两个助手函数,BuildTrusteeWithSidBuildTrusteeWithName,可以用SID或名字来初始化一个TRUSTEE结构。BuildTrusteeWithObjectsAndSidBuildTrusteeWithObjectsAndName允许你使用一个对象指定的ACE信息来初始化一个TRUSTEE结构体。其他3个助手函数,GetTrusteeFrormGetTrusteeNameGetTrusteeType,返回TRUSTEE结构各成员的值。
Window XP/2000TRUSTEEptstrName成员可以是一个指向OBJECTS_AND_NAMEOBJECTS_AND_SID结构体的指针。这些结构体说明对象指定ACE的信息,除了托管的名字和SID之外。这可以象SetEntriesInAclGetExplicitEntriesFromAcl这样的函数存储对象指定ACE的信息到EXPLICIT_ACCESS结构体的Trustee成员中。

TRUSTEE结构体:

typedef struct _TRUSTEE {
  PTRUSTEE pMultipleTrustee;
  MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
  TRUSTEE_FORM TrusteeForm;
  TRUSTEE_TYPE TrusteeType;
  LPTSTR ptstrName;

} TRUSTEE, *PTRUSTEE;

访问权限和访问掩码

一个访问权限是一个标志位对应到一个特殊操作集合,这个集合表示线程可以在安全对象上执行的操作。例如:注册表键KEY_SET_VALUE访问权限,对应到线程在这个键下设置的值的能力。如果线程想在一个对象执行一个操作,但没有必要的访问权限,系统不执行操作。

一个访问掩码是一个32位的值,它对应到对象支持的访问权限。所有的Windows NT/2000/XP安全对象使用一个Windows访问掩码格式,这个格式包含下面的访问权限位:

1. 通用访问权限

2. 标准访问权限

3.  SACL访问权限

4. 目录服务访问权限

当一个线程想打开一个对象的句柄,线程通常指定一个访问掩码来请求一系列的访问权限。例如,需要设置和查询注册表键的程序可以使用一个访问掩码来请求KEY_SET_VALUEKEY_QUERY_VALUE访问权限来打开该键。

下面表显示了操作每种类型安全对象的信息:

对象类型

安全描述符号函数

NTFS上的文件或目录系统

GetNamedSecurityInfoSetNamedSecurityInfoGetSecurityInfoSetSecurityInfo

命名管道和匿名管道

GetSecurityInfoSetSecurityInfo

控制台屏幕缓冲区

Not supported.

进程和线程

GetSecurityInfoSetSecurityInfo

文件映射对象

GetNamedSecurityInfoSetNamedSecurityInfoGetSecurityInfoSetSecurityInfo

Access tokens

SetKernelObjectSecurityGetKernelObjectSecurity

Windows管理对象 (windows工作站和桌面)

GetSecurityInfoSetSecurityInfo

注册表键

GetNamedSecurityInfoSetNamedSecurityInfoGetSecurityInfoSetSecurityInfo

Windows服务

GetNamedSecurityInfoSetNamedSecurityInfoGetSecurityInfoSetSecurityInfo

本地和远程打印机

GetNamedSecurityInfoSetNamedSecurityInfoGetSecurityInfoSetSecurityInfo

网络共享

GetNamedSecurityInfoSetNamedSecurityInfoGetSecurityInfoSetSecurityInfo

进程间同步对象 (事件, mutexes, semaphores, and waitable timers)

GetNamedSecurityInfoSetNamedSecurityInfoGetSecurityInfoSetSecurityInfo

作业对象

GetNamedSecurityInfoSetNamedSecurityInfoGetSecurityInfoSetSecurityInfo



通用访问权限


安全对象使用Windows访问掩码格式,四个高位说明通用访问权限。每个安全对象类型映射到这些位到一系列标准和对象特殊访问权限。例如:一个Window文件对象映射GENERIC_READ位到READ_CONTROLSYNCHRONIZE标准访问权限和FILE_READ_DATAFILE_READ_EAFILE_READ_ATTRIBUTES对象指定访问权限。其他类型对象映射GENERIC_READ位到与类型对象适应的一些访问权限。

你可以在你打开一个对象句柄的时候使用通用访问权限来指定需要的访问类型;这通常比指定所有对应标准和特指权限要简单。

下表显示了通用访问权限定义的常量。

常量

解释

GENERIC_ALL

读、写和执行访问

GENERIC_EXECUTE

执行

GENERIC_READ

GENERIC_WRITE

应用程序定义的私有安全访问对象能使用通用访问权限。

安全描述符


安全描述符包含了安全对象相关的安全信息。安全描述父由一个SECURITY_DESCRIPTOR结构体组成,它关联到一个安全对象。一个安全描述符包含下面的安全信息:

1.  拥有者或基本组对象的安全IDSIDs

2.  DACL指定特殊用户或组的允许或拒绝的访问权限

3.  SACL指定对象通用评估记录尝试的访问类型

4.  一个控制位集合,说明安全描述符的含义或它每个成员

程序不需要直接操作安全描述符的内容。Windows API提供设置和返回安全描述符号的函数。另外,有用来创建和初始化一个新对象安全描述符号的函数。

Windows NT 3.51和更早的版本,Windows ME/98/95:参见:低级访问控制。

工作在活动目录对象上安全描述符程序能使用Windows的安全函数或ADSI(活动目录服务接口)提供的安全接口。更多ADSI的信息参见:访问控制如何在活动目录中工作?

DACL是怎么控制访问对象的?

当一个线程想访问一个安全对象时候,系统要么允许访问,要拒绝访问。如果对象没有DACL,系统赋予访问权限,否则系统查找DACL中的该线程的ACE。每个对象DACL中的ACE指定托管的访问允许或拒绝的访问权限,它可以是一个用户帐户、组帐户或登录会话。

系统比较ACE中的托管和线程访问标记的托管标示。一个访问标记包含SID来说明用户和用户输入的组帐户。一个标记也包含一个登录SID,来表示当前的登录会话。在访问检查期间,系统忽略不可用的组SID。更多可用不可用信息以及拒绝SID,见访问标记中的SID属性。

通常,系统使用现成饿基本访问标记来请求访问。然而,如果现成正在扮演其他用户,系统使用现成的扮演标记。

系统家产序列中的每个ACE,直到下面的情况发生:

1.  一个显式拒绝任何与线程访问标记中列出托管不同的访问ACE出现

2.  线程访问标记中列出的一个或多个允许访问的ACE出现,这个标记显式赋予所有权限。

3.  所有的ACE都检查过,并且至少一个访问权限没有显式的允许,这种情况下暗示拒绝。

下图描述一个DACL对象允许访问一个线程而拒绝访

问另一个线程。


对于线程
A,系统读ACE1并且立即拒绝访问,因为访问拒绝ACE应用到线程访问标记中的用户。这种情况下,系统并没有检查ACE23。对于线程BACE1没有应用,因此系统处理ACE2,其允许写操作,并且ACE3允许读和执行操作。

因为系统在请求访问并显式允许或拒绝的时候停止检查,DACL中的ACE顺序非常重要。注意,如果ACE顺序与例子中的不同,系统可能分配访问权限给A。对于系统对象,操作系统定义一个首选的DACLACE的顺序。

原创粉丝点击