防止 Apache 2 服务器记录敏感数据

防止 Apache 2 服务器记录敏感数据

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=secretpassword=[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,请执行以下操作:

  1. 创建/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
    
  2. 在 apache 中启用 mod_luaa2enmod lua

  3. 在 apache 配置中的某处设置 lua 日志钩子:

    <IfModule lua_module>
        LuaHookLog /etc/apache2/log_mask.lua log_mask_password
    </IfModule>
    
  4. 修复你的 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 的内部工作原理。

相关内容