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 和托盘会导入。
标签:合规留存, 子域名变形, 数据防篡改, 日志归档, 系统运维, 逆向工具