如何在nginx日志中屏蔽POST主体的敏感信息?

时间:2016-06-12 08:43:53

标签: nginx

为了便于分析,我们在访问日志中保存$request_body字段。但是,帖子正文中有一些敏感信息,如密码或信用卡号,在日志中公开。我们如何掩盖这些信息?

password=1234asdf  ->  password=****

如果我编写一个nginx模块来屏蔽数据,我应该编写一个新的日志模块,还是应该在调用原始日志模块之前操作请求体? 或者我应该使用nginx-lua来实现这个目标吗? 或者还有其他方法吗?

3 个答案:

答案 0 :(得分:2)

使用' echo_read_request_body'命令获取HTTP POST数据,然后使用' map'过滤密码和正则表达式

map $request_body $req_body_start {
    "~(?<nopwd>.*)\&password=[^\&]*.+"  $nopwd;
    default        $request_body;
}

map $request_body $req_body_end {
    "~.*\&password=[^\&]*(?<nopwd1>.+)"  $nopwd1;
    default        '';
}

 map $request_body $req_body_pwd {
    "~.*\&password=[^\&]*.+"  '&password=****';
    default        '';
}

然后定义log_format并在服务器/位置级别使用它:

log_format  logreqbody  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$req_body_start$req_body_pwd$req_body_end"';

以下是更多信息:https://www.rstcloud.net/blog/30-how-to-hide-sensitive-post-data-in-nginx-log

答案 1 :(得分:1)

一个表达式映射可以掩盖密码字段,而不管其在参数列表中的位置

    map $request_body $request_body_masked {
            "~(?<pretext>.*)(?<pass0>password)=[^&]+(?<last>.*)$"  '$pretext$pass0=*****$last';
            default  '';
    }

经过以下模式测试

  • password =木瓜&id = someuser
  • password =木瓜&
  • password =木瓜
  • &password =木瓜
  • id = someuser&password = papaya&remember = 1
  • id = someuser&password =木瓜

但是,需要对在每个请求主体上运行正则表达式映射的性能成本进行基准测试。

答案 2 :(得分:0)

这是我的版本。

@Yury Sergeev的答案只有在request.body中只有一个IDemo时才有效。但是,如果您在注册页面上拥有password和其他密码,例如confirmation_password,它将无法使用。

我的版本虽然是手动且肮脏的。但是它仍然会隐藏那些密码

&password=pass1234&confirmation_password=pass1234&withdrawal_password=pass1234

您的请求正文,例如map $request_body $req_body_step_1 { "~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request"; default $request_body; } map $req_body_step_1 $req_body_step_2 { "~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request"; default $req_body_step_1; } map $req_body_step_2 $req_body_step_3 { "~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request"; default $req_body_step_2; } map $req_body_step_3 $req_body_step_4 { "~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request"; default $req_body_step_3; } map $req_body_step_4 $req_body_step_5 { "~(?<start_request>.*)\&(?<pwd>.*password)=[^\&]*(?<end_request>.+)" "$start_request$end_request"; default $req_body_step_4; } map $req_body_step_5 $req_body_step_6 { "~(?<pwd>.*password)=[^\&]*(?<end_request>.*)" "$end_request"; default $req_body_step_5; } log_format main '"Request-Body": $req_body_step_6';

将成为username=3124124&password=3124124&confirmation_password=3124124&withdrawal_password=24124134231&real_name=Dean&phone=13412345678&email=xxx@yahoo.com