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

xiozqbni  于 2023-03-29  发布在  Nginx
关注(0)|答案(2)|浏览(174)

我需要启用访问日志,但出于合规性原因,不能在访问日志中记录敏感的GET请求参数的数据。虽然我知道,我可以解析日志(事后)并清理它们,但这不是一个可接受的解决方案-因为出于合规性原因,日志不能被篡改。
http://www.example.com/resource?param1=123&sensitive_param=sensitive_data
如何防止“sensitive_data”参数值被写入日志?以下是一些想法:

  • 在POST请求中发送--这不是JSONP的选项。
  • 为“resource”使用新的位置规则,并将访问日志设置为使用不同格式的log_format(即不使用$remote_addr)。请参阅以下内容以供参考:http://nginx.org/en/docs/http/ngx_http_log_module.html
  • 记录一个$sanitized_remote_addr,并在它进入日志之前设置它(以某种方式解析$remote_addr或其他东西?)。我们不确定这是否容易完成。

应该如何做到这一点?

w80xi6nr

w80xi6nr1#

由于log_format模块只能在http级别配置中使用,因此前面的答案不起作用。
为了解决这个问题,我们可以从location指令中删除log_format配置,并将其保留在http级别配置中。

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;
        }
    }
}

请注意,错误日志可能仍然会记录此信息。在location块中使用error_logs off;来禁用此功能(假设您可以在应用程序的其他位置记录这些错误)

sxissh06

sxissh062#

到目前为止,我找到的解决方案是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 ...

相关问题