如何在nginx访问日志中不记录get request参数?

时间:2013-10-09 07:32:46

标签: nginx access-log

我要求启用访问日志,但出于合规性原因,无法在访问日志中记录敏感的GET请求参数数据。虽然我知道,我可以解析日志(事后)并对它们进行消毒,这不是一个可接受的解决方案 - 因为出于合规性原因,日志不能被篡改。

http://www.example.com/resource?param1=123&sensitive_param=sensitive_data

如何防止将“sensitive_data”参数值写入日志?以下是一些想法:

  • 发送POST请求 - 不是JSONP的选项。
  • 对“资源”使用新的位置规则,并设置访问日志以使用log_format,使用不同的格式(即不使用$ remote_addr)。请参阅此参考:http://nginx.org/en/docs/http/ngx_http_log_module.html
  • 记录$ sanitized_remote_addr,然后设置它(以某种方式解析$ remote_addr或其他东西?),然后再将其设为日志。我们不确定这是否容易实现。

应该怎么做?

2 个答案:

答案 0 :(得分:4)

以前的答案无效,因为log_format模块只能在http级配置使用。

为了解决这个问题,我们可以从log_format指令中删除location配置,并将其保存在http level config中。

http {

    log_format filter '$remote_addr - $remote_user [$time_local] '
        '"$temp" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

    # Other Configs
}

log_format指令可以在我们的location指令块中稍后定义变量。

所以最终配置如下:

http {

    log_format filter '$remote_addr - $remote_user [$time_local] '
        '"$temp" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

    # Other Configs

    server {
        #Server Configs
        location / {
            set $temp $request;
            if ($temp ~ (.*)password=[^&]*(.*)) { 
                set $temp $1password=****$2;
            }

            access_log /opt/current/log/nginx_access.log filter;
        }
    }
}

答案 1 :(得分:1)

我到目前为止找到的解决方案是here。简而言之:

location /any_sensitive... {
    # Strip password in access.log
    set $temp $request;
    if ($temp ~ (.*)password=[^&]*(.*)) {
        set $temp $1password=****$2;
    }

    log_format filter '$remote_addr - $remote_user [$time_local] '
        '"$temp" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

    access_log logs/access.log filter;
}

也许这曾经在某个时候起作用,现在它说:

nginx: [emerg] unknown "temp" variable

nginx: [warn] the "log_format" directive may be used only on "http" level in ...