2. Windows安全架构与核心机制
Windows 的安全并非单一功能,而是一套由内核安全组件、账户数据库与访问控制模型共同构成的体系。理解这套体系的关键,是弄清一次访问请求从“用户登录”到“资源放行或拒绝”之间,系统究竟依据什么做出判断。本节围绕安全子系统、访问令牌、安全描述符、SID 与 ACL 五个核心对象,解析它们各自承担的角色以及相互之间的协作关系。
安全子系统:认证与授权的分工
Windows 安全子系统的核心是本地安全机构(Local Security Authority,LSA),它运行在 lsass.exe 进程中,负责账户认证、令牌生成和安全策略管理。与之配合的还有安全账户管理器(SAM)数据库、安全引用监视器(Security Reference Monitor,SRM)以及 Winlogon、Netlogon 等组件。它们的分工可以概括为:LSA 负责“你是谁”,SRM 负责“你能做什么”。
当用户在登录界面输入凭据后,Winlogon 将凭据交给 LSA,LSA 通过认证包(如 Kerberos 或 NTLM)验证身份。验证通过后,LSA 从 SAM(本地账户)或域控制器(域账户)获取该用户的 SID 和所属组信息,并据此创建一个访问令牌。此后用户启动的每个进程都会继承这个令牌,进程访问任何受保护对象时,SRM 都会用令牌与对象的安全描述符进行比对,决定是否放行。
SID:安全主体的唯一标识
安全标识符(Security Identifier,SID)是 Windows 中标识用户、组和计算机账户的唯一值。它不随账户改名而变化,因此比用户名更适合作为权限判断依据。SID 采用 S-1-5-21-<域或主机标识>-<RID> 的格式,其中 S 表示 SID,1 是版本号,5 表示标识机构为 NT Authority,21 表示该 SID 由域或本地计算机颁发,最后一段 RID(相对标识符)区分具体账户。
例如本地管理员账户的 SID 通常以 -500 结尾,来宾账户以 -501 结尾,普通用户从 -1000 起分配。系统还预置了一批知名 SID,如 S-1-5-18(Local System)、S-1-5-11(Authenticated Users)、S-1-5-32-544(Administrators 组)。在排查权限问题时,用 whoami /user 查看当前账户 SID、用 wmic useraccount get name,sid 列出本地账户 SID,往往比看用户名更可靠,因为同名账户在不同机器上 SID 不同,而权限实际绑定的是 SID。
访问令牌:进程的安全身份证
访问令牌(Access Token)是登录成功后由 LSA 生成的内核对象,它记录了当前安全主体的 SID、所属组 SID 列表、特权列表以及完整性级别。每个进程和线程都持有一个令牌,SRM 在授权时读取的就是这个令牌,而不是去查询账户数据库。令牌分为主令牌(Primary Token)和模拟令牌(Impersonation Token):进程默认使用主令牌,当服务需要以调用者身份访问资源时,可临时使用模拟令牌。
令牌中一个容易被忽视但非常重要的字段是完整性级别(Integrity Level),它从低到高分为 Low、Medium、High、System。普通用户启动的进程为 Medium,管理员在未提权时同样是 Medium,只有通过 UAC 提权后才会获得 High 完整性令牌。这解释了为什么管理员账户在“未提权”状态下无法写入 C:\Windows\System32 等受保护目录——不是权限不足,而是完整性级别不够。用 whoami /all 可以完整查看当前令牌的 SID、组、特权和完整性级别。
安全描述符与ACL:对象的访问规则
每个可被访问的 Windows 对象(文件、注册表项、服务、进程、共享等)都带有一个安全描述符(Security Descriptor),它由四部分组成:对象所有者的 SID(Owner)、主组 SID(Group,基本不用)、自主访问控制列表(DACL)和系统访问控制列表(SACL)。DACL 决定“谁能访问、能做什么”,SACL 决定“哪些访问要被审计记录”。
DACL 由若干访问控制项(ACE)组成,每个 ACE 包含一个 SID 和一个访问掩码。访问掩码用位标志表示具体权限,例如 0x1 为 FILE_READ_DATA、0x2 为 FILE_WRITE_DATA、0x10000 为 DELETE、0x10000000 为 GENERIC_ALL。ACE 分为允许(Allow)和拒绝(Deny)两类,SRM 按顺序逐条比对:一旦遇到匹配的 Deny ACE 立即拒绝,遇到匹配的 Allow ACE 则累积权限,直到满足请求或遍历结束。因此 Deny ACE 通常排在 Allow 之前,这也是“显式拒绝优先”原则的由来。
下面这张图展示了从用户登录到资源访问判定的完整链路,以及令牌与安全描述符在 SRM 处的比对关系。
五个组件的协作关系
把上述对象串起来看,一次典型的文件访问判定过程是:用户登录后 LSA 生成令牌,令牌中携带用户 SID 和组 SID;用户进程打开目标文件时,SRM 读取该文件的安全描述符,取出 DACL;随后 SRM 按顺序遍历 DACL 中的 ACE,将每个 ACE 的 SID 与令牌中的 SID 集合比对,同时检查 ACE 的访问掩码是否覆盖请求的权限;若遇到匹配的 Deny ACE 则直接拒绝,若 Allow ACE 累积的权限已满足请求则放行,否则最终拒绝。SACL 不参与放行判定,只在有匹配项时触发审计日志。
这套机制对加固实践有直接指导意义。第一,排查权限异常时应优先确认 SID 而非账户名,尤其是域迁移或账户重建后 SID 变化会导致原有 ACL 失效。第二,配置目录权限时遵循最小权限原则,只授予必要的 Allow ACE,谨慎使用 Deny ACE,因为 Deny 会覆盖同级的 Allow,容易造成难以排查的拒绝。第三,理解完整性级别与 ACL 是两套独立机制,管理员账户未提权时受完整性限制,不能简单归因于 ACL 配置错误。第四,审计需求应通过 SACL 实现,而不是靠 DACL 的拒绝项来“记录”访问。
whoami /user 查看当前 SID,whoami /groups 查看所属组,whoami /priv 查看特权,whoami /all 一次性查看全部信息;icacls 文件路径 查看对象 DACL,icacls 文件路径 /grant 用户:(权限) 修改授权。