我列出了从 MSDN 中获得的定义,但我想通过一个可能需要在不同场景中使用它们的程序(进程)的示例来了解它们之间的区别。
访问令牌
访问令牌是描述进程或线程的安全上下文的对象。令牌中的信息包括与进程或线程关联的用户帐户的身份和权限。当用户登录时,系统会通过将用户的密码与存储在安全数据库中的信息进行比较来验证用户的密码。如果密码通过验证,系统将生成访问令牌。代表此用户执行的每个进程都有此访问令牌的副本
SID
安全标识符 (SID) 是用于识别受托者的可变长度的唯一值。每个帐户都有一个由权威机构(例如 Windows 域控制器)颁发的唯一 SID,并存储在安全数据库中。每次用户登录时,系统都会从数据库中检索该用户的 SID,并将其放在该用户的访问令牌中。系统使用访问令牌中的 SID 在所有后续与 Windows 安全交互中识别用户。
模拟令牌
为捕获客户端进程的安全信息而创建的访问令牌,允许服务器在安全操作中“模拟”客户端进程。
根据定义,它们听起来都很相似。有人能举例解释一下它们之间的区别吗?
答案1
“SID” 是附加到用户帐户的静态标识符。它只是一串数字,就像一个人的社保号/国家免疫学会,或数据库记录的“主键”。由于它永远不会改变,因此其目的是查找特定帐户,即使该帐户可能已被重命名;因此,它代替用户名存储在令牌、ACL 和其他类似结构中。
请注意,还有组 SID、会话 SID、服务 SID 等 - 用于识别 ACL 中可能存在的各种不同“参与者”。
“代币”是内核对象包含 SID 和权限列表。内核对于获取和操作它们有非常严格的规则(这只能使用系统调用来完成,而不能直接访问内存),因此拥有令牌意味着允许进程代表该令牌描述的任何用户行事。
(在类 Unix 系统上,如果您熟悉它们,那么一个进程有一组“凭证”——“真实 UID”、“有效 UID”、“真实 GID”、“有效 GID”、“补充 GID”和一些其他内容。SID 是 UID/GID 的扩展,而令牌是这些凭证的集合。您无需调用capset()
+ setgroups()
+ setgid()
+ setuid()
,而是获取令牌并调用SetToken()
。)
有两种类型的令牌 - “主要”令牌只能通过登录系统生成,“冒充“,任何服务都可以创建临时令牌来代表客户端行事。
这是一个完整列表令牌中保存的所有信息。