如何使用journalctl过滤系统信息中的个人敏感信息?
当然可以!用journalctl配合一些常用工具,完全能把MAC/IP地址、证书、固件密钥这类敏感信息给过滤掉,我给你分享几个实用的方案:
一、实时查看/导出日志时临时脱敏
这是最直接的方法,用管道结合sed这类文本处理工具,把敏感内容替换成掩码:
屏蔽IP和MAC地址
用正则表达式匹配常见的IPv4和MAC格式,直接替换成占位符:journalctl | sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/XXX.XXX.XXX.XXX/g; s/([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/XX:XX:XX:XX:XX:XX/g'如果需要处理IPv6地址,只要调整正则就行,比如把匹配IPv6的规则加进去:
sed -E 's/([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}/XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/g'隐藏证书和密钥块
证书、固件密钥这类通常有固定的开头结尾标识(比如-----BEGIN CERTIFICATE-----),直接把整个块替换成提示文本:journalctl | sed -E '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/c [REDACTED CERTIFICATE]'同理,密钥的话只要把匹配的开头结尾换成对应的就行,比如
-----BEGIN PRIVATE KEY-----。导出脱敏后的日志文件
如果要把清理后的日志保存下来,直接把输出重定向到文件就行:journalctl --since "2024-05-01" --until "2024-05-02" | sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/XXX.XXX.XXX.XXX/g' > cleaned_system_logs.txt
二、配置系统,让日志从根源上不记录敏感信息
如果不想事后再处理,还可以让systemd-journald在记录日志时就过滤掉敏感内容,更彻底:
通过journald配置过滤特定服务日志
编辑/etc/systemd/journald.conf(或者在/etc/systemd/journald.conf.d/下新建自定义配置文件,比如redact.conf),添加类似规则来限制某些服务的日志级别,或者直接屏蔽:[Journal] # 禁止记录某个服务的日志 # FilterSystemd=some-sensitive-service.service:~* # 或者只记录该服务的警告及以上级别日志,减少敏感信息概率 # MaxLevelStore=warning修改后记得重启journald服务:
systemctl restart systemd-journald配合rsyslog做深度脱敏
如果需要更复杂的过滤规则,可以让journald把日志转发给rsyslog,在rsyslog里配置模板替换敏感内容。比如在rsyslog的配置文件里添加:template(name="RedactedLog" type="string" string="%timestamp:::date-rfc3339% %hostname% %syslogtag% %msg:s/([0-9]{1,3}\.){3}[0-9]{1,3}/XXX.XXX.XXX.XXX/g%\n") *.* action(type="omfile" file="/var/log/redacted.log" template="RedactedLog")这样存储的日志就是提前脱敏好的。
三、额外小技巧
- 如果知道某些特定日志条目包含敏感信息,可以用
journalctl的字段过滤直接排除,比如:journalctl -u !some-sensitive-service.service # 排除某个服务的日志 journalctl MESSAGE_ID=!some-message-id # 排除特定类型的日志条目 - 正则表达式可以根据你实际遇到的敏感信息格式调整,比如有些系统里MAC地址可能用
-分隔,就把正则里的:换成[-:]。
备注:内容来源于stack exchange,提问作者Glenn G.




