背景
随着数字化的推进,个人敏感信息保护显得越来越重要。 当前国家也推出了若干法律法规来完善个人信息的保护。累积出台的法律法规:
- 《网络安全法》第四十二条
- 《民法典》第一百一十一条
- 《侵犯公民个人信息刑事案件适用法律若干问题的解释》第九条
- 《刑法》第二百五十三条
- 《全国人民代表大会常务委员会关于加强网络信息保护的决定》
敏感信息泄漏对企业往往造成恶劣的影响, 因此往往在数据传输和存储层会做若干的信息安全加固处理。常见的是在数据库存储层对个人信息进行加密处理。
而在个人信息防护方面,另一个信息存储往往被忽略,那就是在程序运行过程中产生的日志,往往也会带有个人信息,因此需要一套针对日志中的个人敏感信息处理的方案。 本文主要是介绍基于阿里云日志服务的含个人敏感信息的解决方案。
阿里云日志服务介绍
日志服务(Log Service,简称SLS)是针对日志类数据的一站式服务,在阿里巴巴集团经历大量大数据场景锤炼而成。您无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立DT时代海量日志处理能力。
数据加工
数据加工服务是阿里云SLS推出的面向日志ETL处理的服务,主要解决数据加工过程中转换、过滤、分发、富化等场景。
SLS数据加工DSL是专门为日志实时行处理定制的一套语言(类似Python),本文档的目的也是让快速掌握该DSL,解决日志分析的问题
一般敏感信息处理链路
整体处理链路如下:
客户端(服务器、移动设备等)日志,可通过对原文进行AES加密后上报(可选),进而上报到SLS中心Logstore。中心Logstore由管理员统一控制。 针对有数据使用场景的业务方,对相关字段进行解密、脱敏后分发使用,提升数据安全性。
关于客户端上报是否需要进行AES加密的权衡。 目前SLS上所有上报链路为https加密的数据链路。如果上报源头存在可能因入侵等场景导致上报端的日志被泄露,建议进行AES加密处理。
Step1. 上报的中心日志解密
如果客户端上的日志是经过AES加密的,在分发前,需要进行AES解密,才能被后续流程使用,使用数据加工进行AES解密的方法如下。
函数格式
aes_encrypt(data,key,mode,pad_style,pad_block,input_format,input_encoding,output_format,iv)
原始日志样例
address:AUwGWWpzheh9cfh2Qsbx+gYREkY8TMCf3mIeMehaU04bvsbx8pT9G3BGUsnwX8Ix bank_account:xdM2rKQKLLfW7BYLplmHJYxe/2EbCN7nFdlz2VrEMiw= birthday:yGoOp74SuciGlPPRztiFBWmjF8qdHbSJZyJasKpLoZw= email:jMyyxmrYhe82LAz962VJglamKtvEmeD1uMj4aLYHvto= identify_id:3aL9b+VRG1oaTR5NVcnjzNJDZW/1c3mC9O+L48mrCj0= key:qwertyuiopasdfgh name:9ybq7Ofg3Xit15jrcsRX6A== passport:yyFK8matGwn8/RAVOC6e+A== phone_number:mh1SDicI272mD8f/6FpTVQ== telephone:EdApwBdkjj2FTXL8h4NOCg==
AES解密
e_set("key", "qwertyuiopasdfgh") e_set( "address",aes_decrypt(v("address"), v("key"), iv=b"qwertyuiopasdfgh", input_format="base64"), "bank_account",aes_decrypt(v("bank_account"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "birthday",aes_decrypt(v("birthday"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "email",aes_decrypt(v("email"), v("key"), iv=b"qwertyuiopasdfgh", input_format="base64"), "identify_id",aes_decrypt(v("identify_id"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "name",aes_decrypt(v("name"), v("key"), iv=b"qwertyuiopasdfgh", input_format="base64"), "passport",aes_decrypt(v("passport"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "phone_number",aes_decrypt(v("phone_number"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "telephone",aes_decrypt(v("telephone"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), )
解密结果
address:河南省郑州市长安区龙朔路 bank_account:1234567890000000000 birthday:1985年10月23日 email:12345678910@qq.com identify_id:123456100001111234 key:qwertyuiopasdfgh name:张三 passport:G87654321 phone_number:12345671234 telephone:1234-7654321
Step2. 脱敏
常见的敏感信息场景
- 身份证号/护照号
- 手机号
- 家庭地址
- 银行卡号
- 生日
脱敏方案1 使用正则进行数据脱敏
用户信息 |
规则 |
示例 |
姓名 |
显示姓氏,按名字字数显示* |
张二三->张** 上官清风->上官** |
手机号码 |
显示前三位和后两位 |
15202486995->152******95 |
电话号码 |
区号后前两位和后两位 |
021-36221801->021-36****01 |
身份证 |
显示第一位和最后一位 |
123456789012345678->1***************8 |
护照 |
显示第一位和最后一位 |
G12345678->G*******8 |
邮箱 |
"@"前第一位和最后一位显示 |
123456789@qq.com->1********9@qq.com xyz56789@ |
用户生日 |
x月和x日(只显示月份和日期),不显示年 |
2018年1月20日->1月20日 |
银行卡号 |
无论是信用卡还是储蓄卡,只显示后四位 |
6216613600013640819->*********0819 |
地址 |
隐藏区/县级以下部分的地址 |
上海市杨浦区****** 湖南省长沙市长沙县****** |
脱敏方案2 使用MD5进行hash脱敏
用户信息 |
规则 |
示例 |
姓名 |
md5 32位 16进制 |
张三->615db57aa314529aaa0fbe95b3e95bd3 |
手机号码 |
md5 32位 16进制 |
15202486995->c7fe7a3a13048586c6ce7b532404434f |
电话号码 |
md5 32位 16进制 |
021-36221801->eb1dece5ce972638a01df9bf83b7ff80 |
身份证 |
md5 32位 16进制 |
123456789012345678->9efebb3d7d059bff092842bf31dd2816 |
护照 |
md5 32位 16进制 |
G12345678->06f2f69031db28b1cbd1f1c5af6d5818 |
邮箱 |
md5 32位 16进制 |
123456789@qq.com->315be36db8ad7b3e3a7bb0839d6fa839 |
用户生日 |
md5 32位 16进制 |
2018年1月20日->34eb529831095d08f150dd352f496aa8 |
银行卡号 |
md5 32位 16进制 |
6216613600013640819->ae4ddb17baadcdab0e97e714575196ca |
地址 |
md5 32位 16进制 |
陕西省西安市雁塔区科技三路 >4f6df5552bd983225386e15786d50209 |
脱敏方案性能对比
events:100W
shard:2
单行日志大小:290B
方案 |
性能(eps/shard) |
正则脱敏 |
6000 |
MD5加密 |
8000 |
Step3. 分发给使用方
如上的日志样例,现管理员需要按照日志中的不同省份将日志分发给不同的业务方,但不能暴露出用户的联系方式,如手机号码、电话号码及邮箱,此时需要对日志里的这些信息做脱敏处理后分发。
加工语句
e_set( "phone_number",regex_replace(v("phone_number"), r"(\b['\"]?1\d{2})\d{6}(\d{2}['\"]?\b)", replace=r"\1****\2"), "telephone",regex_replace(v("telephone"), r"(\d{3,4}-\d{2})\d{3}(\d{2})", replace=r"\1****\2"), "email",regex_replace(v("email"),r"([A-Za-z0-9])[A-Za-z0-9\-_\.]*([A-Za-z0-9]@[A-Za-z\d]+[-.]+[A-Za-z\d]{2,4})",replace=r"\1****\2",), ) e_if(e_search("address: 河南省"), e_output(name="henan",project="test-tuomin",logstore="target_henan"), e_search("address: 四川"),e_output(name="sichuan",project="test-tuomin",logstore="target_sichuan")) e_drop()
分发结果
可以看到,我们的加工任务已将脱敏后的数据成功分发至不同的目标Logstore。
实战
某电商网站,打印交易信息日志, 通过脱敏+MD5的方法进行信息防护
加工准备
由于使用regex算子进行数据脱敏,可能会出现数据加工延迟问题,因此建议您在使用前提前扩充shard。
shard分裂
点击源Logstore左侧箭头后,点击下方的修改按钮,在Logstore属性页面点击修改,即可对Logstore的shard进行修改操作。
在shard管理页面的操作一栏里,会有分裂/合并的操作按钮,点击按钮即可进行我们想要的操作。操作完成后点击保存。
配置加工任务
步骤一 数据加工
进入data_supervision,单击数据加工。
步骤二 编写加工代码
解密
e_set("key", "qwertyuiopasdfgh") e_set( "address",aes_decrypt(v("address"), v("key"), iv=b"qwertyuiopasdfgh", input_format="base64"), "bank_account",aes_decrypt(v("bank_account"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "birthday",aes_decrypt(v("birthday"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "email",aes_decrypt(v("email"), v("key"), iv=b"qwertyuiopasdfgh", input_format="base64"), "identify_id",aes_decrypt(v("identify_id"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "name",aes_decrypt(v("name"), v("key"), iv=b"qwertyuiopasdfgh", input_format="base64"), "passport",aes_decrypt(v("passport"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "phone_number",aes_decrypt(v("phone_number"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), "telephone",aes_decrypt(v("telephone"),v("key"),iv=b"qwertyuiopasdfgh",input_format="base64",), )
脱敏+MD5
e_if_else( op_lt(op_len(v("name")), 3), e_set("name", md5_encoding(regex_replace(v("name"), r"^(.{1}).{1}$", replace=r"\1*"))), e_set( "name", md5_encoding(regex_replace( v("name"), r"^((.{2}).{2})|((.{1}).{2})$", replace=r"\2\4**" )), ), ) e_set("phone_number", md5_encoding(regex_replace(v("phone_number"), r"(\b['\"]?1\d{2})\d{6}(\d{2}['\"]?\b)", replace=r"\1****\2")), "telephone", md5_encoding(regex_replace(v("telephone"), r"(\d{3,4}-\d{2})\d{4}(\d{2})", replace=r"\1****\2")), "identify_id", md5_encoding(regex_replace(v("identify_id"), r"(\d)\d{16}([\dX])", replace=r"\1****************\2")), "passport", md5_encoding(regex_replace(v("passport"), r"(G)\d{7}(\d)", replace=r"\1*******\2")), "email", md5_encoding(regex_replace(v("email"),r"([A-Za-z0-9])[A-Za-z0-9\-_\.]*([A-Za-z0-9]@[A-Za-z\d]+[-.]+[A-Za-z\d]{2,4})", replace=r"\1****\2")), "birthday", md5_encoding(regex_replace(v("birthday"), r"\d{4}\w?[年]", replace=r"")), "bank_account", md5_encoding(regex_replace(v("bank_account"), r"\d{15}([\d]+)", replace=r"******************\1")), "address", md5_encoding(regex_replace(v("address"), r"(\b['\"]?\w+[县区])\w+(['\"]?\b)", replace=r"\1****\2")) )
步骤三 预览调试
在原始日志栏里,挑选几条数据添加到测试数据,然后单击快速预览,查看加工效果。
步骤四 保存加工任务
保存调试好的加工任务。目标logstore需要提前创建并开启索引。
步骤五 查看加工任务
在保存加工任务确定后,加工任务将持续运行。在源Logstore下的加工菜单里,可以看到该任务。
步骤六 查看任务运行状态
数据检索
数据进行脱敏加密+MD5后,可根据加密后的key进行检索。
总结
本文主要介绍了基于阿里云SLS数据加工实现个人信息脱敏的三种实现方案及性能分析。
- regex脱敏(regex_replace)
- aes加密(aes_encrypt)
- md5编码(md5_encoding)
相关参考
- 数据加工正则表达式函数:https://help.aliyun.com/document_detail/125411.htm?spm=a2c4g.11186623.0.0.5d3e39b48rA5pX#concept-1130521
- 数据加工编码解码函数:https://help.aliyun.com/document_detail/125413.htm?spm=a2c4g.11186623.0.0.5d3e50ee4a3kUG#concept-1130525
- shard管理:https://help.aliyun.com/document_detail/48998.html?spm=5176.21213303.J_6028563670.7.1d833edaXIT6RJ&scm=20140722.S_help%40%40%E6%96%87%E6%A1%A3%40%4048998.S_hot%2Bos0.ID_48998-RL_shard%E6%93%8D%E4%BD%9C-OR_helpmain-V_2-P0_0