【问题标题】:How to not log a get request parameter in the nginx access logs?如何不在 nginx 访问日志中记录获取请求参数?
【发布时间】:2013-10-16 10:36:54
【问题描述】:

我需要启用访问日志,但出于合规性原因,无法在访问日志中记录敏感的 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 或其他内容?)。我们不确定这是否容易实现。

这应该怎么做?

【问题讨论】:

标签: nginx access-log


【解决方案1】:

上一个答案将不起作用,因为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;
        }
    }
}

【讨论】:

  • 有谁知道我如何将它应用到 AWS Elastic Beanstalk 环境中?我没有为 nginx 做任何手动设置,它是启动应用程序环境的所有默认配置。我知道我有一个./ebextensions/nginx.config 文件,但它实际上是空的。只是更新最大文件大小的设置,但格式与此处显示的完全不同。
  • 我已经弄清楚我需要为 AWS EB 做什么。正在研究如何做到这一点。我提到的配置允许我在服务器完成设置但在部署和连接之前创建文件并在服务器上运行“容器命令”。 Server 指令也隐藏在一个自动生成的文件中,该文件被导入到主 nginx.config 中的 http 指令中。因此,我必须编写一个 bash 脚本或使用 unix 命令来修改自动生成的文件以包含 log_format 和位置指令,然后通过容器命令重新加载 nginx 服务器。
【解决方案2】:

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

【讨论】:

  • 也许如果它只是一/两个日志文件,您可以使用管道并通过过滤器监听这些输出来清理输出。然后过滤器可以写入真正的日志文件。
  • 不,你说得对,只要你在某处设置了变量,nginx 不应该抱怨未知变量。我将您的答案改编成一个可行的解决方案,如下所述:github.com/sunlightlabs/congress/tree/master/config/…
猜你喜欢
  • 2012-11-07
  • 2020-12-14
  • 2014-06-13
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多