发布新日志

  • Windows访问控制链表

    2009-02-25 10:12:29

    [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对应的帐户名称。有两个助手函数,BuildTrusteeWithSidBuildTrusteeWithName,可以用SID或名字来初始化一个TRUSTEE结构。BuildTrusteeWithObjectsAndSidBuildTrusteeWithObjectsAndName允许你使用一个对象指定的ACE信息来初始化一个TRUSTEE结构体。其他3个助手函数,GetTrusteeFrormGetTrusteeNameGetTrusteeType,返回TRUSTEE结构各成员的值。
    Window XP/2000
    TRUSTEEptstrName成员可以是一个指向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上的文件或目录系统

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

    命名管道和匿名管道

    GetSecurityInfo, SetSecurityInfo

    控制台屏幕缓冲区

    Not supported.

    进程和线程

    GetSecurityInfo, SetSecurityInfo

    文件映射对象

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

    Access tokens

    SetKernelObjectSecurity, GetKernelObjectSecurity

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

    GetSecurityInfo, SetSecurityInfo

    注册表键

    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_CONTROLSYNCHRONIZE 标准访问权限和FILE_READ_DATAFILE_READ_EAFILE_READ_ATTRIBUTES对象指定访问权限。其他类型对象映射GENERIC_READ位到与类型对象适应的一些访问权限。

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

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

    常量

    解释

    GENERIC_ALL

    读、写和执行访问

    GENERIC_EXECUTE

    执行

    GENERIC_READ

    GENERIC_WRITE

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

    查看(1389) 评论(0) 收藏 分享 管理

数据统计

  • 访问量: 21415
  • 日志数: 14
  • 文件数: 1
  • 书签数: 8
  • 建立时间: 2008-11-01
  • 更新时间: 2009-02-25

RSS订阅

Open Toolbar