尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Windows安全机制全解:SID、事件日志与基线加固实战

Windows安全机制全解:SID、事件日志与基线加固实战 你是不是也有这种感觉Python 上手了Linux 常用命令也敲得挺顺一提到 Windows却总觉得它就是个装软件、跑办公的普通桌面系统。我在刚开始学网络安全的时候就是这么想的直到后来接触了真实的服务器运维、日志分析和应急响应才意识到 Windows 操作系统才是日常工作中真正绕不开的主战场。这篇是“网络安全学习笔记”系列第五篇、Windows 部分的第二篇。上一篇我整理了 Windows 的基础概念、目录结构和常用命令这一篇换个视角全部围绕安全相关的系统机制展开。换句话说这篇不是教你“怎么用 Windows”而是讲清楚 Windows 在安全场景下那些必须搞懂的东西SID、访问令牌、事件日志、进程树、持久化位置、基线加固以及我亲手踩过的各种环境坑。无论你将来想做蓝队防守、做等保测评、参加 CTF 或准备安全岗位面试这些内容都是高频考点和实打实的日常操作。1. 先从“权限”说起Windows 安全模型为什么总在提 SID 和令牌1.1 一组容易被忽略的编号SID 与安全标识符很多初学者第一次接触 Windows 安全模型都会被 SID、ACL、ACE、Token 这一堆缩写劝退。其实把它们拆开看逻辑并不复杂。SIDSecurity Identifier安全标识符是 Windows 用来标识用户、用户组或计算机的唯一编号。你可以把它理解为系统内部的身份 ID。用户名可以改但 SID 一旦创建基本不变所以安全审计、日志分析时经常看到的是 SID而不是“张三”“李四”这种显示名。常见的内置 SID 需要记一下面试和应急响应都会用到SID 值含义S-1-5-18本地系统账户 Local SystemS-1-5-19本地服务账户 Local ServiceS-1-5-20网络服务账户 Network ServiceS-1-5-32-544本地 Administrators 组S-1-5-32-545本地 Users 组S-1-5-32-546本地 Guests 组S-1-5-21-机器标识-500内置 Administrator 管理员账户S-1-5-21-机器标识-501内置 Guest 来宾账户为什么安全分析和 SID 有关举个例子攻击者拿到一台 Windows 主机后往往会通过创建隐藏账户或修改已有账户权限来维持控制。如果只看用户名很容易被“长得像系统账户”的假账户迷惑但查看 SID 和账户创建时间就容易发现异常。比如某个账户显示名是“Support”但 SID 对应的 RID 是 500内置管理员这就不对劲了。1.2 访问令牌你在系统里的“身份证”SID 是身份的编号而访问令牌Access Token则是一张“带权限的身份证”。当你登录 Windows 时系统会为你生成一个令牌里面包含你的用户 SID、所属组 SID以及当前会话拥有的特权列表。之后你打开任何文件、执行任何操作系统都拿这个令牌去对照目标对象的 ACL判断“允不允许”。这里有个非常重要的机制UAC用户账户控制。Windows 默认把管理员账户的令牌拆成两份一份是完整的管理员令牌一份是经过过滤的标准用户令牌。日常操作使用的是标准令牌只有触发需要管理员权限的操作、且用户确认弹窗后才切换到完整令牌。这样设计是为了防止恶意程序在用户毫不知情的情况下直接以最高权限运行。从安全角度看这就是为什么很多加固手册会强调“不要在日常办公中使用具有完整管理员权限的账户”。当你用管理员身份打开浏览器、邮件客户端时浏览器进程携带的令牌具备很高的权限一旦浏览器被攻破攻击者拿到的就是当前进程的权限。我之前在应急响应中遇到过一例就是用户用管理员权限运行了某个激活工具结果整个系统被种了后门因为激活工具启动后后续释放的恶意文件全部继承了管理员令牌权限一路畅通无阻。1.3 ACL 和 ACE文件、注册表权限的判定逻辑有了令牌之后系统怎么判定你能不能访问某个文件或注册表键靠 ACL访问控制列表和 ACE访问控制项。每个受保护对象上都挂着一个 ACLACL 里是一串 ACE每一条 ACE 指定“某个 SID 允许/拒绝某项权限”。判定的核心逻辑是按顺序遍历 ACL先命中的 ACE 生效。这里有个常见误解很多人以为“拒绝”一定比“允许”优先。其实 Windows 的默认逻辑是按 ACE 在 ACL 里的排列顺序处理的只要先匹配到“拒绝”就会拒绝但同一对象的 ACL 排列也受继承顺序影响。真正需要记住的是在文件系统权限的 ACL 里“拒绝” ACE 通常会被刻意排在前面。所以当你发现“明明给了某个用户完全控制权限却还是无法访问”的时候第一反应应该是检查目标文件夹或上层目录是否存在针对该用户或该用户所属组的“拒绝”条目。这个排查思路在做运维、处理系统故障时很实用。注册表权限也是同样逻辑。很多恶意软件会通过修改当前用户的注册表 Run 键实现开机启动原因很简单普通用户对自己 HKCU 下的注册表是有完全控制权的不需要管理员权限。这一点会在后面的持久化部分详细展开。2. 系统被“敲门”了怎么看Windows 事件日志审计到底盯哪些 ID2.1 日志不是越多越好关键是审计策略Windows 事件日志是蓝队最依赖的数据源之一也是最容易被忽略的。很多运维人员部署完系统后默认日志策略几乎什么都不记录等出事了翻日志才发现只记录了系统启动、关闭这类无关紧要的信息。所以正确做法是提前开启审计策略让想看的数据先落盘。审计策略分两类基础审计策略通过 secpol.msc 里的“本地策略 - 审核策略”配置和高级审核策略通过“本地安全策略 - 高级审核策略配置”。建议优先使用高级审核策略因为它更细粒度。需要开启的重点项我整理了一份常用清单登录/注销 - 审核登录成功和失败都开记录 4624、4625 等登录事件。账户管理 - 审核用户账户管理成功失败都开记录用户创建、删除、组变更等。进程创建 - 审核进程创建记录 4688 新进程事件这个对追踪命令执行非常关键。系统 - 审核系统事件成功失败都开覆盖系统启动、关机、日志清除等。策略更改 - 审核策略更改防止攻击者关闭审计后不留痕。2.2 必背事件 ID 表熟悉事件 ID 是 Windows 安全分析的基本功。不需要背几百个但下面的高频 ID 一定要记牢事件 ID含义常见用途4624登录成功追踪谁在什么时间登录4625登录失败发现暴力破解、撞库行为4634注销成功确认会话结束时间4672为新登录分配特殊权限检测管理员权限登录4688创建新进程捕捉命令执行、恶意进程启动4720创建用户账户发现可疑新账户4732将成员添加到组检测权限提升比如加入管理员组4728/4737修改启用安全的全局组/组变更账户组变动审计4740账户被锁定暴力破解导致的锁定1102审核日志被清除攻击者清理痕迹的典型信号7045系统安装服务发现新安装的服务常被用于后门持久化看到 1102 时要注意它不一定代表系统被入侵也可能只是运维人员手动清了日志。但在真实入侵中“清日志”是非常常见的反取证动作所以一旦发现日志有断档、时间跳跃就要提高警惕确认是否有异常。2.3 一个完整案例通过日志还原暴力破解过程给你讲一个我实际排查过的场景。某客户反馈内网多台 Windows Server 出现账号被锁定的现象每隔一段时间就有运维账号被锁死。我在其中一台服务器上用管理员权限打开事件查看器筛选安全日志中的 4625 事件然后按时间倒序排列很快发现问题集中在某个时间段。再按来源网络地址做分组统计发现大量失败登录都来自同一个内网 IP。顺着这个 IP 去查发现是一台被蠕虫病毒感染的文件服务器它正在对内网其他主机的 445 端口发起爆破尝试用字典文件不断尝试常见账号和密码组合。由于客户端开启了账户锁定阈值策略导致目标主机上大量账号被锁断。当时我做了三件事先把被感染服务器断网隔离然后批量排查内网是否有同类文件被投放最后把防火墙规则里的入站 445 端口限制为仅允许指定业务网段访问。整个过程如果没有 4625 日志做支撑很难快速定位源头。这也带出一个实操经验日志一定要集中收集。条件允许时把 Windows 安全日志通过工具转发到独立的日志平台比如 ELK 或 Wazuh。否则攻击者拿到系统权限后清除本地日志几乎零成本到时候你手里什么证据都没有。3. 进程、服务、注册表Windows 上“东西到底是怎么常驻的”3.1 进程树与父子关系找异常进程的基本功学习 Windows 安全绕不开进程分析。很多人只知道打开任务管理器看 CPU 占用看到高占用就“砍掉”这种思路在真实排查里远远不够。真正有价值的信息是进程之间的父子关系。在 Windows 里每个进程启动时都会记录父进程。正常情况下explorer.exe桌面外壳是所有用户双击启动程序的父进程services.exe 是服务进程的父进程svchost.exe 是系统服务的宿主容器。当你看到某个奇怪的进程其父进程是浏览器、Office 软件、WPS甚至是一个临时目录下的可执行文件那就高度可疑了因为这说明进程来源于“文档打开/宏执行/网页下载”是典型的钓鱼或挂马场景。用 PowerShell 可以快速列出进程树Get-CimInstance Win32_Process | Select-Object ProcessId, ParentProcessId, Name, CommandLine | Sort-Object ParentProcessId如果嫌输出太乱可以配合 Process Explorer 这个工具它的界面会以树状结构展示父子关系鼠标悬停还能看到每个进程的签名、路径、启动时间。排查时建议按以下顺序确认看进程路径是否在 Program Files、Windows、System32 等正常目录之外。看签名是否有效有无常见厂商签名。看启动时间是否和用户操作时间吻合。看 CommandLine 里有没有 PowerShell 远程下载、base64 编码命令等特征。3.2 服务、计划任务、注册表键三种常见的“开机自启”Windows 开机自动运行的位置很多攻击者只要拿到普通用户权限也能在当前用户范围内实现自启动。我把最常见的三类列出来防御视角下需要会查、会判断。第一种是服务。服务通过 services.msc 或 sc 命令管理。恶意服务通常会伪装成系统相关名称运行路径却指向临时目录或用户目录。排查时执行下列命令重点看 ImagePath 是否正常、StartType 是否为 Auto、运行账户是否为 SYSTEMsc query sc qc 服务名第二种是计划任务。计划任务非常灵活可以指定时间执行、登录时执行、空闲时执行。攻击者很喜欢用计划任务做持久化因为默认情况下计划任务的日志记录不显眼。用命令行查看所有计划任务的详细信息schtasks /query /fo LIST /v记得特别关注“上次运行时间”为空的、或者创建于最近几天的任务。如果发现某个任务执行的是 PowerShell 或 MSHTA 命令要往恶意方向多想一步。第三种是注册表 Run 键。常见位置包括HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run排查时直接运行 regedit 查看对应键值或者 PowerShell 列出Get-ItemProperty HKCU:\Software\Microsoft\Windows\CurrentVersion\RunHKCU 下的 Run 键不需要管理员权限就能写入所以即使攻击者拿到的只是一个标准用户权限也能实现“重启后仍然运行”。这一块我处理过的案例里很多“杀完又复活”的木马就是藏在 HKCU Run 或计划任务里光杀进程不清理持久化永远不会干净。3.3 清理和处置的顺序建议遇到确实可疑的常驻程序不建议一上来就删除文件。正确顺序是先完整取证包括进程路径、命令行、文件哈希、注册表关联项、计划任务定义然后断网隔离主机再停掉相关进程和自启动项最后对文件做杀毒扫描和样本留档。这样既能处置问题也能保留后续溯源分析的素材。4. 在 Windows 上搭安全实验环境WSL2、Docker 与一套可复用的工具链4.1 为什么推荐在 Windows 上虚拟化而不是直接装 Linux学网络安全的人往往喜欢 Linux这没错。但你以后总要面对 Windows 环境下的服务器和终端不可能永远只在 Linux 虚拟机里玩。所以我更建议你在 Windows 上直接搭建实验环境既能练 Windows 系统的运维又能兼顾 Linux 工具链。常见的方案有 Hyper-V 和 VirtualBox。Windows 11 专业版/企业版自带 Hyper-V性能不错但它会占用虚拟化特性可能影响 VirtualBox 里的嵌套虚拟化。这里就涉及到热搜里那个经典问题VirtualBox 打开虚拟机时提示“未能启动虚拟电脑可能缺少操作系统”。很多初学者以为系统镜像坏了其实大部分情况下是这几个原因未在 BIOS/UEFI 中开启硬件虚拟化、Hyper-V 与 VirtualBox 冲突、虚拟机设置的启动顺序不对导致无法引导系统盘。排查思路是先确认电脑的虚拟化是否开启任务管理器 - 性能 - CPU - 虚拟化状态再检查 Windows 功能里是否启用了 Hyper-V、Windows 沙盒、内核隔离VBS等。这些功能会占用 Hyper-V 虚拟化层导致 VirtualBox 无法使用硬件加速。临时可执行bcdedit /set hypervisorlaunchtype off改完重启后 VirtualBox 一般就能正常创建 64 位虚拟机了。但要注意关闭后 Hyper-V 相关的功能也不可用实验完记得改回来。4.2 WSL2 和 Docker轻量实验环境如果你不想维护多套虚拟机WSL2 是很好的选择。在 Windows 11 下直接执行wsl --install重启后按提示设置 Linux 用户即可。WSL2 基于真正的轻量级虚拟机和宿主机共享内核网络体验比第一代稳定很多。很多安全工具可以直接在 WSL2 里跑比在 Windows 下找各种移植版本方便。Docker 同样可以借助 WSL2 后端在 Windows 上运行。Docker Desktop 安装时勾选“Use WSL 2 based engine”默认体验就很顺。要注意的是Docker 容器默认是 Linux 容器端口映射到宿主机时需要注意如果容器里跑了数据库或服务比如 Redis、Elasticsearch默认情况下端口会直接暴露在宿主机上本地调试没问题但千万不能忽略防火墙。我见过有人本机跑了个 Redis 实验环境未设置认证内网又开着端口结果被扫描器盯上了直接被抓了“挖矿”苦力。容器是实验工具不是保险箱。在 Windows 上跑 Elasticsearch、Redis 这类服务时可以顺手建一个 docker-compose.ymlversion: 3 services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10 environment: - discovery.typesingle-node - xpack.security.enabledfalse ports: - 9200:9200 redis: image: redis:7-alpine ports: - 6379:6379这个环境配合 Winlogbeat就可以把 Windows 安全日志透传到 Elasticsearch 里做分析是学习日志平台的经典练手方案。你在 Windows 上装了 Elasticsearch 之后初次启动如果提示 JVM 内存不足多半是分配堆内存过大改成 512m 或 1g 就稳了。4.3 Windows 上跑 Python 写自动化脚本做安全少不了写脚本。Windows 下装 Python 时记得勾选“Add Python to PATH”否则后面命令行里敲 python 老提示找不到命令。版本建议 64 位。装好之后可以先用它写个本地基线核查脚本比如检查所有本地用户的密码策略、账户状态、共享目录import subprocess, json def run(cmd): r subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue) return r.stdout.strip() users run(net user) print(users)如果希望脚本在后台静默运行不弹黑色命令行窗口可以把扩展名改成 .pyw 并用 pythonw.exe 执行或者通过计划任务以隐藏窗口方式运行。这个技巧在做自动化巡检时很实用。5. 基线加固怎么做从检查口令到可自动化执行的加固清单5.1 什么是安全基线为什么面试总问安全基线是系统的最低安全要求目的不是把系统“关死”而是把不必要的暴露面收窄。等保测评、客户现场检查、面试题里经常出现“如何进行安全加固”本质上考的就是你对 Windows 各项安全配置的熟悉程度。基线的来源通常是国家标准、行业规范或者企业内部安全策略。核心思路可以归纳为能关的关、能限制的限制、能审计的审计。5.2 账户与口令策略账户和口令是第一道门。Windows 默认的管理员账户名“Administrator”和来宾账户“Guest”都是靶子。建议至少做这些调整禁用 Guest 账户。重命名或禁用内置 Administrator 账户并创建新的管理员账户用于日常管理。设置密码历史为 5 次以上最大使用期限不超过 90 天。开启账户锁定阈值如连续 5 次失败锁定 30 分钟抵御暴力破解。普通用户不允许通过远程桌面登录远程管理只允许管理员组账户。通过 secpol.msc 设置账户策略时“密码必须符合复杂性要求”建议启用但它并不能完全防止弱密码因为像 “Pssw0rd” 这种字典密码依然能通过复杂性检查。真正有效的是配合账户锁定阈值和登录日志监控。5.3 网络与远程管理面加固Windows 的远程管理面主要是 RDP远程桌面和 SMB文件共享相关端口。如果业务不需要远程桌面建议直接关闭如果确实需要一定要开启“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”NLA。这不是可有可无的选项而是防范很多 RDP 攻击的基础门槛。防火墙规则上入站方向保持默认拒绝只放行业务必需端口。注意不要为了省事把 3389 改成“全放行”然后只靠改端口号来“减少扫描”这种方法不叫安全叫心里安慰。在 Windows 防火墙里可以针对远程桌面启用“作用域”限制只允许指定管理网段访问。检查当前入站放行规则Get-NetFirewallRule -Enabled True -Direction Inbound | Select-Object DisplayName, Action, Profile5.4 自动化核查脚本示例手动点界面容易漏也浪费时间。这里给一个 PowerShell 示例把最常见的核查项串起来# 1. 检查本地用户状态 Get-LocalUser | Select-Object Name, Enabled, PasswordRequired, PasswordLastSet # 2. 检查不必要的共享 Get-SmbShare | Where-Object { $_.Name -notin (ADMIN$,C$,IPC$) } # 3. 检查开机启动项 Get-CimInstance Win32_StartupCommand | Select-Object Name, Command, Location # 4. 检查计划任务中运行权限为最高权限的任务 Get-ScheduledTask | Get-ScheduledTaskInfo | Select-Object TaskName, LastRunTime实际落地时可以写一个 .ps1 脚本在需要巡检的服务器上以管理员身份执行将结果输出为 CSV 文件再统一收集到日志平台。如果环境里主机数量较多可以通过计划任务每天定时执行一次然后用脚本比对基线和结果差异项省去人工一台台登录查看的麻烦。6. 学习过程中踩过的那些坑6.1 虚拟化环境死活起不来这个问题我前面提了一部分但值得再单独说一次。VirtualBox 创建虚拟机时如果 64 位系统列表不显示或者启动时提示“可能缺少操作系统”十有八九是宿主机开启了 Hyper-V 相关的功能比如 Windows 沙盒、基于虚拟化的安全VBS、内核隔离、内存完整性。Windows 11 的 27H2 版本开始官方默认开启的内存完整性功能会影响 VirtualBox 的硬件加速。临时关闭方法bcdedit /set hypervisorlaunchtype off如还有问题检查 BIOS 设置里的 SVM/ VT-x 是否开启。很多品牌机出厂默认关闭虚拟化需要进 BIOS 手动打开。6.2 Windows 下中文乱码与编码问题Windows 命令行、日志文件、脚本输出里出现中文乱码是安全分析新手经常遇到的坑。一部分原因和“区域与语言选项”里的“Beta 版使用 Unicode UTF-8 提供全球语言支持”有关。打开这个选项之后某些老程序会因为编码不兼容显示乱码。处理方法是PowerShell 执行命令前先切换到 UTF-8chcp 65001保存脚本文件时如果有中文字符建议使用 UTF-8 with BOM 格式否则 PowerShell 在某些 Windows 版本下可能将脚本读取为 ANSI出现注释乱码甚至语法错误。还有一次我在分析日志时遇到导出的日志文件乱码最后发现是导出时查看器默认使用了非 UTF-8 编码导致的用 Notepad 转换编码后内容就正常了。遇到乱码不要急着换工具先确认编码格式。6.3 本机端口被占用/服务起不来的排查在 Windows 上装 Docker、Elasticsearch、Redis 时最常见的是端口被占用。我遇到过好几次 Elasticsearch 启动失败报端口 9200 被占用用 netstat 一看是另一个测试服务占着。排查命令netstat -ano | findstr 9200 tasklist /FI PID eq 进程PID如果占用端口的是 PID 4说明是系统进程System往往意味着端口被 HTTP.sys 驱动占用这时候需要检查是否有 IIS 或其它 Windows 服务绑定了该端口。另一个容易忽略的问题是系统时间不对。Windows 域环境下时间偏差过大会导致 Kerberos 身份验证失败表现为网络共享无法访问、登录提示“服务器上的时钟与客户端上的时钟相差太大”。解决办法w32tm /resync6.4 局域网环境下的互通排查经常有人在局域网里遇到“Windows 能上网但访问 Linux 服务器不通”或者反过来“Linux 能上网但 ping 不通 Windows”。我在调试麒麟系统与 Windows 互通时也踩过这个坑。普通排查顺序是先确认两端 IP、子网掩码、网关是否正确再检查 Windows 防火墙是否开启了“文件和打印机共享回显请求”规则最后用 traceroute 或 mtr 看路由在哪一跳断了。很多“ping 不通”不是网络真的不通而是对方防火墙把 ICMP 回显请求禁了但 HTTP、SSH 等服务是正常的。判断网络通不通别只靠 ping直接测目标端口更靠谱。Windows 的学习笔记写到这里已经覆盖了我认为在网络安全实战里最常用、最容易踩坑的几个方面。这些内容不是拿来背的而是要在虚拟机里、在实验环境里一个个亲手验证一开始可以用检查脚本自动扫描等熟悉了再手动操作一遍理解每个配置项背后的原因。我个人做这套实验的方法比较笨每学一个机制就开一台干净的 Windows 虚拟环境按笔记里的命令跑一遍再故意制造一个异常情况然后用日志和排查命令把问题找出来。只有自己亲手排查过一次才能真正记住那个过程。
返回列表