Apache 2 默认记录整个请求 URI,包括每个请求的查询字符串。
有什么直接的方法可以防止 Apache 2 Web 服务器记录敏感数据(例如密码、信用卡号等),但仍记录其余请求?
我想像 Apache 默认那样记录所有登录尝试,包括尝试的用户名,并阻止 Apache 直接记录密码。
我查看了 Apache 2 文档,除了完全阻止记录这些请求(使用 SetEnvIf)之外,似乎没有简单的方法可以做到这一点。
我怎样才能做到这一点?
答案1
Apache 2 默认记录整个请求 URI,包括每个请求的查询字符串。
有什么直接的方法可以防止 Apache 2 Web 服务器记录敏感数据(例如密码、信用卡号等),但仍记录其余请求?
我读得对吗?您正在将 URI 中的敏感信息作为 QueryString 发送?我建议首先更改应用程序,以便它能够这样做。
那么,就不需要更改 apache,因为默认情况下它不会执行任何这样的事情。
答案2
您可以通过将 CustomLog 指令与一些 sed magic 结合起来,在密码进入 access.log 之前对其进行屏蔽(如https://stackoverflow.com/a/9473943/102170):
这将替换所有出现password=secret
的password=[FILTERED]
/你的/路径/access.log:
CustomLog "|/bin/sed -u -E s/'param=[^& \t\n]*'/'param=\[FILTERED\]'/g >> /your/path/access.log" combined
话虽如此,如果可能的话,最好避免将敏感数据放入查询字符串中。
答案3
您阅读GET 和 POST 之间的区别并重写您的应用程序以停止将密码和信息放在 GET 参数中。
答案4
您可以在日志阶段使用以下命令修改一些请求参数LuaHookLog(mod_lua)。尽管请求行('combined' 日志格式中的 %r)是只读的,但您可以直接屏蔽查询字符串,然后微调所有日志格式以使用它。要在查询字符串中屏蔽 password=XXX,请执行以下操作:
创建/etc/apache2/log_mask.lua:
function log_mask_password(r) if r.args then r.args = r.args:gsub("([pP][aA][sS][sS][wW][oO][rR][dD])=[^&=]*(&?)", "%1=XXX%2") end return apache2.OK end
在 apache 中启用 mod_lua
a2enmod lua
在 apache 配置中的某处设置 lua 日志钩子:
<IfModule lua_module> LuaHookLog /etc/apache2/log_mask.lua log_mask_password </IfModule>
修复你的 LogFormat 以使用“%m%U%q%H”而不是“%r”。例如:
LogFormat "%a %l %u %t \"%m %U%q %H\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
不要忘记修复所有其他日志格式,以防止所有日志格式的密码泄露!
另外,您只需return apache2.DONE
在 lua 代码中执行即可完全删除日志消息(这将是另一个带有一些 if 和敏感数据模式匹配的代码)。
警告:不建议您在与您不信任的用户(以及有权修改 apache 配置文件的用户)共享的服务器上使用 lua 模块,因为它可能会被滥用来更改 httpd 的内部工作原理。