Microsoft Windows NT, Microsoft Windows 2000, Microsoft Windows XP 操作系统提供了安全功能来控制谁能够访问系统中的资源,应用程序能够调用访问控制函数来设置谁能够访问指定的资源或者控制对程序提供的资源的访问。
这篇概述描述了一种安全模型,用于诸如文件、管理功能等windows对象的访问控制,如设置系统时间或者审核用户操作。访问控制模型的主题是对 访问控制组件和他们的交互的一种高级别的描述
下面的主题描述了访问控制组件:
Access Rights and Access Masks
下面是常用的访问控制任务:
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
下面的主题提供了对于访问控制任务的简单代码:
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
Converting a Binary SID to String Format
Access Tokens是描述进程或线程安全上下文的对象。令牌中的信息包含了与进程或线程相关的用户的标志和权限。当用户登录时,系统通过对比用户密码和存在安全数据库中的信息来验证用户密码的正确性,如果密码验证通过,系统就产生一个访问令牌。代表此用户执行的每个进程都有访问令牌的一个副本。
当一个线程和某个安全对象交互或者尝试执行一个需要特权的系统任务时,系统通过安全令牌识别用户。访问令牌(Access Tokens)包含以下内容:
- 关于用户账户的安全标识符SID
- 用户组的SIDs
- 识别当前登录会话的登录SID
- 有关用户或者用户组的权限列表
- 一个所有者SID
- 主要组的SID
- 当用户创建安全对象没有指定安全描述时系统用的默认DACL(访问控制列表)
- 访问令牌的来源
- 令牌是主令牌或者模拟(impersonation)令牌
- 约束SIDs的可选列表
- 当前模拟级别
- 其他数据
每个进程都有个主令牌来描述进程相关的用户账户的安全上下文。当进程的线程和一个安全对象交互时,系统默认的使用主令牌。此外,一个线程还能够模拟客户账户。模拟允许线程用客户的安全上下文来和安全对象进行交互。模拟客户的线程拥有主令牌和模拟令牌
使用OpenProcessToken函数可以获取到一个进程主令牌的句柄。使用OpenThreadToken函数可以获取到线程的模拟令牌的句柄。更多西信息,请看Impersonation
你可以使用下面的函数操作access token:
函数 描述 AdjustTokenGroups Changes the group information in an access token. AdjustTokenPrivileges Enables or disables the privileges in an access token. It does not grant new privileges or revoke existing ones. CheckTokenMembership Determines whether a specified SID is enabled in a specified access token. CreateRestrictedToken Creates 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. DuplicateToken Creates a new impersonation token that duplicates an existing token. DuplicateTokenEx Creates a new primary token or impersonation token that duplicates an existing token. GetTokenInformation Retrieves information about a token. IsTokenRestricted Determines whether a token has a list of restricting SIDs. OpenProcessToken Retrieves a handle to the primary access token for a process. OpenThreadToken Retrieves a handle to the impersonation access token for a thread. SetThreadToken Assigns or removes an impersonation token for a thread. SetTokenInformation Changes a token's owner, primary group, or default DACL. access token函数用下面的结构体来描述access token的组成:
函数 描述 TOKEN_CONTROL Information that identifies an access token. TOKEN_DEFAULT_DACL The default DACL that the system uses in the security descriptors of new objects created by a thread. TOKEN_GROUPS Specifies the SIDs and attributes of the group SIDs in an access token. TOKEN_OWNER The default owner SID for the security descriptors of new objects. TOKEN_PRIMARY_GROUP The default primary group SID for the security descriptors of new objects. TOKEN_PRIVILEGES The privileges associated with an access token. Also determines whether the privileges are enabled. TOKEN_SOURCE The source of an access token. TOKEN_STATISTICS Statistics associated with an access token. TOKEN_USER The SID of the user associated with an access token. access token函数用下面的enum数值:
函数 描述 TOKEN_INFORMATION_CLASS Identifies the type of information being set or retrieved from an access token. TOKEN_TYPE Identifies an access token as a primary or impersonation token.
安全描述符包含了与一个安全对象相关联的安全信息。安全描述符由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.
访问控制列表时访问控制项(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块获取这些运行时的更多信息。
一个访问控制项(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
...
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