首页 > 解决方案 > Nginx - 基于正则表达式匹配隐藏/屏蔽/更改日志中的值

问题描述

MY API 要求在请求的路径中使用电子邮件地址作为资源的标识符,例如:

/api/users/john.smith@company.com

由于担心个人身份信息 (PII) 存储在日志中,我正在寻找一种方法来打开以下日志:

{ip_address} - - [04/Mar/2021:11:22:22 +0000] "GET /api/users/john.smith@company.com HTTP/1.1" 200 961 "{request_from}" etc.

变成如下内容:

{ip_address} - - [04/Mar/2021:11:22:22 +0000] "GET /api/users/*email_redacted* HTTP/1.1" 200 961 "{request_from}" etc.

我在标题中提到基于正则表达式匹配执行此操作,因为这似乎是检测电子邮件是否在初始日志中的明显方法。

我对 Nginx 非常陌生,因此非常感谢您提供直接简洁的回复。提前谢谢了!

标签: nginxloggingservernginx-reverse-proxynginx-config

解决方案


访问日志由access_logandlog_format指令控制(有关详细信息,请参阅本文档)。

默认情况下,访问日志会记录$request变量的值,其中包含您希望更改的字符串。

您可以使用map语句更改$request变量的文本,并使用log_format语句为使用编辑值的日志文件定义新格式。有关详细信息,请参阅此文档

例如:

map $request $redacted {
    default $request;
    ~^(?<prefix>.*)pattern(?<suffix>.*)$ $prefix*email_redacted*$suffix;
}

log_format redacted '$remote_addr - $remote_user [$time_local] '
    '"$redacted" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" "$gzip_ratio"';

access_log /var/log/nginx/access.log redacted;

将上面的“模式”替换为匹配任何合法电子邮件地址的正则表达式。


推荐阅读