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

如何在nginx访问日志中不记录get请求参数?,nginx,access-log,Nginx,Access Log,我要求启用访问日志,但出于法规遵从性原因,无法在访问日志中记录敏感GET请求参数的数据。虽然我知道,我可以解析日志(事后)并对其进行清理,但这不是一个可接受的解决方案——因为出于法规遵从性原因,日志不能被篡改 如何防止“敏感数据”参数值写入日志?以下是一些想法: 发送POST请求——不是JSONP的选项 为“资源”使用新的位置规则,并将访问日志设置为使用不同格式的日志格式(即不使用$remote\u addr)。请参见以下参考: 记录$sanitized_remote_addr,并在它进入日

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

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

  • 发送POST请求——不是JSONP的选项
  • 为“资源”使用新的位置规则,并将访问日志设置为使用不同格式的日志格式(即不使用$remote\u addr)。请参见以下参考:
  • 记录$sanitized_remote_addr,并在它进入日志之前对其进行设置(以某种方式解析$remote_addr或其他什么?)。我们不确定这是否容易实现

如何做到这一点?

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

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


前面的答案不起作用,因为
log\u格式
模块只能在
http
配置级别使用

http {

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

    # Other Configs
}
为了解决这个问题,我们可以从
location
指令中删除
log\u格式
配置,并将其保留在http级别配置中

http {

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

    # Other Configs
}
log\u格式
指令可以在后面的
位置
指令块中定义变量

因此,最终配置将如下所示:

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

您可能还想考虑一下,如果它只是一个/两个日志文件,您可以使用管道并用过滤器监听输出。然后过滤器可以写入真正的日志文件。不,你是对的,只要你在某个地方设置了变量,nginx就不应该抱怨未知变量。我将您的答案改编成一个工作解决方案,如下所述:有人知道我如何将其应用到AWS Elastic Beanstalk环境中吗?我没有为nginx做任何类型的手动设置,它是从启动应用程序环境开始的所有默认配置。我知道我有一个
/ebextensions/nginx.config
文件,但它实际上是空的。只是一个更新最大文件大小的设置,但格式与这里显示的完全不同。我已经知道我需要为AWS EB做什么。正在研究如何做到这一点。我提到的配置允许我在服务器设置完成但尚未部署和连接之前创建文件并在服务器上运行“容器命令”。Server指令还隐藏在自动生成的文件中,该文件在主nginx.config的http指令中导入。因此,我必须要么编写bash脚本,要么使用unix命令修改自动生成的文件,以包含log_format and locations指令,然后通过容器命令重新加载nginx服务器。