logo
logo

安心!DeepFlow 内置 SQL/Redis 协议数据脱敏能力

向阳 2024-02-06

SQL、Redis 协议数据中可能存在密码、手机号、身份证号等敏感信息,有合规要求的企业通常不允许在采集或分析可观测性数据时暴露此类敏感数据。本文介绍 DeepFlow 内置的 SQL、Redis 协议数据脱敏能力,帮助企业客户安心建设合规的可观测性

0x0: 关于数据脱敏

微服务之间的通信使用 HTTP 或 RPC 协议,此类通信方式能够清晰的区分协议头和协议体,而一般获取可观测性数据仅针对协议头,因此能天然避免敏感信息泄露。但 SQL、Redis 通信协议简单,常见的可观测性解决方案通常直接采集 SQL 或 Redis 命令本身,极有可能造成敏感数据的泄露。例如,下面的 SQL 命令和 Redis 命令会分别泄露用户的手机号和 Redis 的账号密码:

1
2
3
4
5
# SQL
SELECT * FROM user WHERE mobile = 18866886688;

# Redis
HELLO 3 AUTH user my-str0ng-p@ssw0rd!

OpenTelemetry 社区也在对数据脱敏的需求进行讨论,但进展缓慢,例如 Issue #2466 - Automatic obfuscation/scrubbing of commonly sensitive metadata 对此的讨论已将近三年。

现在,DeepFlow 已经内置了协议数据的脱敏能力。以上述两条语句为例,在开启数据脱敏时 DeepFlow 采集并存储的调用日志如下:

1
2
3
4
5
# SQL
SELECT * FROM user WHERE mobile = ?;

# Redis
HELLO 3 AUTH ?

0x1: 在 DeepFlow 中开启脱敏

在 DeepFlow 中开启数据脱敏非常简单,不需要修改业务代码或插桩代码、不需要重启业务进程,只需要对 deepflow-agent 的运行配置进行设置:

1
2
3
static_config:
l7-protocol-advanced-features:
obfuscate-enabled-protocols: [] # 例如:[MySQL, PostgreSQL, Redis]

仅需添加上述配置,内置的 SQL 和 Redis 自动脱敏能力即可开启。

0x2: 开启脱敏后的资源开销

开启脱敏时 deepflow-agent 会消耗更多的 CPU 和内存,为了评估具体的资源开销,我们特意开发了一个测试工具来进行压测,代码也已开源:GitHub repo

使用上述压测工具,我们能够生成指定 TPS 的 MySQL 或 Redis 压测流量,例如:

1
2
3
4
5
6
7
8
9
app-traffic \
-p password \
-e mysql \
-sql "SELECT id FROM obfuscate WHERE num >=20 AND name != 'df1' LIMIT 1 OFFSET 1" \
-h 10.1.19.187:3306 \
-r 50000 \ # TPS (requests per second)
-t 50 \ # number of threads
-c 20 \ # concurrent connections of each thread
-d 100 # Execution time in seconds

首先,我们压测了一个简单的 SQL 命令,1 个变量、40K TPS

1
2
3
4
5
# 原始 SQL 命令
SELECT id FROM obfuscate WHERE num >= 20 LIMIT 1 OFFSET 1;

# DeepFlow 脱敏后的 SQL 命令
SELECT id FROM obfuscate WHERE num >= ? LIMIT 1 OFFSET 1;
Agent 开销 关闭脱敏 开启脱敏 增长量 增长百分比
CPU 66.5% 70.3% +3.8% +5.7%
MEM 218 MB 230 MB +12 MB +5.5%

接下来,我们压测了一个复杂的 SQL 命令,11 个变量、40K TPS

1
2
3
4
5
6
7
8
9
10
11
# 原始 SQL 命令
SELECT id FROM obfuscate WHERE \
num >= 10 AND num >= 11 AND num >= 12 AND num >= 13 AND num >= 14 AND \
num >= 15 AND num >= 16 AND num >= 17 AND num >= 18 AND num >= 19 AND \
name != 'df1' LIMIT 1 OFFSET 1

# DeepFlow 脱敏后的 SQL 命令
SELECT id FROM obfuscate WHERE \
num >= ? AND num >= ? AND num >= ? AND num >= ? AND num >= ? AND \
num >= ? AND num >= ? AND num >= ? AND num >= ? AND num >= ? AND \
name != ? LIMIT 1 OFFSET 1
Agent 开销 关闭脱敏 开启脱敏 增长量 增长百分比
CPU 77.2% 83.6% +6.4% +8.3%
MEM 213 MB 218 MB +5 MB +2.3%

另外,我们也压测了 Redis 的情况,10 个变量、40K TPS

1
2
3
4
5
6
7
8
9
# 原始 Redis 命令
HMSET app \
key0 value0 key1 value1 key2 value2 key3 value3 key4 value4 \
key5 value5 key6 value6 key7 value7 key8 value8 key9 value9

# DeepFlow 脱敏后的 Redis 命令
HMSET app \
key0 ? key1 ? key2 ? key3 ? key4 ? \
key5 ? key6 ? key7 ? key8 ? key9 ?
Agent 开销 关闭脱敏 开启脱敏 增长量 增长百分比
CPU 75.0% 75.1% +0.1% +0.1%
MEM 149 MB 149 MB +0 MB +0%

总结来看:在 40K TPS 的极高负载下,复杂 SQL 命令脱敏仅额外消耗 deepflow-agent 5%~8% 资源,复杂 Redis 命令脱敏仅额外消耗 deepflow-agent <1% 资源,性能表现非常可观

0x3: 什么是 DeepFlow

DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云基础设施及云原生应用提供深度可观测性。DeepFlow 基于 eBPF 实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰(Zero Code)采集,并结合智能标签(SmartEncoding)技术实现了所有观测信号的全栈(Full Stack)关联和高效存取。使用 DeepFlow,可以让云原生应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。

GitHub 地址:https://github.com/deepflowio/deepflow

访问 DeepFlow Demo,体验零插桩、全覆盖、全关联的可观测性。