如何在Apache-httpd日志中屏蔽明文密码?
解决Apache HTTPD日志中明文显示密码的问题
方法一:通过mod_rewrite修改日志中的查询字符串
- 确保已启用mod_rewrite模块(检查httpd.conf中是否加载
mod_rewrite.so) - 在站点配置或.htaccess中添加规则,将查询字符串里的
password参数值替换为***并存入环境变量:
RewriteEngine On # 匹配包含password参数的查询字符串,替换值为*** RewriteCond %{QUERY_STRING} (.*)(password=)([^&]+)(.*) RewriteRule ^.*$ - [E=SAFE_QUERY:%1%2***%4] # 无password参数时,直接使用原始查询字符串 RewriteRule ^.*$ - [E=SAFE_QUERY:%{QUERY_STRING},L]
- 修改自定义日志格式,用环境变量
SAFE_QUERY替代原生的查询字符串字段:- 若原日志格式包含
%q(带?的查询字符串)或%{QUERY_STRING}i,替换为?%{SAFE_QUERY}e - 示例修改后的LogFormat:
LogFormat "%h %l %u %t \"%m %U?%{SAFE_QUERY}e %H\" %>s %b" custom_combined - 若原日志格式包含
- 重启Apache服务生效。
方法二:使用mod_security过滤敏感日志内容
如果已启用mod_security模块,可添加规则直接在日志阶段替换敏感参数:
# 针对指定的oauth token接口,替换password参数值 SecRule REQUEST_URI "@streq /uaa/oauth/token" "phase:logging,t:none,t:replaceQueryStringArg,password=***,id:10001,msg:'Mask password in logs'"
重启Apache后,该接口的日志中password值会被自动屏蔽。
根源优化建议
OAuth2的password模式更推荐将username和password放在POST请求的**请求体(Body)**中,而非URL查询字符串。Apache默认日志不会记录请求体,可从根源避免密码出现在日志里。需要调整应用端的请求发送逻辑,将参数以application/x-www-form-urlencoded格式放在Body中。
内容的提问来源于stack exchange,提问作者Adwet Ojha
相关产品推荐
相关产品推荐

