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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
密钥管理服务KMS,1000个密钥,100个凭据,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日志并进行多维度分析。
相关文章
|
3月前
|
存储 数据采集 JavaScript
深入理解数仓开发(一)数据技术篇之日志采集
深入理解数仓开发(一)数据技术篇之日志采集
|
2月前
|
SQL 运维 监控
SLS 数据加工全面升级,集成 SPL 语法
在系统开发、运维过程中,日志是最重要的信息之一,其最大的优点是简单直接。SLS 数据加工功能旨在解决非结构化的日志数据处理,当前全面升级,集成 SPL 语言、更强的数据处理性能、更优的使用成本。
18091 136
|
29天前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
27天前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
15天前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
80 3
|
29天前
|
存储 监控 网络协议
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
|
20天前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
36 0
|
20天前
|
开发者 前端开发 编解码
Vaadin解锁移动适配新境界:一招制胜,让你的应用征服所有屏幕!
【8月更文挑战第31天】在移动互联网时代,跨平台应用开发备受青睐。作为一款基于Java的Web应用框架,Vaadin凭借其组件化设计和强大的服务器端渲染能力,助力开发者轻松构建多设备适应的Web应用。本文探讨Vaadin与移动设备的适配策略,包括响应式布局、CSS媒体查询、TouchKit插件及服务器端优化,帮助开发者打造美观且实用的移动端体验。通过这些工具和策略的应用,可有效应对屏幕尺寸、分辨率及操作系统的多样性挑战,满足广大移动用户的使用需求。
24 0
|
20天前
|
存储 运维 监控
Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!
【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。
21 0
|
28天前
|
SQL 监控 Oracle
Oracle数据误删不用怕,跟我来学日志挖掘
Oracle数据误删不用怕,跟我来学日志挖掘
20 0