mod_log_forensic是专为请求链路完整性验证设计的法医级模块,强制在请求头接收后和响应完成后写入两条固定格式日志,通过forensic-id关联,用于检测请求篡改或中断;必须用check_forensic校验配对,写入失败会导致子进程立即退出。
mod_log_forensic 不是通用日志增强工具,而是专为请求链路完整性验证设计的“法医级”记录模块——它不替代 access_log,也不能靠它还原完整攻击路径,但能帮你确认某个请求是否被篡改、重写或中途异常终止。
mod_log_forensic 的触发时机和日志结构不可修改
它强制在两个固定时间点写入同一请求的两条日志:一条在接收完全部 HTTP 请求头后(
),一条在响应完成、准备关闭连接前(
)。两条日志用同一个
关联,且格式固定为:
这意味着你无法用
自定义字段,也不能过滤或省略某类请求。一旦启用,所有请求都进 forensic log,包括 400/404/500 等异常请求。
如果 Apache 配置了
或
,
行记录的是原始请求,
行反映的是最终处理结果(比如重写后的 URI、真实后端返回的状态)
若某请求只有
行、缺失
行,说明该请求在处理过程中崩溃、超时或被强制中断(例如被
拦截并 kill 进程)
不再是必需依赖,但若启用,它的 ID 会直接作为 forensic-id 使用;否则模块自动生成 base64 编码的随机 ID
启用时必须配合 check_forensic 脚本做配对校验
Apache 源码包
目录下的
是唯一能安全解析 forensic log 的工具。手动
或
处理极易漏掉单边记录——因为 forensic log 不保证按顺序写入磁盘(尤其在高并发下,父子进程写入可能交错)。
Apache 2.4.62
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
下载
运行
会输出未配对的 ID 列表,每行含缺失类型(
或
)和时间戳
该脚本不读取 access_log,只校验 forensic log 内部一致性;它也不修复数据,只标记异常点供你人工回溯
如果你把 forensic log 接入 ELK 或 Loki,必须先用
做预处理,否则聚合统计会因单边记录产生严重偏差
forensic log 的写入失败会导致 Apache 子进程立即退出
这是它和普通日志模块最危险的区别:
把写入失败视为严重故障,直接调用
。后果是:子进程 core dump(若配置了
),连接被粗暴中断,且不会 fallback 到其他日志方式。
确保 forensic log 所在文件系统有足够空间和写权限,
不要
用管道(
)或 syslog 转发——
只支持普通文件
避免和
混用:log rotation 触发时若恰有请求正在写入,极大概率导致写入失败。应使用
配合
发送
信号给 Apache,并确保 forensic log 在
中不被 mv/rm
在生产环境开启前,务必在测试机上用
或
模拟高并发写入压力,观察是否出现子进程频繁重启
真正关键的不是“怎么记”,而是“怎么信”。
提供的是请求生命周期的原子性断言,不是内容全量快照——它不记录 request body、不加密、不压缩,也不保存 SSL/TLS 层信息。如果你需要重建完整攻击载荷,得靠
或流量镜像,而不是指望 forensic log 里多出几个字段。
beforeafter%{forensic-id}nForensic-ID|Request-Line|Header1: Value1|Header2: Value2|...|
Forensic-ID|Status|Bytes-Sent|...LogFormatmod_rewritemod_proxybeforeafterbeforeaftermod_securitymod_unique_idsupport/check_forensicgrepawk./check_forensic -f /var/log/apache2/forensic.logmissing-aftermissing-beforecheck_forensicmod_log_forensicabort()CoreDumpDirectory|check_forensicrotatelogslogrotateprerotateUSR1postrotateabwrkmod_log_forensicmod_dumpio