可观测性监控中的数据安全 - DataDog中的监控数据脱敏实战原创
# 可观测性监控中的数据安全 - DataDog中的监控数据脱敏
以应用可观测性为核心的可观测性监控,已成为DevOps工作中的重要组成部分,在传统监控中,主要是对被监控目标的状态、性能、容量等方面的度量,相对监控数据安全的需求并不明显,伴随监控内容向应用侧的偏移,以可观测性为主导的监控内容则涵盖了更多的维度,其给监控工作带来的更多的要求和挑战。在可观测性方面,对应用的监控主要包括了metrics、logs、trace三个维度的需求,其中logs和trace会实时采集大量应用数据,其已经面临着严重的数据安全泄露问题,例如在日志或trace数据中出现个人身份ID、手机号等。可观测性的监控工具有很多,每个工具也有各自不同的脱敏方案,例如ELK中可用logstahs、阿里的sls可通过logtail配置等,最近刚好遇到基于DataDog实现数据安全脱敏的实施需求,特此记录一下。
# 数据安全的内容及分类
2021年6月10日通过的《数据安全法》是我国第一部有关数据安全的专门法律,其与《网络安全法》及《个人信息保护法》全面构筑了中国信息安全领域的法律框架。 《数据安全法》中所称的数据,是指任何以电子或者其他方式对信息的记录。数据处理,包括数据的收集、存储、使用、加工、传输、提供、公开等。数据安全,是指通过采取必要措施,确保数据处于有效保护和合法利用的状态,以及具备保障持续安全状态的能力。
对于数据中的敏感性其主要可有如下几个分类:
- 个人数据,包括个人身份的基本信息、个人的行为信息。
- 业务数据,例如企业的业务交易记录和商业机密,包括有关企业的定价、方案、代码、合同等一系列对企业生存至关重要的信息和数据等。
- 公共数据,包括开放的公共数据和重要数据,比如涉及整个国家安全和社会安全的地理信息关键基础设施的相关数据等。
# 基于DataDog 的数据脱敏实战
数据脱敏的常用方法有如下两种,分别如下:
- 去标识化:是指对敏感信息进行技术处理,使得在不借助额外信息的情况下,无法识别关键信息主体。
- 匿名化:是指对敏感信息处理后无法被识别或关联,且处理后的信息不能被还原的过程。
# 应用logs脱敏
在Kubernetes 集群中,datadog 支持两种方式实现数据脱敏配置,一种是在DataDog agent的配置文件上进行配置,另一种方式是在每个应用的Deployment编排脚本上进行配置,从安全管理角色分级的角度上考量,选择在Deployment编排脚本上配置则更符合安全要求。 datadog 的日志内容脱敏是通过在annotations 中配置log_processing_rules 实现的,其可实现指定匹配日志内容不发送、敏感内容替换的需求,相关配置参数主要有如下几个:
类型 | 默认值 | 描述 |
---|---|---|
exclude_at_match | null | 不上传匹配到字符的日志 |
include_at_match | null | 仅上传匹配到字符的日志 |
mask_sequences | null | 替换敏感内容 |
配置样例如下:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: cardpayment
spec:
selector:
matchLabels:
app: cardpayment
template:
metadata:
annotations:
# datadog log 字符串过滤注解声明
ad.datadoghq.com/cardpayment.logs: >-
[{
"source": "java",
"service": "cardpayment",
"log_processing_rules": [
{
"type": "exclude_at_match",
"name": "exclude_healthcheck_logs",
# 对包含 /actuator/health 的数据不发送到datadog , 该url为springboot 可观测性组件中的健康检测url
"pattern": "(?:\/actuator\/health)"
},
{
"type": "mask_sequences",
"name": "mask_phone",
# 匹配11位数字的字符串,例如手机号
"pattern" : "(?:\\d{11})",
# 替换成字符串[MASKED_PHONE]
"replace_placeholder": "[MASKED_PHONE]"
},
{
"type": "mask_sequences",
"name": "mask_credit_cards",
# 匹配 信用卡号
"pattern" : "(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})",
# 替换成字符串 [masked_credit_card]
"replace_placeholder": "[masked_credit_card]"
}]
}]
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# apm trace 数据脱敏
在apm 监控场景中,敏感数据主要会出现在url及跟踪的信息中,对此DataDog提供了相应的环境变量参数实现配置,datadog提供的参数分为两部分,一部分是在datadog agent上配置,另一部分是在java agent上配置,java agent上的参数只支持屏蔽url 中的query parameter,而datadog agent上的变量参数则可实现http.url、msg.error 中匹配内容的替换。
相关配置参数主要有如下几个:
变量名 | 应用范围 | 默认值 | 描述 |
---|---|---|---|
DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP | agent | 对url中字符进行替换 | |
DD_APM_REPLACE_TAGS | agent | 替换敏感内容 | |
DD_APM_IGNORE_RESOURCES | agent | 配置要忽略的资源。多个条件用逗号分隔,支持正则表达式。 | |
DD_HTTP_SERVER_TAG_QUERY_STRING | agent / java agent | true | 收集url中的查询参数,false则为不收集 |
配置样例如下:
# 对url中参数字符进行替换
- name: DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP
value: false
# 不收集url中的查询参数
- name: DD_HTTP_SERVER_TAG_QUERY_STRING
value: false
# 替换敏感内容
- name: DD_APM_REPLACE_TAGS
value: '[
{
"name": "http.url",
"pattern": "token/(.*)",
"repl": "?"
},
{
"name": "resource.name",
"pattern": "(.*)\/$",
"repl": "$1"
},
{
"name": "*",
"pattern": "foo",
"repl": "bar"
},
{
"name": "error.stack",
"pattern": "(?s).*"
},
{
"name": "error.msg",
"pattern": "[0-9]{10}",
"repl": "[REDACTED]"
}
]'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34