Naxalenok1/windows-hardening-baseline
GitHub: Naxalenok1/windows-hardening-baseline
一款只读的 Windows 安全加固审计工具,通过比对预定义基线来评估主机配置合规性并输出 PASS/FAIL/WARN/UNKNOWN 报告。
Stars: 0 | Forks: 0
# windows-hardening-baseline
一款 Windows security 加固审计工具,以及它所比对的基准。

## 它是什么,以及它不是什么
这是一个**只读审计**:`Invoke-WinAudit.ps1` 会读取当前的宿主机配置,并与 [`baseline.md`](baseline.md) 中的基准进行比对,打印出 `PASS / FAIL / WARN / UNKNOWN`。该脚本**不会进行任何修改**——不调整策略,不修改注册表,也不触动防火墙。它只回答一个问题:“这台机器在多大程度上偏离了 baseline,以及具体在哪里”。
关于适用范围的坦白说明:
* 这**不是生产级加固**。我并没有将这个 baseline 推广到实际的生产服务器集群中——这是我的个人基准,是基于对通过 ФСТЭК 认证要求以及 Windows security 审计中所检查内容的深入分析而整理的,外加一些通用实践(CIS 逻辑)。
* Baseline 面向的是**常规宿主机**(工作站 / 普通服务器)。域控制器的基准是另一回事(特权组的构成、委派、预认证),并未包含在此脚本中;而是作为备忘章节放在了 `baseline.md` 中。
* 该脚本原则上是只读的。我刻意没有将修复过程自动化:在真实的机器上,更改密码策略 / LM 级别 / SMB 签名可能会导致 legacy 服务崩溃,因此这是一个需要手动决策的过程,而不是简单的“一键搞定”。
## 运行
在 PowerShell 中**以管理员身份**运行(否则部分检查将返回 `UNKNOWN`):
```
powershell -ExecutionPolicy Bypass -File .\Invoke-WinAudit.ps1
```
仅显示问题,不显示通过的项:
```
powershell -ExecutionPolicy Bypass -File .\Invoke-WinAudit.ps1 -FailOnly
```
已在 Windows 10 Pro / PowerShell 5.1 上测试(实地运行过,输出结果已与 baseline 进行了比对)。
脚本文件以 UTF-8 **with BOM** 格式保存。如果没有 BOM,Windows PowerShell 5.1 会以系统默认的 ANSI 编码读取 `.ps1`,导致字符串字面量中的西里尔字符在运行前就破坏解析器。这是一个很容易让人浪费一小时的小细节。
## 检查内容
| 领域 | 检查项 |
|---------|----------|
| 密码 | 最小长度、历史记录、锁定阈值 |
| 审计 | `auditpol` 关键子类别、4688 事件中的命令行 |
| SMB | SMBv1(协议和组件)、服务器/客户端签名 |
| UAC/LSA | EnableLUA、安全桌面、LmCompatibilityLevel、RunAsPPL、RestrictAnonymous(SAM)、登录缓存 |
| 账户 | 来宾账户已禁用、内置管理员(-500)已重命名/禁用 |
| 防火墙 | 三个配置文件均已启用、默认入站策略为阻止 |
关于每个基准值的详细依据,请参阅 [`baseline.md`](baseline.md)。脚本中的每个检查项都附带了简短的“原因”,以便无需查阅文档即可理解输出结果。
## 核心方法论思想
在 Windows 中,必须检查**生成的(有效的)策略**,而不是单独的某个 GPO。最终结果值是由本地策略、多个具有优先级和继承关系的域 GPO 以及注册表设置共同叠加而成的。该脚本读取的是宿主机上的实际状态(注册表、`net accounts`、`auditpol`、`Get-Smb*`、`Get-NetFirewallProfile`)——也就是实际生效的配置,而不是某个单独策略中写明的配置。
## 免责声明
Baseline 基于公开的实践(类似 CIS 的逻辑、安全配置要求)。其中的数值是参考基准,而非教条:部分数值取决于宿主机的角色,因此有争议的项会被标记为 `WARN`,而不是 `FAIL`。关于修复的决定权在于特定系统的管理员。
标签:AI合规, Libemu