敏感字段标注问题
数据仓库里,多多少少会有一些敏感字段,比如用户手机号、通信地址,一旦泄露危害很大。而数据仓库需要尽可能方便让用户使用,同时又要保护敏感字段不能随意访问,一方面需要知道哪些字段是敏感的,另一方面是对敏感字段做更高级别的权限控制。本文主要描述如何发现敏感字段。
要知道哪些字段是敏感的,可以去咨询相关领域的数据开发者,但是这样做有局限性,主要是费时费力,而且标注不全,一旦新增字段或者已有字段发生变更,难以及时跟进。于是我们考虑去尝试敏感字段自动化标注。
敏感字段标注方案
先要知道哪些字段会是敏感的。我们认为,银行卡号、证件号、手机号、邮箱、QQ号、微信号、通讯地址、人名,这些都是敏感的。
接下来的问题是怎么自动发现这些字段。我们考虑从两个方面考虑
- 定期全库扫描,识别出敏感字段
- 新增或修改的表,实时识别出敏感字段
- 根据字段级血缘关系,上游若是敏感字段,下游不是聚合结果,那也还是敏感字段
这里的前两条都是通过程序识别敏感字段,第三条则是血缘关系在安全方面的应用。下面主要描述敏感字段的识别。根据血缘的传播,只要元数据具备相关能力,实现会比较简单。
实现敏感字段识别
把敏感字段分三类
- 银行卡号、证件号、手机号,有明确的规则,可以根据正则表达式匹配
- QQ号、微信号,没有明确规则,任意一串字符串都可能,通过简单正则表达式匹配内容,再加上字段名称规范,例如字段名含有qq或wechat的字段
- 通讯地址、人名,没有明确规则,通过自然语言处理算法来识别,有不少开源的算法包可以使用
明确了规则后,实现上还有不少问题
- 全库扫描在工程上不现实,消耗的计算资源太大。考虑使用采样的方式,每个字段采样其中的100条
- 存在脏数据或者算法本身有误判,影响最终结果,比如有的用户手机号是空的,有的包含了+86-或者空格等特殊字符不能匹配正则。考虑当达到一定比例,就认为是敏感字段。
- 与权限系统打通,可以有离线批处理,以及实时调用api的方式,这个根据系统实际情况考虑
最终效果
敏感字段自动识别开发之前,我们通过手工标注的方式,给将近一百个字段标注为敏感,当时以为标注很全了。实际运行的结果让我们大吃一惊,发现了约3000个敏感字段,实际验证发现识别准确率非常高,并没有误判。有大量临时表、较少被人使用的表里,存在敏感字段,很容易被管理员或数仓开发者忽略。
通过敏感字段自动识别,提升了系统安全能力,也节省了后续维护人力。