1. 背景
对企业数据进行敏感数据扫描和保护可以提升企业或组织的数据安全。一方面敏感数据可能包括个人身份信息、财务记录、医疗记录等,定期扫描这些数据可以防止未经授权的访问和泄露。另一方面,许多国家和地区都有关于数据保护的法律法规,如GDPR(通用数据保护条例)和数据安全法等。敏感数据扫描有助于组织遵守这些法规,避免法律处罚。此外,定期进行敏感数据除了可以降低数据泄漏的风险和损失,还有助于数据治理、提升数据质量,改善系统的整体安全性。
2. 方案设计
不同的敏感数据扫描工具,都具备最基本的安全能力,即发现敏感数据,进行数据分类。 下面我们将基于阿里云数据安全中心的敏感数据扫描功能,验证如何进行阿里云上的日志数据分类分级识别,以及如何洞察日志资产中的敏感数据,并如何跨日志库进行数据的分析和处理。
我们的方案步骤将在下文详细展开。
2.1 接入脱敏方案
接入脱敏方案主要分为两个阶段,一个是接入阶段,一个是迭代优化阶段。
在接入阶段,我们首先分析采样日志,然后配置 SLS 脱敏接入方式,最后通过 DSC 的敏感扫描识别结果,验证脱敏效果。在看护优化阶段,我们在 DSC 创建周期性的扫描识别任务,持续优化我们的脱敏配置。
接入阶段
分析采样日志
在进行正式接入之前,我们需要先人工分析日志内容,找到数据中的敏感字段,例如根据不同行业(汽车、互联网、医疗等)定义不同的数据标签、例如个人敏感信息、医疗数据隐私、金融交易记录等。
SLS脱敏接入
人工识别得到敏感数据后,我们有 3 种采集+脱敏的 Pipeline 的组合流程:
- Logtail 端侧脱敏(数据流 1):配置 SLSLogtail采集后,在端侧进行处理脱敏,然后写入 SLS 日志库中, 端侧脱敏处理方式也分以下 2 种
- Logtail + Ingest Processorer 脱敏(数据流 2)组合: 对于日志产生速度较高,且需要进行大量正则处理的场景,iLogtail 本身也会占用大量系统资源。为了避免高强度的资源占用严重影响服务器上的其他业务进程,可以在 Logtail 端侧仅配置采集任务,然后通过 Ingest Processorer (写入处理器)配置 SPL 语句在日志服务侧完成脱敏处理。
- SDK+ Ingest Processorer 脱敏(数据流 3)组合:除了通过 Logtail 采集日志外,我们还可以基于SDK通过接口调用完成日志写入,通过Ingest Processorer里设置脱敏语句,脱敏处理在日志服务中完成,不占用端侧资源;
DSC 敏感扫描
进入到 数据安全中心控制台,完成SLS 数据资产授权后,可以在数据洞察中,通过自定义识别任务,选中扫描的资产范围和扫描的时间范围,对 SLS 资产进行敏感扫描采样。扫描完成后可以在资产透视中看到,具体的敏感等级和敏感数据采样结果。
迭代优化
得到敏感数据扫描结果后,我们可以根据扫描结果不断优化和调整脱敏配置,从而减少敏感数据的暴露,以及应对新日志数据类型接入带来的脱敏问题。可以在 DSC 数据洞察中,设置周期性扫描任务,按照每天、每周或每月的频率扫描 sls 资产,运维人员或管理人员定期查看敏感数据风险信息。
2.2 查询脱敏方案
前文介绍的场景,日志在存储日志库之前可以配置脱敏,然而真实的日志落库场景并不总是如此。有些业务日志需要完整地写入日志库中存储,但是又不想将敏感信息暴露给使用人员,有些业务日志需要结合存储在其他 Store 的业务日志一起联合查询,这时候我们可以采用 StoreView 的方式,既可以通过 SPL 语法预定义关联的 Store 实现日志脱敏查询,又可以对不同的 Logstore 进行联合查询从而拓展内容边界。
3. 场景详情
3.1 构造数据
我们假设用户是一家全球电子商务公司,该公司收集并存储来自世界各地客户的购买和付款信息。本次数据构造场景发生在公司的某个商品交易团队,会在日志中打印商品交易的信息,例如交易单号、客户名、购买物品、物品数量,以及一些客户的敏感数据例如交易发生的 IP 地址、客户的邮箱和联系方式等信息。如果该公司打印未编辑的敏感信息(例如信用卡号和电子邮件地址)到日志环境中,那么一旦日志数据被泄露,他们可能会面临法律后果,甚至可能违反数据隐私法。本次实践,我们基于 Mockaroo构造商品购买记录日志,日志数据字段包含以下几列内容:
字段名 |
说明 |
是否包含敏感 |
customer_name |
客户名 |
否 |
product_name |
物品名 |
否 |
quantity |
物品数量 |
否 |
price |
物品价格 |
否 |
purchase_date |
购买日期 |
否 |
shipping_address |
邮寄地址 |
否 |
payment_method |
付款方式 |
否 |
transaction_id |
交易单号 |
否 |
delivery_status |
投递状态 |
否 |
邮箱 |
是 |
|
ip_address |
下单 IP |
是 |
creadit_card |
信用卡号 |
是 |
phone_number |
联系方式 |
是 |
下面是包含敏感数据的模拟日志示例:
{"customer_name":"Clarita Bassick","product_name":"Wine - Rhine Riesling Wolf Blass","quantity":88,"price":865.08,"purchase_date":"11/21/2024","shipping_address":"4 Twin Pines Terrace","payment_method":"PayPal","transaction_id":1,"delivery_status":"In Transit","email":"cbassick0@npr.org","ip_address":"199.224.149.82","creadit_card":"56022548472842990","phone_number":"+27 380 246 6745"} {"customer_name":"Barbie Demaine","product_name":"Juice - Orange, 341 Ml","quantity":56,"price":298.24,"purchase_date":"11/20/2024","shipping_address":"7597 Becker Circle","payment_method":"PayPal","transaction_id":2,"delivery_status":"Pending","email":"bdemaine1@ifeng.com","ip_address":"208.175.140.6","creadit_card":"56022153806547181","phone_number":"+7 131 245 1815"} {"customer_name":"Dotty Ossipenko","product_name":"Beer - Blue Light","quantity":29,"price":884.78,"purchase_date":"11/18/2024","shipping_address":"84 Sachs Street","payment_method":"Credit Card","transaction_id":3,"delivery_status":"In Transit","email":"dossipenko2@omniture.com","ip_address":"130.200.127.172","creadit_card":"560224195737574955","phone_number":"+57 264 240 2814"}
我们可以通过阿里云 logtail Agent 以 json 解析的处理方式解析原始日志,或通过 SDK调用 api,将数据采集到阿里云 SLS 中的 Project/logstore 下,用于后续存储和查询,模拟日志内容如下:
4. 接入时脱敏
4.1 Logtail 端侧脱敏
脱敏插件方式
下面我们展示如何通过 logtail 插件配置数据脱敏(原生),减少日志中敏感数据的暴露程度,做到在数据采集端侧完成脱敏处理,保护数据安全。
在 Logtail 的处理配置中, 首先 JSON 解析插件展开字段,然后选择数据脱敏插件,依次配置脱敏如下:
下表是各个字段进行脱敏处理的配置详情:
替换方式 |
被替换内容前的内容表达式 |
被替换的内容表达式 |
替换字符串 |
|
customer_name |
字符串替换 |
|
|
|
ip_address |
字符串替换 |
|
|
|
字符串替换 |
|
|
|
|
phone_number |
字符串替换 |
|
|
|
credit_card |
字符串替换 |
|
|
|
下图是日志数据脱敏前后的对比效果,从直观查看的角度,目前的敏感数据在日志中得到很好的隐藏和保护。
SPL 处理方式
当然除了在 Logtail 采集配置中使用插件组合配置脱敏,我们还可以使用 SPL 管道语言的处理模式,先通过 parse-json 命令展开字段,然后将各个敏感字段进行正则替换。
*| parse-json content | extend creadit_card=regexp_replace(creadit_card, '\d{12}$','***********') | extend customer_name=regexp_replace(customer_name, '\S{4}$','******') | extend phone_number=regexp_replace(phone_number, '\S{3}\s\S{4}$','*** ****') | extend ip_address=regexp_replace(ip_address, '\d{1,3}.\d{1,3}$','**.**') | extend email=regexp_replace(email, '\S+@','****@') | project-away content
处理后的脱敏效果如下:
4.2 Logtail + Ingest Processorer 脱敏
为了避免高强度的资源占用严重影响服务器上的性能,可以在 Logtail 端侧仅配置采集任务,然后通过 Ingest Processorer (写入处理器)配置 SPL 语句在日志服务侧完成脱敏处理。
首先,创建 logtail 采集配置,此处 logtail 页面无需配置任何处理方式。通过 Logtail 采集配置写入日志后,此时写入的内容为原始的未经处理的文本日志。
然后我们介绍如何基于Ingest Processorer 处理器在日志服务侧进行日志脱敏处理,下面展开详细的操作步骤。
创建写入处理器(Ingest Processor)
在当前 project 下创建数据处理器,贴入 SPL 处理语句(语句见前文 SPL 处理方式)
关联写入处理器
然后我们修改 logstore,将其关联写入处理器
这时候再去查看日志,发现日志已经按照期望正确脱敏。
4.3 SDK + Ingest Processorer 脱敏
SDK 写入日志
除了支持 Agent 采集日志外,SLS 还提供了OpenAPI支持用户将打印的日志通过接口直接写入日志库中。开发人员可以使用.NET、.NET Core、Java、Python、PHP、Node.js、C、Go、iOS、Android、C++等语言的SDK 采集、查询和分析日志等。具体的写入步骤,可以直接参阅文档或相关示例,本文不做展开。
后续的脱敏工作(创建写入处理器、关联写入处理器流程)和前文(Logtail + Ingest Processorer 脱敏)的步骤流程完全相同,用户可以自行调试优化,也可以达到将日志脱敏的效果。
5. 敏感数据扫描
首先我们会介绍如何创建 SLS 日志资产的扫描任务及具体步骤,然后将展开脱敏处理前后,扫描结果的命中详情进行对比,最后我们将创建周期性扫描任务,用于应对未知敏感数据的识别和持续监控。
5.1 创建扫描任务
资产授权
我们进入到数据安全中心控制台,授权资产管理 SLS 中的存放敏感数据的 logstore,然后点击一键连接,授予数据安全中心对 SLS 日志资产的管理权限。
配置识别模板
DSC 内置了一些识别模板用于作为敏感数据分类与分级的依据。一个识别模板是一个或多个识别模型的组合,一个识别模型是一个或多个识别特征的集合。
例如 DSC 根据《阿里巴巴集团数据安全分类分级实践》制定了互联网行业分类分级模板,在互联网行业分类分级模板中,又包含了各类丰富的敏感信息的识别模型,例如密钥敏感信息下的 AccessKeyId 识别模型, 在AccessKeyId 模型中则定义了AccessKeyId 的基本特征。基于这些特征,辅以模型规则配置和识别阈值配置, DSC 可以从海量数据中识别到与之匹配的AccessKeyId数据。
创建扫描任务
然后我们进入数据洞察界面,基于具体的业务日志详情,配置相应的分级模板,也可以直接使用内置模板,例如互联网行业分类分级模板。
然后我们在数据洞察中,新建识别任务,选择指定模板,扫描我们的 sls 资产
等待扫描任务启动,扫描状态显示已完成。
5.2 脱敏前后对比
然后进入到数据安全中心控制台的数据洞察,资产透视界面,选择资产类型 SLS,查询扫描命中结果。
脱敏处理前
对于未脱敏的 SLS 日志数据,扫描完成后可以查看扫描得到的敏感信息、敏感等级、敏感数据采样等。可以发现,诸如邮箱、IP 地址、电话号码、姓名等敏感信息可被检测识别到。
脱敏处理后
按照前文方式配置脱敏后,接下来,我们进入数据安全控制台,重新进行敏感数据扫描,创建扫描识别任务,透视脱敏处理后的 SLS 日志资产。
我们可以看到,经过数据脱敏存储后,此时信用卡号、顾客姓名、邮箱、IP 地址、电话号码均做了脱敏处理,再次运行数据安全的敏感数据扫描,只命中了一个内网 IP 地址(记录日志采集的 ip),此时数据隐私性得到极大改善。
5.3 周期扫描
当扫描任务完成后,我们可以根据扫描结果不断优化和调整脱敏配置,从而减少敏感数据的暴露,以及应对持续的新日志数据类型接入带来的新的脱敏问题。用户可以在数据安全中心数据洞察中,设置周期性扫描任务,支持按照每天、每周或每月的频率扫描 sls 资产。
6. 查询时脱敏
前文介绍,日志落库之前的脱敏及扫描详情,下面我们介绍如何在日志已经完整落库(含敏感内容)SLS 之后,通过 StoreView 配置 SPL 等方式,实现数据价值的最大化利用。
6.1 权限隔离
业务日志由不同的应用程序、服务、云产品生成,存储在不同地域的Project或同一地域的不同LogStore中。对于用户日志数据而言,不同 logstore 本身就处于不同的暴露等级中。最好的日志隔离方式就是对不同暴露级别的数据,配置不同的 logstore 单元的访问权限。针对不同使用角色,建立针对性的 Logstore 资源分级访问控制(RAM )制度可以有效地保护数据安全。例如后台管理人员只可以看到交易记录日志,不能看到广告投放数据。
6.2 StoreView
假设对于运营人员,虽然其掌握了广告投放数据,但是出于精准营销的目的,想要分析广告投放对不同顾客的交易转化提升效率,此时运营人员需要将广告投放日志结合交易记录日志进行综合分析。这时候,运营人员可以通过 SLS 的 StoreView 功能,跨 Store 的去查询交易记录日志。
跨 Store 查询
此时的 StoreView 并非实体资源,而是跨 Store 的虚拟资源,用于保存多个 Store 之间的关联关系。运营人员可以查询指定 StoreView 下的日志数据。
此时通过保留字段__tag__:project__
和__tag__:__logstore__
可以查看日志分别来自哪一个 Project/Logstore。
SPL 脱敏预定义
要注意的是,此时的联合查询,运营人员可以看到完整的用户交易信息,包括用户邮箱、信用卡号、联系方式等个人信息。完整的信息暴露是不安全且不合规的,我们可以修改我们的 StoreView,通过 SPL 实现对数据预脱敏处理,然后交给运营人员查询处理,脱敏处理后的日志库查询,从而有效避免用户信息泄露的风险。
* | extend creadit_card=regexp_replace(creadit_card, '\d{12}$','***********') | extend customer_name=regexp_replace(customer_name, '\S{4}$','******') | extend phone_number=regexp_replace(phone_number, '\S{3}\s\S{4}$','*** ****') | extend ip_address=regexp_replace(ip_address, '\d{1,3}.\d{1,3}$','**.**') | extend email=regexp_replace(email, '\S+@','****@')
此时再去 StoreView 查询结果如下,查询结果已经脱敏,我们可以放心地将 StoreView 的查询结果暴露给运营人员,从而有效保护用户交易隐私。
7. 总结
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。