Access Control

TOP

Microsoft Windows NT, Microsoft Windows 2000, Microsoft Windows XP 操作系统提供了安全功能来控制谁能够访问系统中的资源,应用程序能够调用访问控制函数来设置谁能够访问指定的资源或者控制对程序提供的资源的访问。

这篇概述描述了一种安全模型,用于诸如文件、管理功能等windows对象的访问控制,如设置系统时间或者审核用户操作。访问控制模型的主题是对 访问控制组件和他们的交互的一种高级别的描述

下面的主题描述了访问控制组件:

Access Tokens

Security Descriptors

Access-Control Lists (ACLs)

Access-Control Entries (ACEs)

Access Rights and Access Masks

Security Identifiers (SIDs)

下面是常用的访问控制任务:

How DACLs Control Access to an Object

Controlling Child Object Creation

ACEs to Control Access to an Object's Properties

Requesting Access Rights to an Object

下面的主题提供了对于访问控制任务的简单代码:

Modifying an Object's ACLs

Creating a Security Descriptor for a New Object

Controlling Child Object Creation

Enabling and Disabling Privileges

Searching for a SID in an Access Token

Finding the Owner of a File Object

Taking Object Ownership

Converting a Binary SID to String Format

Creating a DACL


Access Tokens(访问令牌)

Access Tokens是描述进程或线程安全上下文的对象。令牌中的信息包含了与进程或线程相关的用户的标志和权限。当用户登录时,系统通过对比用户密码和存在安全数据库中的信息来验证用户密码的正确性,如果密码验证通过,系统就产生一个访问令牌。代表此用户执行的每个进程都有访问令牌的一个副本。

