Apache动态请求审计通过expr=正则精准提取查询参数、Cookie和自定义Header关键字段,用独立LogFormat写入专用日志,并对敏感字段脱敏、限制权限以保障安全合规。
在 Apache 中配置针对动态请求的访问审计,核心是精准捕获请求中携带的敏感或关键字段(如查询参数、Cookie、自定义 Header),并将其结构化记录到独立审计日志中。不依赖后端,纯由 Apache 在请求进入阶段完成提取与落盘,兼顾实时性、可控性和合规要求。
动态请求通常通过 URL 查询参数(?uid=123&debug=true)、Cookie(auth_token=abc; user_id=456)或自定义 Header(X-Trace-ID: req-789)传递业务上下文。审计重点不是记录整条请求行,而是从中分离出可识别、可关联、需追踪的字段:
uid、callback、debug 等用于调试或身份标识的键auth_token、session_id、impersonate_as 等认证与权限相关字段X-Request-ID、X-Forwarded-For、X-Auth-User 等由网关或前端注入的可信标识Apache 2.4.7+ 原生支持 %{expr=}s 语法,无需额外加载 mod_rewrite 或 mod_setenvif 即可完成字段抽取。这是最轻量、最可靠的方式:
uid 参数:%{expr=%{QUERY_STRING} =~ /uid=([^&;]+)/ ? $1 : '-'}
auth_token Cookie:%{expr=%{reqhdr('Cookie')} =~ /auth_token=([^;]+)/ ? $1 : '-'}
X-Trace-ID Header:%{expr=%{reqhdr('X-Trace-ID')} ?: 'MISSING'}
正则设计要点:用 [^&;]+ 或 [^;]+ 替代 .* 防止跨键匹配;默认值统一设为 - 或 MISSING,保障日志字段对齐。
不要把审计字段混入主访问日志。单独定义 LogFormat,并绑定到独立 CustomLog:
LogFormat "%h %t "%r" %>s %b %{UNIQUE_ID}e %{expr=%{QUERY_STRING} =~ /uid=([^&;]+)/ ? $1 : '-'}s %{expr=%{reqhdr('Cookie')} =~ /auth_token=([^;]+)/ ? $1 : '-'}s "%{X-Request-ID}i"" audit_dynamic
CustomLog /var/log/apache2/audit-dynamic.log audit_dynamic
%{UNIQUE_ID}e 提供全链路请求唯一标识,便于与错误日志、后端日志交叉溯源审计日志本身是高价值攻击面,必须前置防护:
auth_token、user_id 等字段做掩码处理,例如:%{expr=%{reqhdr('Cookie')} =~ /user_id=([^;]+)/ ? substr($1,0,3) .. '***' : '-'}
640,属组限定为 auditlog,仅限日志分析服务与授权人员读取Authorization),优先使用后端重写后的可信字段(如 X-Auth-User-ID)