日志脱敏
一、描述
日志脱敏指业务日志进行打印敏感信息时,进行敏感数据的过滤和替换,避免敏感信息的泄露。
二、危害
日志大多数用于问题定位、追溯,大部分情况下只允许运维人员查看,特殊情况下也会做成模块在页面中呈现,当然也会有对日志权限控制不足的情况,就会导致日志信息泄露,如果日志中存在明文敏感信息,则会导致系统的安全极具降低,系统的安全措施失效,被攻击者绕过。
类似举例:一个锁匠,每天需要为很多人售卖高档的锁,理论是不应该记录锁的信息,但是锁匠避免后面出问题,买锁的人忘记了密码打不开锁了或者锁坏了便于维修,于是锁匠记录了锁的信息,锁匠自身是安全的,大家也都信任他,但是锁匠有一天疏忽了,某个路过的小偷不小心看到了记录钥匙本的内容,于是,他根据看到的内容,直接配了一把新的钥匙,此时那把高档的锁成了形同虚设。
三、代码演示
直接记录
LOG.info("password is {}",password);
嵌套对象记录
HashMap map = new HashMap();
map.put("username",username);
map.put("password",password);
LOG.info("userinfo: {}",map);
四、案例
案例就只举一些难以常见的,普通的太明显
案例:某框架(自研或开源)SDK,在连接第三方服务,进行认证时,如果请求报错,会自动将请求参数打印出来,其中包含了配置的秘钥信息。
xxx(不好演示,自行想象)
五、解决方案
一般分为主动和被动两种方案。两者都是要具备的,互相辅助的关系
主动解决:依赖于开发者本身的安全意识,针对重要的敏感信息形成依赖,不对敏感信息进行记录。这就需要开发和清楚哪些是重要信息。每个公司、产品线要求不同,仅针对通用的进行举例
敏感信息举例:
- web认证鉴权相关(sessionId,cookie,jwt,token,Authronzation等用于鉴定用户身份的)
- 业务敏感信息(身份证、银行卡、生物信息、精确位置、口令、验证码、账单、安全手机号、邮箱、通信内容等等很多,具体看公司要求,一般来说涉及个人用户信息的都不建议打印,不同场景属性定义不同)
- 系统配置(数据库密码、加解密钥、第三方服务认证密码、redis密码、证书信息等等用于系统启动、连接、配套的第三方服务的认证信息)
被动解决:依赖于第三方工具或者自研工具监听解决。核心是使用切面工具,监听敏感词,若存在敏感词,则将敏感信息及上下文进行脱敏。
1.自定义PatternLayout,继承实现AbstractStringLayout类,更换log4j的<PatternLayout>,是一种比较常用的写法,自己也用的这个。 我就不写了,看看其他大神链接供参考:JAVA log日志脱敏打印 log4j配置日志脱敏
2.使用默认patternlayout自定义正则,使用log4j字典的regex。
<PatternLayout pattern="%m%n">
<replace regex="正则表达式" replacement="替换,比如****" />
</PatternLayout>
3.自定义messageFactory,参考链接:https://blog.csdn.net/qq_20377675/article/details/122681254g4j
4.包装LoggerFactory(装饰器模式)+ fastjson filter过滤器模式,参考链接:https://blog.csdn.net/qq_20377675/article/details/122681254g4j
自定PatternLayout具体代码示例:
(xxx)
六、排查方法
结合上述的结合方案,很明显两者都有局限性,只能尽最大的可能防止明文打印敏感信息。敏感信息是一个比较大的范围,且没有固定的规则和要求。排查主要是使用自动化的工具,增加发现问题的概率。
推荐的工具seninfo,工具自带了业界常见的很多敏感信息,包含敏感关键词key匹配,敏感信息正则匹配。且支持良好的拓展能力,支持自定义各种自定义关键词匹配。
未找到合适的教程,关于seninfo,看来网络上对于安全这一块果然不是很多, 不过总体使用是比较简单,只是需要不断的完善规则。
七、总结
脱敏是一个很难杜绝的事情,我们需要不断的完善脱敏规则。
写代码时,我们可以通过主动有意识的不打印敏感信息,以及被动的框架规则脱敏检测,减少敏感信息的检测。
除此以外,我们能通过seninfo工具扫描日志文件,排查日志中疑似敏感信息的内容,并不断完善规则和框架的脱敏规则。
敏感信息主要包含 web认证鉴权、业务敏感数据、系统配置三个方面的数据。
- 点赞
- 收藏
- 关注作者
评论(0)