nginx - 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 非常陌生,因此非常感谢您提供直接简洁的回复。提前谢谢了!
解决方案
访问日志由access_log
andlog_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;
将上面的“模式”替换为匹配任何合法电子邮件地址的正则表达式。
推荐阅读
- java-8 - 如何在哈希映射对象的流内调用函数,并根据流内调用的方法的输出累加总和
- amazon-web-services - 更新 lambda 时 S3 lambda 通知会发生什么情况?
- ios - 如何在 Swift 5 中将 UIView 设置为半圆形
- html - 如何将 div 完全包裹在子 div 周围以避免溢出?
- javascript - 如何在 Vue JS 中添加 window.addEventListener 和删除 window.removeEventListener
- javascript - 如何提高 videojs-record 中 exportImage() 函数截取的屏幕截图质量
- python - 在表单中使用动态选项时,ValueError 需要解压的值太多(预期为 2)
- homebrew - 无法在我的 m1 macbook 上安装自制软件
- laravel - 未选择任何内容时如何删除选择框数组中的空值
- git - Azure devops - 比较两个分支时忽略保存到 git 的某些文件