我要求启用访问日志,但出于合规性原因,无法在访问日志中记录敏感的GET请求参数数据。虽然我知道,我可以解析日志(事后)并对它们进行消毒,这不是一个可接受的解决方案 - 因为出于合规性原因,日志不能被篡改。
http://www.example.com/resource?param1=123&sensitive_param=sensitive_data
如何防止将“sensitive_data”参数值写入日志?以下是一些想法:
应该怎么做?
答案 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 ...