xGreeny/hardening-lens
GitHub: xGreeny/hardening-lens
一款只读的 Windows 安全加固态势评估工具,提供角色感知基线、证据级报告、受管例外和配置漂移检测。
Stars: 1 | Forks: 0
**Hardening Lens 将有效的 Windows 安全配置转化为可供您审查、对比和管理的证据。** 它会根据具备角色感知的基线评估本地设备,解释每一项发现,仅应用有效且有时限的例外情况,并导出自包含的报告,而不会更改 Windows 配置。
```
observe → assess → explain → govern → diff
```
## 存在原因
Windows 加强化很少是导入单个策略就能完成的。有效状态分布在注册表策略、Windows 安全 API、Defender 配置、可选功能、本地服务、审核策略、事件日志以及特定角色的设置中。有用的评估必须区分:
- 已解决的错误配置与收集失败;
- 仅审核的推出与强制执行的保护;
- 已批准的例外与通过的控制;
- 安全的默认值与仅仅是缺失的值;
- 安全态势的回退与有意的基线变更。
Hardening Lens 在稳定的结果 schema 中使这些区别变得明确。
## 功能
| 功能 | 实现 |
|---|---|
| **64 项控制** | 针对身份、凭证、网络保护、远程管理、会话安全、Defender、ASR、VBS、审核策略、日志记录、BitLocker、Secure Boot 和 PowerShell 的精选检查 |
| **四种角色基线** | `Workstation`、`MemberServer`、`DomainController`、`AVDSessionHost` |
| **只读收集** | 注册表、CIM、Windows API 和原生 Microsoft cmdlet;无修复模式 |
| **与区域设置无关的收集** | 通过异常类型和错误代码而不是英文消息文本对失败进行分类;已在本地化的 Windows 系统上验证 |
| **证据优先的结果** | 预期状态、实际状态、状态、消息、理由、修复建议、参考和原始证据 |
| **受管理的例外** | 所有者、理由、工单、目标范围、基线范围、批准、过期时间和补偿控制 |
| **配置漂移** | 字段级别的先前/之后状态、基线和目录来源、覆盖率差异、发现和控制集变更 |
| **便携式报告** | 自包含的 HTML 以及结构化的 JSON 和 CSV |
| **集群支持** | 支持 pipeline 的模块命令,具有完整的逐主机结果、运行清单、机器可读的失败、摘要 CSV 和一份汇总的集群 HTML 报告 |
| **自动化策略** | 针对发现、得分、证据覆盖率、部分收集和过期例外的确定性门控 |
| **可重现的出处** | 目录、有效基线和例外寄存器的 SHA-256 指纹,以及探针功能和耗时 |
| **质量契约** | JSON Schema、Pester、PSScriptAnalyzer、生成的控制文档和演示资产、双版本 CI、在 Windows 上计划的全基线实时冒烟测试,以及 PowerShell Gallery 发布 |
## 快速开始
实时收集需要 Windows 环境。从 [PowerShell Gallery](https://www.powershellgallery.com/packages/HardeningLens) 安装,并在提升权限的 Windows PowerShell 5.1 或 PowerShell 7 会话中运行:
```
Install-PSResource HardeningLens # PowerShellGet: Install-Module HardeningLens
Invoke-HardeningLens -Baseline Auto |
Export-HardeningLensReport -OutputDirectory .\out
```
或者,克隆存储库并使用 CLI 包装器,它会运行评估、写入 HTML/JSON/CSV,并返回适合自动化的退出代码:
```
git clone https://github.com/xGreeny/hardening-lens.git
Set-Location .\hardening-lens
.\hardening-lens.ps1 `
-Baseline Auto `
-OutputDirectory .\out
```
```
HARDENING LENS // SRV-DEMO-01
Baseline: Windows Member Server 1.1.0 | Score: 77.6% | Coverage: 96.3%
PASS 41 FAIL 7 WARN 3 EXCEPTED 1 UNKNOWN 1 ERROR 1 N/A 0
Top findings:
[HIGH ] [FAIL ] HL-ASR-001 Core Attack Surface Reduction rules are enforced
[HIGH ] [FAIL ] HL-BIT-001 Operating system volume is protected by BitLocker
[HIGH ] [FAIL ] HL-LAPS-003 Windows LAPS AD password encryption is enabled
[HIGH ] [FAIL ] HL-SMB-003 SMB server signing is required
```
提交的 [示例结果](examples/sample-result.json)、[HTML 报告](examples/sample-report.html)、[CSV](examples/sample-report.csv) 和 [漂移报告](examples/sample-drift.md) 仅使用合成数据。
## 模块用法
```
Import-Module HardeningLens
# 从 clone: Import-Module .\src\HardeningLens\HardeningLens.psd1 -Force
$result = Invoke-HardeningLens `
-Baseline MemberServer `
-ExceptionsPath .\examples\exceptions.json `
-NoConsole
$result | Export-HardeningLensReport `
-Format Html, Json, Csv `
-OutputDirectory .\out
```
### 导出的命令
| 命令 | 用途 |
|---|---|
| `Invoke-HardeningLens` | 运行本地只读评估 |
| `Invoke-HardeningLensFleet` | 跨远程主机运行完整的、以 artifact 为后盾的评估 |
| `Export-HardeningLensReport` | 导出 HTML、JSON 和 CSV |
| `Export-HardeningLensFleetReport` | 为集群运行导出一份汇总的 HTML 报告 |
| `Compare-HardeningLensResult` | 比较两次扫描结果 |
| `Get-HardeningLensBaseline` | 检查或解析基线 |
| `Get-HardeningLensControl` | 查询控制目录 |
| `Test-HardeningLensBaseline` | 在部署前验证自定义基线 |
| `Test-HardeningLensPolicy` | 根据自动化阈值评估评估结果 |
| `Test-HardeningLensExceptionFile` | 验证例外治理和参考 |
| `New-HardeningLensExceptionFile` | 创建兼容 schema 的例外寄存器 |
| `Set-HardeningLensException` | 以原子方式添加、批准、更新或撤销例外 |
## 基线
| 基线 | 控制 | 选择 | 预期用途 |
|---|---:|---|---|
| `Workstation` | 56 | 针对 Windows 客户端角色自动选择 | 受管理的企业端点 |
| `MemberServer` | 54 | 针对成员服务器角色自动选择 | 加入域或集中管理的服务器 |
| `DomainController` | 57 | 针对域控制器角色自动选择 | 具有更严格身份、LDAP、LAPS、审核和日志检查的 AD DS |
| `AVDSessionHost` | 58 | 显式选择 | 具有会话安全控制的池式或个人 Azure Virtual Desktop 会话主机 |
```
Get-HardeningLensBaseline
Get-HardeningLensBaseline -Name DomainController -IncludeControls
```
`Auto` 使用 `Win32_OperatingSystem.ProductType`。AVD 必须显式选择,因为本地 Windows 角色无法可靠地识别会话主机。请参阅[基线设计](docs/BASELINES.md)和完整的[控制矩阵](docs/CONTROL_REFERENCE.md#baseline-matrix)。
## 评估内容
目录涵盖:
- **身份和特权:** 内置账户、匿名访问、UAC、LSA 保护;
- **凭证保护:** WDigest、Credential Guard、Windows LAPS、NTLM 策略;
- **网络保护:** Windows Firewall、SMBv1、SMB 签名、不安全的来宾访问、LLMNR;
- **远程管理:** RDP NLA、WinRM 加密/身份验证、Remote Registry、Remote Assistance;
- **端点保护:** Defender 实时保护、云保护、行为监控、IOAV、PUA、防篡改保护、签名、网络保护、SmartScreen;
- **攻击面:** 精选的 ASR 强制执行、AutoRun/AutoPlay、Windows PowerShell 2.0;
- **安全遥测:** Script Block、Module 和进程命令行日志记录;高级审核子类别;事件日志容量;
- **平台和数据:** Secure Boot、BitLocker 和内存完整性 (HVCI);
- **会话安全:** 剪贴板和驱动器重定向以及会话主机的屏幕捕获保护,以及适用于 Windows 的 Sudo;
- **域控制器:** LDAP 签名、通道绑定、LM 哈希存储和 DSRM 密码管理。
每个目录参考都指向第一方的 Microsoft 指南。该目录是与 Microsoft 对齐的运营工程,而不是复制的 Microsoft Security Baseline 或合规性声明。
## 结果模型
每个控制返回七种显式状态之一:
| 状态 | 解释 |
|---|---|
| `Pass` | 有效状态满足所选基线 |
| `Fail` | 有效状态已解析但不满足基线 |
| `Warning` | 状态是过渡性的或仅限审核,未完全强制执行 |
| `Excepted` | `Fail` 或 `Warning` 匹配已批准且未过期的例外 |
| `Unknown` | 平台或提供程序无法解析状态 |
| `Error` | 证据收集在操作上失败 |
| `NotApplicable` | 该控制不适用于观察到的角色或配置 |
**加强化得分** 按严重性加权,并且仅对 `Pass` 授予信用。**证据覆盖率** 独立衡量已解析了多少适用的控制。请参阅[评分](docs/SCORING.md)。
结果 schema 1.1 独立于目录和基线内容版本记录模块版本,对确切的评估输入进行哈希处理,列出探针功能,并报告收集耗时。这使得在代码和安全内容以不同发布节奏发展时,结果依然具有可解释性。
## 保持可见的例外
例外不会移除发现。它将结果更改为 `Excepted`,保留 `originalStatus`,并附加所有权、原因、工单、到期时间、批准者和补偿控制。
```
New-HardeningLensExceptionFile `
-Path .\exceptions.json `
-ControlId HL-RA-001 `
-Target 'AVD-PILOT-*' `
-Baseline AVDSessionHost `
-Status Approved `
-Owner 'Workplace Engineering' `
-Reason 'Approved support workflow requires solicited Remote Assistance.' `
-Ticket 'SEC-1842' `
-Expires (Get-Date '2027-06-30') `
-ApprovedBy 'Security Engineering' `
-CompensatingControl 'Access is restricted to the support group.', 'Session activity is logged.'
Test-HardeningLensExceptionFile -Path .\exceptions.json
```
仅应用与控制、主机和可选基线范围匹配的、已批准且未过期的条目。请参阅[例外治理](docs/EXCEPTIONS.md)。
## 无需分支探针的自定义基线
```
{
"$schema": "../src/HardeningLens/Schema/baseline.schema.json",
"schemaVersion": "1.0",
"name": "NorthstarMemberServer",
"displayName": "Northstar Member Server",
"version": "1.0.0",
"description": "Organization-specific member-server posture profile.",
"extends": "MemberServer",
"excludedControls": ["HL-BIT-001"],
"controls": [
{
"id": "HL-LOG-001",
"parameters": { "minimumSizeBytes": 2147483648 }
},
{
"id": "HL-SVC-001",
"severity": "Low"
}
]
}
```
```
Test-HardeningLensBaseline -Path .\examples\custom-baseline.json
Invoke-HardeningLens -BaselinePath .\examples\custom-baseline.json
```
自定义基线可以继承、排除、添加、调整和重新设定目录控制的严重性。它们不能嵌入可执行代码或任意探针。请参阅[自定义基线规则](docs/CUSTOM_BASELINES.md)。
## 检测安全态势漂移
```
Compare-HardeningLensResult `
-Reference .\before.json `
-Difference .\after.json `
-Format Markdown `
-OutputPath .\drift.md
```
```
Score delta -2.0 points
New findings 2
Resolved 1
Changed 1
Added controls 0
Removed controls 0
```
漂移发现记录了状态、严重性、预期状态、观察状态、收集证据或例外治理的变更。收集时间戳和解释性文本会被有意忽略。除非明确启用,否则跨目标和跨基线的比较将被拒绝,从而减少对无关扫描的意外比较。变更并不意味着它是未经授权的、恶意的或在操作上不正确的。
## 执行自动化策略
```
$policy = $result | Test-HardeningLensPolicy `
-MaxFailed 0 `
-MaxWarning 2 `
-MinimumScore 85 `
-MinimumCoverage 95 `
-DisallowPartialCollection `
-DisallowExpiredExceptions
if (-not $policy.Passed) { exit $policy.ExitCode }
```
当首选的 CI 契约为终止性 PowerShell 错误时,使用 `-FailOnViolation`。策略评估首先验证结果,并将所有违规情况一起返回,而不是在第一个阈值处停止。
## 评估集群
```
Invoke-HardeningLensFleet `
-ComputerName SRV-APP-01, SRV-FILE-01, SRV-WEB-01 `
-Baseline MemberServer `
-ExceptionPath .\exceptions.json `
-OutputDirectory .\fleet-results `
-ThrottleLimit 8
```
该命令将模块传输到临时远程路径,在每个主机上进行本地评估,并移除 PowerShell remoting 元数据。它将每个请求主机的确切一个成功或失败结果写入到完全暂存的运行目录中,该目录包含主机 JSON、摘要 CSV、合并结果、清单和最终提交标记。`-Force` 仅在其替换准备就绪后才替换已提交的完整运行,因此失败的替换会保持之前的运行完好无损。该模块不会在远程安装。旧版脚本仍然是兼容性包装器。
将运行通过管道传递给 `Export-HardeningLensFleetReport`,以获取一份汇总的、自包含的 HTML 报告,其中包含逐主机得分、失败的收集以及影响最多主机的控制:
```
Invoke-HardeningLensFleet -ComputerName SRV-APP-01, SRV-FILE-01 -Baseline MemberServer -OutputDirectory .\fleet-results |
Export-HardeningLensFleetReport -OutputDirectory .\fleet-results
```
请参阅[操作指南](docs/OPERATIONS.md)。
## 安全属性
- 评估探针不会修改 Windows 配置。
- JSON 输入引用已知的目录控制;它们不能注入 PowerShell。
- 缺失的提供程序将变为 `Unknown` 或 `Error`,而不是静默通过。
- HTML 值经过编码,并且报告使用严格的 Content Security Policy。
- 报告不获取任何外部脚本、样式、字体或图像。
- 脱敏会替换检测到的主机、域和当前用户标识符。
- 已批准的例外需要过期时间和补偿控制。
- 发布版本发布到 PowerShell Gallery 并作为带有 SHA-256 校验和的存档。
Hardening Lens 输出是安全敏感的。脱敏是有针对性的,而不是通用的;在共享之前请检查报告。请参阅[安全模型](docs/SECURITY_MODEL.md)和[安全策略](SECURITY.md)。
## 需求和兼容性
- 用于实时收集的 Windows 环境;
- Windows PowerShell 5.1 或 PowerShell 7;
- 需提升权限以进行完整的证据收集;
- 控制使用的 Windows 功能或提供程序的本地可用性;
- 仅用于可选集群辅助工具的 PowerShell remoting。
目录、基线、例外、报告和漂移操作是跨平台的。不受支持或非权威的提供程序会产生显式的证据缺失。
为当前用户安装模块:
```
Install-PSResource HardeningLens # PSResourceGet
Install-Module HardeningLens -Scope CurrentUser # PowerShellGet
# 从 clone,不使用 PowerShell Gallery:
.\scripts\Install-HardeningLens.ps1 -Scope CurrentUser
```
## 质量门控
存储库契约通过以下方式执行:
- 针对目录、基线、评分、值评估、例外、脱敏、报告和漂移的 Pester 测试;
- 对模块、脚本、CLI、构建和测试进行 PSScriptAnalyzer 检查;
- JSON Schema 验证和跨文件引用检查;
- 确定性生成控制参考和演示资产;
- Windows PowerShell 5.1 和 PowerShell 7 CI;
- 在 Windows runner 上计划的全基线实时冒烟测试,禁止在稳健的探针类中出现收集错误;
- tag 到清单的版本验证;
- 版本化的发布存档和校验和生成;
- 针对 tagged 发布的 PowerShell Gallery 发布。
```
Install-Module Pester -MinimumVersion 5.6.1 -Scope CurrentUser
Install-Module PSScriptAnalyzer -Scope CurrentUser
python -m pip install -r requirements-dev.txt
.\build.ps1 -Task All
python .\tools\validate_repository.py
```
## 文档
- [控制参考和基线矩阵](docs/CONTROL_REFERENCE.md)
- [基线设计](docs/BASELINES.md)
- [评分和证据覆盖率](docs/SCORING.md)
- [例外治理](docs/EXCEPTIONS.md)
- [自定义基线](docs/CUSTOM_BASELINES.md)
- [操作指南](docs/OPERATIONS.md)
- [架构](docs/ARCHITECTURE.md)
- [安全模型](docs/SECURITY_MODEL.md)
- [故障排除](docs/TROUBLESHOOTING.md)
## 范围边界
Hardening Lens **不会** 修复设置、证明管理平面意图、持续监控设备、替代应用程序兼容性测试、执行漏洞扫描,或证明符合 Microsoft、CIS、NIST 或其他框架合规性。它为工程和安全决策提供可重现的本地证据。
## 许可证
[MIT](LICENSE) © 2026 xGreeny
标签:AI合规, IPv6, Libemu, PowerShell, 安全基线, 安全态势感知, 教学环境, 端点可见性, 系统加固