Windows 安全基础:凭据、访问控制模型与令牌安全防御
Windows 系统的身份认证依赖于底层的一系列安全接口和协议。
1.1.1 Windows 凭据
1. SSPI 与 SSP
- SSPI (Security Support Provider Interface) :安全支持提供程序接口。它是 Windows 操作系统中用于执行各种安全相关操作的公用 API。功能全面,涵盖身份验证、信息完整性校验、信息隐私保护等,是众多安全支持提供程序(SSP)的调用接口。
- SSP (Security Support Provider) :安全支持提供程序。是一个用于实现身份验证的 DLL 文件 。系统启动时会被加载到 LSA(Local Security Authority,本地安全机构)中,主要作用是扩展 Windows 的身份验证功能。
2. 常见的 SSP 类型
- NTLM:基于挑战/响应(Challenge/Response)验证机制的 Windows 网络认证协议,用于对主机进行身份验证。
- Kerberos:一种网络身份验证协议。作为可信第三方认证服务,主要优势是提供强大的加密和单点登录(SSO)机制。
- Negotiate:用于在 SSPI 和其他 SSP 之间进行安全支撑的应用程序层。它会自动分析请求,并根据安全策略选择最佳 SSP(Kerberos 或 NTLM)。
- 安全通道 (SChannel):使用 SSL/TLS 记录来加密数据有效载荷,主要用于需要进行安全超文本传输协议(HTTPS)通信的 Web 应用程序。
- 摘要身份验证:基于 HTTP 和 SASL 的质询/响应协议。
- Cred SSP:用于传输安全凭据的网络协议,常在 RDP 或 WinRM 远程管理中提供单点登录和网络级身份验证。
- 分布式密码验证 (DPA):提供使用数字证书完成的互联网身份验证。
- PKU2U:用户对用户的公开密钥加密技术,在不隶属域的系统之间提供对等身份验证。
1.1.2 Windows 访问控制模型
Windows 的访问控制模型由 访问令牌 (Access Token) 和 安全描述符 (Security Descriptor) 两部分构成。核心逻辑是:当用户访问资源时,系统会比对进程携带的"访问令牌"与目标资源携带的"安全描述符",从而判断是否具有访问权限。
1. 访问令牌 (Access Token)
访问令牌由当前登录账号的用户持有,包含账号标识(SID)和权限信息。分为两种类型:
- 主令牌 (Primary Token) :与进程相关,描述进程相关用户账号的安全上下文(通常在用户登录成功或通过 RDP 登录时创建)。包含:用户SID、组SID、令牌来源、所有者SID、主要组SID、访问控制列表、权限列表、模拟级别等。
- 模拟令牌 (Impersonation Token) :与线程相关。允许线程在与安全对象交互时使用客户端的安全上下文(例如文件共享服务端验证客户端权限时,无法直接获取客户端主令牌,会生成模拟令牌)。
2. 安全标识符 (SID)
SID (Security Identifier) 是一串唯一字符串,用于标识用户、用户组、域等角色身份。
- 结构 :
S-1-5-21-...-RID。包含版本号(S)、48位标识符机构值(如 5 代表 NT Authority)、可变数量的 32 位子机构值、以及相对标识符(RID)。 - 常见 SID 举例 :
S-1-5-21-domain-512:Domain Admins(域管理员组)S-1-5-21-domain-513:Domain Users(域用户组)S-1-5-21-domain-500:Administrator(系统管理员账户)S-1-5-18:Local SYSTEM(操作系统使用的账户)S-1-1-0:Everyone(包含所有用户的组)S-1-5-7:Anonymous(匿名登录)
- SID 相关 API :
AllocateAndInitializeSid(初始化SID)、EqualSid(比较SID是否相等)、FreeSid(释放内存)、ConvertSidToStringSid(转字符串)等。
3. 安全描述符 (Security Descriptor)
安全描述符绑定在每个被访问对象上,包含对象的属主、组以及访问控制列表。核心组成部分为 DACL 和 SACL:
- DACL (任意访问控制列表) :包含 ACE (访问控制项)。决定了谁能以什么权限访问该对象。如果对象没有 DACL(未指定且无继承),系统默认允许所有人完全访问。
- SACL (系统访问控制列表):主要用于系统审计,指定哪些用户的操作行为记录会被保存到系统日志中。
- 注:创建新对象时,DACL 和 SACL 通常由创建者指定,或从父对象的可继承 ACE 中合并构建。
!IMPORTANT
总结:1.1.1 介绍了系统如何通过 SSPI/SSP 验证身份(NTLM/Kerberos);1.1.2 则说明了身份验证通过后,系统如何通过"访问令牌"(带SID)与目标对象的"安全描述符"(带DACL/SACL)进行匹配,从而决定是否放行访问。