【windows 访问控制】一、访问令牌
访问令牌(Access tokens)
访问令牌是描述进程或线程的安全上下文的对象。令牌中的信息包括与进程或线程关联的用户帐户的标识和特权信息。当用户登录时,系统通过将用户密码与安全数据库(如域认证中的NTDS或本地认证中的SAM文件)中存储的信息进行比较来验证用户密码。如果密码经过验证,则系统将生成访问令牌。代表该用户执行的每个进程都有此访问令牌的副本。(通常我们在输入密码登陆进入Windows界面时就是一个生成访问令牌的过程)当线程与安全对象进行交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户。访问令牌包含以下信息:
- 用户帐户的安全标识符(SID)(关SID是什么后续章节会详细介绍)
- 用户所在组的SID
- 标识当前登录会话(logon session)的登录SID
- 用户或用户组拥有的特权列表
- 所有者SID
- 主要组的SID
- 用户创建安全对象而不指定安全描述符时系统使用的默认DACL
- 访问令牌的来源
- 令牌是主要令牌(内核分配的令牌)还是模拟令牌(模拟而来的令牌)
- 受限制SID的可选列表(如UAC存在时会针对某些账户删除某些特权)
- 当前的模拟级别 其他数据
Windows Access Token分两种:
主令牌(Primary token)
模拟令牌(Impersonation token)
每个进程都有一个主要令牌,用于描述与该进程关联的用户帐户的安全上下文。默认情况下,当进程的线程与安全对象进行交互时,系统使用主令牌。
此外,线程可以模拟客户端帐户。模拟允许线程使用客户端的安全上下文与安全对象进行交互。模拟客户端的线程同时具有主令牌和模拟令牌。(出现这种情况是因为服务操作是在寄宿进程中执行,在默认的情况下,服务操作是否具有足够的权限访问某个资源(比如文件)取决于执行寄宿进程Windows帐号的权限设置,而与作为客户端的Windows帐号无关。在有多情况下,我们希望服务操作执行在基于客户端的安全上下文中执行,以解决执行服务进行的帐号权限不足的问题。简单来说就是我们希望不同客户端来访问服务时,服务可以模拟客户端的身份去访问服务,而不是用自己的主进程Token身份去访问。)
特权 (Windows)
系统有一个帐户数据库,存储了用户或用户群的特权。当用户登录后,系统产生一个访问令牌(access token)包含了用户的特权清单,这包含用户所在群的特权。注意特权仅限于本地计算机,域帐户在不同计算机上有不同特权。
当用户试图执行一个特权操作,系统检查用户的访问令牌以确定使用是否具有必要的特权。调用GetTokenInformation函数可以检查特权。
另外,还有令牌中的权限列表,权限与对象访问无关,所以与安全描述符,SID等无关。当线程执行一些管理相关的操作时,系统会检查该线程的令牌中是否含有特定的权限,如果有,则允许线程执行该操作,否则拒绝。
命令行获取访问令牌的信息
获取 当前登录的用户的访问令牌信息:whoami /all
WHOAMI /UPN //用户主体 (User Principal) 格式显示用户名 名称 (UPN)格式。
WHOAMI /FQDN // 用完全合格的 (Fully Qualified) 格式显示用户名 可分辨名称(FQDN) 格式。
WHOAMI /LOGONID // 显示当前用户的登录 ID。
WHOAMI /USER // 显示当前用户的信息以及安全标识符 (SID)。
WHOAMI /USER /FO LIST
WHOAMI /USER /FO CSV
WHOAMI /GROUPS //显示当前用户的组成员信息、帐户类型和安全 标识符 (SID) 和属性。
WHOAMI /GROUPS /FO CSV /NH //NH指定在输出中不显示列标题。只对 TABLE 和 CSV 格式有效。
WHOAMI /PRIV // 显示当前用户的安全特权。
WHOAMI /PRIV /FO TABLE //指定要显示的输出格式。有效值为 TABLE、LIST、 CSV。CSV 格式不显示列标题。默认格式是 TABLE。
WHOAMI /USER /GROUPS
WHOAMI /USER /GROUPS /PRIV
WHOAMI /ALL //显示当前用户名、属于的组以及安全标识符(SID) 和当前用户访问令牌的特权。
WHOAMI /ALL /FO LIST
WHOAMI /ALL /FO CSV /NH
WHOAMI /? //显示此帮助消息。