当一个线程和某个安全对象交互或者尝试执行一个需要特权的系统任务时,系统通过安全令牌识别用户。访问令牌(Access Tokens)包含以下内容:

  • 关于用户账户的安全标识符SID
  • 用户组的SIDs
  • 识别当前登录会话的登录SID
  • 有关用户或者用户组的权限列表
  • 一个所有者SID
  • 主要组的SID
  • 当用户创建安全对象没有指定安全描述时系统用的默认DACL(访问控制列表)
  • 访问令牌的来源
  • 令牌是主令牌或者模拟(impersonation)令牌
  • 约束SIDs的可选列表
  • 当前模拟级别
  • 其他数据

    每个进程都有个主令牌来描述进程相关的用户账户的安全上下文。当进程的线程和一个安全对象交互时,系统默认的使用主令牌。此外,一个线程还能够模拟客户账户。模拟允许线程用客户的安全上下文来和安全对象进行交互。模拟客户的线程拥有主令牌和模拟令牌

    使用OpenProcessToken函数可以获取到一个进程主令牌的句柄。使用OpenThreadToken函数可以获取到线程的模拟令牌的句柄。更多西信息,请看Impersonation

    你可以使用下面的函数操作access token:

    函数描述
    AdjustTokenGroupsChanges the group information in an access token.
    AdjustTokenPrivilegesEnables or disables the privileges in an access token. It does not grant new privileges or revoke existing ones.
    CheckTokenMembershipDetermines whether a specified SID is enabled in a specified access token.
    CreateRestrictedTokenCreates a new token that is a restricted version of an existing token. The restricted token can have disabled SIDs, deleted privileges, and a list of restricted SIDs.
    DuplicateTokenCreates a new impersonation token that duplicates an existing token.
    DuplicateTokenExCreates a new primary token or impersonation token that duplicates an existing token.
    GetTokenInformationRetrieves information about a token.
    IsTokenRestrictedDetermines whether a token has a list of restricting SIDs.
    OpenProcessTokenRetrieves a handle to the primary access token for a process.
    OpenThreadTokenRetrieves a handle to the impersonation access token for a thread.
    SetThreadTokenAssigns or removes an impersonation token for a thread.
    SetTokenInformationChanges a token's owner, primary group, or default DACL.

    access token函数用下面的结构体来描述access token的组成:

    函数描述
    TOKEN_CONTROLInformation that identifies an access token.
    TOKEN_DEFAULT_DACLThe default DACL that the system uses in the security descriptors of new objects created by a thread.
    TOKEN_GROUPSSpecifies the SIDs and attributes of the group SIDs in an access token.
    TOKEN_OWNERThe default owner SID for the security descriptors of new objects.
    TOKEN_PRIMARY_GROUPThe default primary group SID for the security descriptors of new objects.
    TOKEN_PRIVILEGESThe privileges associated with an access token. Also determines whether the privileges are enabled.
    TOKEN_SOURCEThe source of an access token.
    TOKEN_STATISTICSStatistics associated with an access token.
    TOKEN_USERThe SID of the user associated with an access token.

    access token函数用下面的enum数值:

    函数描述
    TOKEN_INFORMATION_CLASSIdentifies the type of information being set or retrieved from an access token.
    TOKEN_TYPEIdentifies an access token as a primary or impersonation token.


    Security Descriptors

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

  • 所有者和对象的主要组的SIDs安全标志符
  • 用来指定个别用户或组拥有或者限制的访问权限的访问控制列表DACL
  • 用来指定尝试产生关于对象的核查记录的访问类型的SACL
  • 一组控制位,用来表示安全描述符的意义或者它的个别成员

    应用程序不能直接操作安全描述符的内容。Windows API提供了函数来设置、获取对象的安全描述符的安全信息。另外,也有函数来创建、初始化新对象的安全描述符。

    这篇概述介绍了运行在Windows NT version4.0或者更高版本的应用程序的和安全描述符相关的Windows安全函数。想兼容WindowsNT更低版本的应用程序,看看Low-Level Access Control。

    利用Active Directory对象的安全描述符的应用程序可以使用Windows安全函数或者 Active Directory Service Interfaces (ADSI)提供的安全接口。更多有关ADSI安全接口的信息,请看 Controlling Access to Active Directory Objects.


    Access-Control Lists (ACLs)

    访问控制列表时访问控制项(ACEs)的列表。ACL中的每个访问控制项标志一个受托人(turstee),指定了受托人的允许、禁止、查询的访问权限。一个安全对象的安全描述符包含两个ACLs:DACLs和SACLs。

    DACL (discretionary access-control list) 标志受托者是允许或者被禁止访问一个安全对象。当一个进程尝试访问某个安全对象时,系统检查对象的DACL中的访问控制项(ACEs)来决定是否允许进程访问该对象。如果对象没有DACL,系统不允许任何进程访问。如果对象的DACL没有访问控制项(ACEs),系统禁止所有访问对象的尝试,因为对象的DACL没有允许人任何访问权限。系统检查按序检查ACEs直到它找到一个或者多个ACEs允许所有请求访问权限,或者直到所有请求访问都被否决。更多信息,请看How DACLs Control Access to an Object.

    SACL (system access-control list (SACL))系统访问控制列表使管理员登录尝试访问某个安全对象。每个ACE指定特定的委托人的访问尝试的类型,这使系统在安全事件日志中产生了一个记录。当访问尝试失败、成功或者都有,SACL中的一个ACE能够产生查询记录。在将来的发行版中,一个SACL还将增加一个警报,当非认证用户试图获取一个对象的访问时。有关SACLs更多信息,请看Audit Generation 和 SACL Access Right

    不要尝试直接操作ACL的内容。确认ACLs语义正确,用适当的windows函数来创建和操作ACLs。更多信息,请看Getting Information from an ACL and Creating or Modifying an ACL.

    ACLs同样提供了Active Directory objects的访问控制。 Active Directory Service Interfaces (ADSI) 包含了运行时创建和修改ACLs的内容的接口。参考ADSI文档的Access Control块获取这些运行时的更多信息。


    Access-Control Entries (ACEs)

    一个访问控制项(ACE)是访问控制列表(ACL)的一个元素。一个ACL可以有零个或多个ACEs。每个ACE控制或监控指定委托人对一个对象的访问。更多有关对象ACL中增加、移动、修改ACE的信息,请看Modifying an Object's ACLs.

    Windows NT/Windows 2000/Windows XP Windows NT/Windows 2000/Windows XP 目前支持6种类型的ACE。3中类型ACE支持所有的安全对象。另外,三种类型ACE支持directory service objects。

    所有类型的ACE包含下面的访问控制信息:

  • 用于标识该ACE所应用到委托人的安全标识符(SID)
  • 用来指定ACE控制的访问权限的访问标识。
  • 指定ACE类型的标识。
  • 一个为标志集,用来决定子容器或对象是否能够继承父对象附属的ACL中的ACE。

    下面的表格列表是三种支持所有对象的ACE类型:

    类型描述
    Access-denied ACE用在DACL中,禁止委托人的访问权限
    Access-allowed ACE用在DACL中,允许委托人的访问权限
    System-audit ACE用在SACL中,当委托人尝试使用指定的访问权限时,产生一个核查记录


    Access Rights and Access Masks

    ...


    Security Identifiers (SIDs)

    SID时一个长度可变的唯一的值,用来识别一个委托人。每个账户有一个由专家发布的SID值,如Windows域名控制器,SID保存在安全数据库中。每当一个用户登录时,系统获取从数据库中获取用户的SID,放到用户的访问令牌(access token)中。在用户后来与Windows安全交互中,系统用用户的访问令牌中的SID来识别用户。当一个SID被用作一个用户或组的唯一标识时,就不能再用作其他用户或组的标识了。

    Windows安全在下面的安全元素中使用SID:

  • 在安全描述符(security descriptors)中用来标识对象的所有者和基本组
  • 在ACE中,标识委托人,谁的访问允许、拒绝、查询。
  • 在访问令牌中(access tokens),标识用户和用户所在组。

    除了分配给特定的用户和组的唯一创建的、 特定于域的 Sid,还有些常用SID标志通用组和一般用户。比如,这个常用SID,Everyone and World,标志包含所有用户的组。

    大部分应用程序从来不需要使用SID,比如,在Windows NT version4.0 和以后的版本中,安全函数允许你用用户名而不是SID标志用户或组,在ACL中获取和设置ACE。因为常用SID的名字会改变,你将用Windows函数从预定义的常量中创建SID,而不是用常用SID的名字。举例,U.S. English 版的Windows NT/Windows 2000/Windows XP,有个名字叫 "BUILTIN\Administrators"的常用SID,他可能在不同的国家系统版本中有不同的名字。关于创建常用SID的代码,看看 Searching for a SID in an Access Token.

    如果你需要使用SID,不要直接操作他们,你可以使用下面的函数。

    函数描述
    AllocateAndInitializeSid 以指定数目的次级机构分配初始化一个SID
    ConvertSidToStringSid将SID转换成字符串格式,便于稳定显示,存储,传输
    ConvertStringSidToSid 将字符串格式SID转换成可用的有效SID
    CopySid 复制源SID到一个缓冲区
    EqualPrefixSid 。。。
    EqualSid 。。。
    FreeSid 。。。
    GetLengthSid 。。。
    GetSidIdentifierAuthority 。。。
    GetSidLengthRequired 。。。
    GetSidSubAuthority 。。。
    GetSidSubAuthorityCount 。。。
    InitializeSid 。。。
    IsValidSid 。。。
    LookupAccountName 。。。
    LookupAccountSid 。。。


    翻译:Angelxf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值