OnyxOmega/logmon
GitHub: OnyxOmega/logmon
logmon 是一个 Windows 事件日志归档与保留服务,提供防篡改检测、哈希签名和符合法律举证标准的日志完整性管理。
Stars: 0 | Forks: 0
# logmon
**具备防篡改功能且保留期符合法律举证标准的 Windows 事件日志归档器。**
`logmon` 是一个 Windows 服务,它按照轮转计划捕获 Windows 事件日志通道,将其归档为带有每个通道清单的、经过哈希处理(和可选签名)的 zip 归档文件,检测篡改和捕获前的日志丢失,并根据每个通道的法定保留规则清理归档。
它是 OS 事件日志系统的**伴侣**,而不是替代品。它从不更改 OS 日志配置。
## logmon 的功能
- **捕获**配置的事件日志通道,通过单一的原子操作
`wevtutil cl /bu:`(备份并清除)—— 已在真实硬件上证明是无损的。
- **按** `(轮转, 保留)` 组**归档**:每个不同的策略组在每个到期周期生成一个 zip 文件,其中包含每个通道的 `.evtx` 文件和带有哈希的清单
(MD5/SHA-1 用于互操作性,SHA-256/SHA-512 作为权威标准;可选 RSA/ECDSA
签名)。
- **证明完整性或披露缺失。** 每个清单都带有一个来源信息块,说明该通道的 OS 配置、被 OS 循环覆盖所破坏的记录的确切数量,以及通俗易懂的完整性声明。
- **检测篡改。** 在首次接触每个通道时,会捕获一次性的 logmon 运行前丢失基线;之后任何非 logmon 执行的清除操作都会触发 CRITICAL 级别的 `EXTERNAL_CLEAR` 警报(logmon 无法知晓意图,因此它会标记每一次无法解释的清除)。
- **合法保留。** 归档文件以明确的 `DELETE-AFTER` 日期命名,并且只有在过了该日期后才会被清理 —— 即使脱离了本系统,文件名本身也是真实、自描述的保留声明。
## logmon 不会做的事
- **绝不**更改 OS 事件日志设置(不使用 `wevtutil sl`)。
- **绝不**干扰 WEF/WEC 订阅。
- **绝不**向其归档的通道中生成事件。
- 不是实时的;它基于计划的轮询周期运行。
- 仅限 Windows。没有跨平台 runtime。
## 组件
| 文件 | 角色 | 权限 |
|---|---|---|
| `logmon.py` | Windows 服务(捕获、哈希、归档、保留、警报) | LocalSystem |
| `logmon_gui.py` | 配置编辑器 —— 通道、provider、保留、警报 | Administrator (提权) |
| `logmon_tray.py` | 每个用户的系统托盘警报监视器 | 无特权 |
| `logmon_reset.py` | 测试系统重置工具 | Administrator |
GUI 和托盘是刻意分开的:配置编辑器必须提权才能写入 `logmon.cfg`,而警报监视器在每次登录时以无特权模式运行,并且对 logmon 拥有的一切都是只读的。
## 环境要求
- **Windows**(Windows 10 / 11 / Server;推荐使用 64 位 Python)
- **Python 3.12**
- **`pywin32`** —— 服务必需
- **`PySide6`** —— GUI 和托盘必需
- **`cryptography`** —— 可选,仅用于签名清单
```
pip install pywin32 PySide6
pip install cryptography # only if you want signed manifests
python -m pywin32_postinstall -install # elevated prompt, once, after pywin32
```
`logmon_reset.py` 没有任何第三方依赖。
## 快速开始
在**提权的**命令提示符中执行:
```
:: install and start the service
python logmon.py --archive C:\EVENT_LOG_ARCHIVE --startup auto install
python logmon.py start
:: open the configuration editor (elevated)
python logmon_gui.py
```
然后,为每个用户启动无特权的警报监视器(它可以通过托盘菜单在登录时自动启动):
```
pythonw logmon_tray.py
```
在 GUI 的 **Channels** 标签页中,选择你想要归档的通道(或使用
**Add Recommended**),在 provider 或通道级别设置轮转/保留,然后点击
**Save**。服务将在约 5 分钟内重新加载(或在下一个周期开始时)。
有关完整的安装/卸载指南和共存注意事项,请参阅 [DEPLOYMENT.md](DEPLOYMENT.md),
有关配置 schema,请参阅 [CONFIG.md](CONFIG.md)。
## 配置方式
通过两个文件进行配置,每个文件都只有**一个写入者**,以消除 GUI 和服务之间因更新丢失而产生的竞态:
- **`C:\ProgramData\logmon\logmon.cfg`** —— 由操作员/GUI 拥有。服务只读取它。
- **`C:\ProgramData\logmon\logmon_state.json`** —— 由服务拥有。GUI 读取它以获取状态。
策略附加到两个 OS 真实的对象上:一个 **Provider**(通道的
`owningPublisher`,或者是事件查看器中的分类 *Windows Logs* /
*Applications and Services Logs*)和一个 **Channel**。通道级别的覆盖优先于其 provider 的默认设置,而 provider 的默认设置优先于全局默认设置(1M 轮转 /
1年 保留)。完整 schema 见 [CONFIG.md](CONFIG.md)。
## 安全与证据完整性
- 归档文件和清单都经过哈希处理;清单可以签名。
- logmon 运行前的丢失基线只捕获一次,如果错过则无法恢复 ——
在测试机器上进行首次捕获之前运行 `logmon_reset.py`,如果需要将该基线作为证据,请在首次运行后保留 `logmon_state.json`。
- 警报以仅追加的方式写入(`alerts.jsonl`),经过 ACL 加固,并同步镜像到经过哈希处理的归档清单中 —— 该清单是权威记录。
- 确认警报会**追加**一条确认记录;它绝不会删除所发生事件的记录。
请按照 [SECURITY.md](SECURITY.md) 报告漏洞。
## License
[PolyForm Noncommercial 1.0.0](LICENSE.md)。个人、教育、慈善、研究和政府用途免费。商业用途需要单独的 license —— 参见 [COMMERCIAL.md](COMMERCIAL.md)。
版权所有 YASDC / Kevin Perryman。
### 第三方依赖
logmon 以 Python 源代码形式发布,不包含任何第三方库;
操作员需单独安装以下依赖,这些依赖受其各自的 license 约束。详情请参见 [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md)。
| 组件 | License |
|---------------|--------------------------------------------|
| PySide6 / Qt | LGPL v3(同时提供 GPL v3 / 商业授权) |
| pywin32 | PSF/BSD-style permissive |
| cryptography | Apache 2.0 OR BSD 3-Clause(可选) |
服务(`logmon.py`)不导入 PySide6 —— 只有 GUI 和托盘会导入。
标签:合规留存, 子域名变形, 数据防篡改, 日志归档, 系统运维, 逆向工具