在 Logstash 的 filter 阶段处理敏感字段,最稳妥的方式是使用 mutate 插件的 remove_field 直接删除,或用 gsub 进行脱敏替换,适用于日志入库前的集中清洗场景。
先说结论:敏感数据应在入库前通过 filter 插件拦截,优先选择直接删除非必要字段,若需保留痕迹则使用正则脱敏。
- 先判断:确认日志中敏感信息是独立字段还是混在文本里
- 优先做:使用 mutate 插件的 remove_field 或 gsub 功能
- 再验证:在测试环境确认 Elasticsearch 中不再存储明文
核心配置示例
Logstash 需要修改 pipeline 配置文件。以下是一个典型的 filter 配置片段,展示了如何删除字段和脱敏:
filter {
mutate {
# 直接删除名为 phone 和 id_card 的字段
remove_field => ["phone", "id_card"]
# 或者对 message 字段中的手机号进行脱敏(保留前 3 后 4)
gsub => [
"message", "(\\d{3})\\d{4}(\\d{4})", "\\1****\\2"
]
}
}将上述内容放入你的 Logstash pipeline 配置文件(通常位于 pipelines.yml 中定义的 .conf 配置文件,如 conf.d/logstash.conf)的 filter 区块中。
核心原理与配置位置
日志系统通常会将数据原样存储到 Elasticsearch 或其他后端,一旦入库,权限控制再严格也存在内部泄露风险。Logstash 位于数据采集和存储之间,是进行数据清洗和脱敏的最佳关口。在此阶段处理,可以确保敏感数据根本不落地到存储层,符合最小化数据收集原则。
注意配置位置:请勿修改 config/logstash.yml(这是主配置),应修改 pipeline 配置文件。默认路径通常在 conf.d/ 目录下,或由 pipelines.yml 指定。
落地实施步骤
1. 确认字段名称
先查看原始日志样本,确定手机号和身份证是独立的 JSON 字段,还是包含在长文本中。如果是独立字段,处理最简单;如果是文本,需要正则匹配。
2. 编写配置
在 filter 段加入 mutate 插件。若需删除字段,使用 remove_field;若需替换内容,使用 gsub。注意 gsub 需要指定字段名、正则表达式和替换值。
3. 语法检查
修改配置后,先运行语法检查命令,确保没有拼写错误:
bin/logstash `--config`.test_and_exit -f config/your.conf4. 重载服务
检查通过后重启 Logstash 或触发配置重载。生产环境建议先在旁路测试,确认无误后再切换流量。
效果验证方法
配置生效后,观察 Elasticsearch 中的新文档。可以通过 Kibana Discover 页面查询最新日志,检查对应字段是否存在或内容是否已变为星号。也可以在 Logstash 输出端临时添加 stdout 插件,将输出打印到控制台进行比对:
output {
stdout { codec => rubydebug }
# 原有的输出配置...
}对比处理前后的日志事件,确认敏感信息已被移除或替换。注意只检查新产生的日志,旧数据不会自动更新。
常见坑与排查
1. 正则匹配不准
手机号和身份证的正则如果写得太宽泛,可能误伤正常数字;太严格又可能漏掉特殊号段。建议先在小样本上测试正则匹配率。
2. 嵌套字段处理
如果敏感字段在嵌套的 JSON 对象里,remove_field 需要写全路径,例如 ["user"]["contact"]["phone"],具体取决于事件结构。
3. 性能损耗
复杂的正则 gsub 操作会消耗 CPU 资源。如果日志量极大,优先选择直接删除字段,避免对大文本进行全量正则扫描。
4. 备份缺失
修改配置前务必备份原文件。一旦配置错误导致 Logstash 无法启动或数据丢失,回滚需要时间。