阿里云SLS数据加工实现个人敏感信息脱敏实践

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 为保证数据安全性,通常对日志里的敏感信息做脱敏处理。本文档介绍基于阿里云日志服务的含个人敏感信息脱敏的解决方案。

背景

随着数字化的推进,个人敏感信息保护显得越来越重要。 当前国家也推出了若干法律法规来完善个人信息的保护。累积出台的法律法规:

  • 《网络安全法》第四十二条
  • 《民法典》第一百一十一条
  • 《侵犯公民个人信息刑事案件适用法律若干问题的解释》第九条
  • 《刑法》第二百五十三条
  • 《全国人民代表大会常务委员会关于加强网络信息保护的决定》

敏感信息泄漏对企业往往造成恶劣的影响, 因此往往在数据传输和存储层会做若干的信息安全加固处理。常见的是在数据库存储层对个人信息进行加密处理。

而在个人信息防护方面,另一个信息存储往往被忽略,那就是在程序运行过程中产生的日志,往往也会带有个人信息,因此需要一套针对日志中的个人敏感信息处理的方案。 本文主要是介绍基于阿里云日志服务的含个人敏感信息的解决方案。

阿里云日志服务介绍

日志服务(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)

相关参考

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
30天前
|
SQL 存储 人工智能
阿里云日志服务的傻瓜式极易预测模型
预测服务有助于提前规划,减少资源消耗和成本。阿里云日志服务的AI预测服务简化了数学建模,仅需SQL操作即可预测未来指标,具备高准确性,并能处理远期预测。此外,通过ScheduledSQL功能,可将预测任务自动化,定时执行并保存结果。
55 3
|
1月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
32 2
|
30天前
|
监控 网络协议 CDN
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
|
2月前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
182 3
|
3月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
53 0
|
3天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
77 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
30天前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
182 3
|
3月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
129 3
|
30天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1610 14
|
25天前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
25 0