操作系统 什么是访问令牌
访问令牌是描述进程或线程的安全上下文的对象。令牌用于进行安全决策并存储关于某个系统实体的防篡改信息。尽管令牌通常仅用于表示安全信息,但在创建令牌时可以附加其他自由格式的数据。
可以复制令牌而不需要特权,例如创建一个权限较低的新令牌以限制启动应用程序的访问。当进程或线程尝试与具有安全描述符的对象交互时,Windows使用访问令牌。在Windows中,访问令牌由令牌类型的系统对象表示。
在令牌中,信息包括与进程或线程关联的用户帐户的身份和特权。当用户登录系统时,登录服务生成访问令牌,并使用用户提供的凭据对其进行身份验证。身份验证数据库包含构建登录会话的初始令牌所需的凭证信息,包括用户ID、主组ID和其他信息。
令牌附加到创建在用户会话中的初始进程,并由初始进程创建的后续进程继承。每当进程打开对启用了访问控制的任何资源的句柄时,Windows会将目标对象安全描述符中的数据与当前有效访问令牌的内容进行对比。此访问检查评估的结果指示是否允许任何访问以及如果允许,调用应用程序可以执行哪些操作(读取、写入/修改等)。
访问令牌的用途
当线程与可安全对象交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户。
访问令牌是应用程序用于代表用户进行API请求的东西。访问令牌表示特定应用程序对用户数据的特定部分具有访问权限。访问令牌包含以下信息:
- 用户帐户的安全标识符(SID)。
- 用户是成员的组的SID。
- 标识当前登录会话的登录SID。
- 由用户或用户所属组拥有的特权列表。
- 系统在用户创建可安全对象时使用的默认DACL,如果未指定安全描述符。
访问令牌的示例
此示例显示了一个访问令牌的内容。令牌仅包含关于应用程序在API上的操作的授权信息,这些权限被称为作用域。
{
"iss": "https://my-domain.auth0.com/",
"sub": "auth0|123456",
"aud":
[
"https://example.com/health-api",
"https://my-domain.auth0.com/userinfo"
],
"azp": "my_client_id",
"exp": 1311281970,
"iat": 1311280970,
"scope": "openid profile read:patients read:admin"
}
访问令牌的元素
一个典型的访问令牌包含三个不同的部分,它们共同作用以验证用户对资源的访问权限。以下是大多数访问令牌中包含的三个关键元素。
- 头部: 包含令牌类型和用于生成令牌的算法的数据。
- 有效载荷: 包含用户的信息,包括权限和过期时间。有效载荷也被称为 声明部分 ,对于令牌的成功非常关键。如果你想访问特定服务器资源但在有效载荷中没有得到适当的权限,你将无法获得访问权限。开发人员还可以在有效载荷中放置各种自定义数据。例如,谷歌的访问令牌可以授予访问多个应用程序(API),而所有这些凭据都在一个访问令牌中指定。
- 签名: 包含验证数据,以确保接收者可以验证令牌的真实性。这个签名通常是经过哈希处理的,因此很难被黑客破解和复制。
访问令牌的类型
操作系统中有两种类型的访问令牌,即 主令牌 和 模拟令牌 。每个进程都有一个描述与之关联的用户账户的安全上下文的主令牌。默认情况下,当进程线程与可安全对象交互时,系统使用主令牌。此外,线程可以模拟客户账户,模拟允许线程使用客户的安全上下文与可安全对象交互。模拟客户的线程既有一个主令牌又有一个模拟令牌。
1. 主要令牌
主要令牌只能与进程关联,并代表了进程的安全主体。创建主要令牌并将其与进程关联都是特权操作,需要使用权限分离的两种不同权限。典型的情景是身份认证服务创建令牌,登录服务将其与其操作系统shell关联起来。进程最初继承父进程的主要令牌的副本。
2. 冒充令牌
冒充是Windows NT中实现的一种安全概念,允许服务器应用程序在访问安全对象方面暂时成为客户端。冒充有四个可能的级别:
- 匿名 将服务器访问匿名或未识别用户。
- 鉴别 服务器可以检查客户端的身份,但不能使用该身份访问对象。
- 冒充 ,让服务器代表客户端执行操作。
- 而 委派 是与冒充相同的,但扩展到服务器连接的远程系统(通过保存凭据)。
客户端可以选择作为连接参数提供给服务器的最大冒充级别(如果有)。委派和冒充是特权操作。冒充令牌只能与线程关联,并代表客户端进程的安全主体。冒充令牌通过诸如DCE RPC、DDE和命名管道等IPC机制隐式创建并与当前线程关联。
访问令牌如何工作
用户不编写自己的访问代码。服务器与设备进行通信,所有工作在短时间内完成。您需要遵循以下一系列步骤,例如:
- 登录: 使用已知的用户名和密码证明您的身份。
- 验证: 服务器对数据进行身份验证并发放令牌。
- 存储: 令牌发送到您的浏览器进行存储。
- 通信: 每当您在服务器上访问新内容时,您的令牌会再次被验证。
- 删除: 当会话结束时,令牌被丢弃。
您还可以使用访问令牌进行单点登录(SSO)。您在一个站点的凭据成为进入另一个站点的关键。您只需要按照以下步骤进行操作,例如:
- 授权: 您同意使用一个站点的凭证进入另一个站点。
- 连接: 第一个站点连接第二个站点并请求帮助。第二个站点创建一个访问令牌。
- 存储: 访问令牌被存储在您的浏览器中。
- 进入: 第二个站点的访问令牌使您能够进入第一个站点。
SSO的请求会很快过期。大多数请求在大约10分钟内过期,但有些请求在仅60秒后关闭该过程。
访问令牌的安全性
在因特网的开放空间中,访问令牌应受到保护。不使用加密或受保护的通信渠道的公司可能会被第三方获取令牌,这意味着对非常敏感的数据进行未经授权的访问。务必非常小心。
大多数访问令牌也会过期。这一简单的措施可以帮助网站确保用户仍然在线并活跃,从而可以避免大规模的复制或删除。过期日期可能因公司而异。