访问令牌(Access Tokens)是Windows操作系统安全性的一个概念。当用户登陆时,系统创建一个访问令牌,里面包含登录进程返回的SID和由本地安全策略分配给用户和用户的安全组的特权列表。以该用户身份运行的的所有进程都拥有该令牌的一个拷贝。系统使用令牌控制用户可以访问哪些安全对象,并控制用户执行相关系统操作的能力。
分类
有两种令牌:主令牌和模拟令牌。主令牌是由
windows内核创建并分配给进程的默认访问令牌,每一个进程有一个主令牌,它描述了与当前进程相关的用户帐户的安全上下文。同时,一个线程可以模拟一个客户端帐户,允许此线程与安全对象交互时用客户端的安全上下文。一个正模拟客户端的线程拥有一个主令牌和一个模拟令牌。
工作原理
主令牌
访问令牌包含进程或线程的安全上下文的完整描述,其中含有如下信息。
用户(
User)。用户账号的
SID。若用户登录到本地计算机上的一个账号,则他的 SID来自于本地SAM维护的账号数据库;若用户登录到一个域账号,则他的SID来自于活动目录里用户对象的Object-SID属性。
组(Groups)。包含该用户的安全组的SID列表,表中也包含代表活动目录里用户 账号的用户对象的SID-History属性里的SID。
特权(Privileges)。用户和用户的安全组在本地计算机上拥有的特权列表。
所有者(Owner)。特定用户或安全组的SID,这些用户或安全组默认成为用户所 创建或拥有的任何对象的所有者。
主组(Primary Group)。用户的主安全组的SID。这个信息只由POSIX子系统使用, Windows 2000的其他部分对其忽略。
默认任意访问控制表(Default Discretionary Access Control List, DACL)。一组内置 许可权。在没有其他访问控制信息存在时操作系统将其作用于用户所创建的对象。默认DACL向创建所有者和系统赋予完全控制(Full Control)权限。
源(Source)。导致访问令牌被创建的进程,例如会话管理器、LAN管理器或远程 过程调用(RPC)服务器。
类型(Type)。指示访问令牌是主(primary)令牌还是模拟(impersonation)令牌。 主令牌代表一个进程的安全上下文;模拟令牌是服务进程里的一个线程,用来临时接受一个不同的安全上下文(如服务的一个客户的安全上下文)的令牌。
模拟级别(Impersonation Level)。指示服务对该访问令牌所代表的客户的安全上下 文的接受程度。
统计信息(Statistics)。关于访问令牌本身的信息。操作系统在内部使用这个信息。
限制SID(Restricting SID)。由一个被授权创建受限令牌的进程添加到访问令牌里 的可选的SID列表。限制SID可以将线程的访问限制到低于用户被允许的级别。
会话ID(Session ID)。指示访问令牌是否与终端服务(Terminal Services)客户会 话相关。
模拟令牌
线程能够在与拥有它的进程的上下文不同的安全上下文里执行,这种能力称为模拟,它是为了满足客户/服务器应用的安全需求而设计的。当在一个客户的安全上下文里运行时,服务在某种程度上“是”客户。服务的一个线程使用代表客户资格的访问令牌来访问该客户有权访问的对象。
模拟的主要原因是根据客户的标识执行访问检查。使用客户标识进行访问检查可以根据该客户拥有的许可权来限制或扩展访问。例如,假设一个文件服务器上有包含秘密信息的文件,这些文件都由一个DACL保护。为了防止客户未经授权就可访问这些文件中的信息,服务可以在访问文件之前模拟客户。
功能特点
每个进程都有一个主令牌(primarytoken)来描述与该进程相关的用户账号的安全上下文。与普通的应用进程相关的用户是启动该应用的人为用户,但对一个服务进程却非如此:服务在自己的账号下运行,在自己的权限内充当用户。与操作系统一起安装的系统服务在本地系统账号下运行,其他的服务可以配置为在这个账号下运行,也可以给予在本地系统上或活动目录里的单独账号。一个服务的主令牌与该服务进程里的控制线程和代表该服务运行的所有其他线程相关。它标识该服务的账号、该账号的组和特权。当服务请求访问完成工作所需的对象时,在访问检查时使用该信息。
当服务接受一个客户时,它创建一个线程来完成这项工作并将客户的访问令牌与工作线程相关联。客户的访问令牌是一个模拟令牌,它标识客户、客户的组和特权。当线程代表客户请求访问资源时,在访问检查过程中使用该信息。在模拟结束后,线程重新使用主令牌并返回到服务自己的安全上下文里操作,而不是客户的上下文。