本文档描述了一种我们希望最终对用户隐藏的配置格式。该页面仍然存在的唯一原因是当前 Relay 接受这种格式以替代常规数据清理设置。

以下文档探讨了 Relay 使用和执行的高级数据清理配置的语法和语义。有时,这也称为 PII 清理。

一个基本的例子

假设您有一条异常消息,不幸的是,其中包含不应该存在的 IP 地址。你会写:

{
"applications": {
"$string": ["@ip:replace"]
}
}

它读作 “替换所有字符串中的所有 IP 地址”,或 "将 @ip:replace 应用于所有 $string 字段"。

@ip:replace 称为规则,$string 称为选择器

内置规则

默认存在以下规则:

  • @ip:replace@ip:hash 用于替换 IP 地址。
  • @imei:replace@imei:hash 用于替换 IMEI
  • @mac:replace@mac:mask@mac:hash 用于匹配 MAC 地址。
  • @email:mask@email:replace@email:hash 用于匹配 email 地址。
  • @creditcard:mask@creditcard:replace@creditcard:hash 用于匹配信用卡号码。
  • @userpath:replace@userpath:hash 用于匹配本地路径(例如 C:/Users/foo/)。
  • @password:remove 用于删除密码。在这种情况下,我们对字段的 key 进行 pattern 匹配,无论它是否包含 passwordcredentials 或类似的字符串。
  • @anything:remove@anything:replace@anything:hash 用于删除、替换或 hash 任何值。它本质上等同于通配符正则表达式,但它也比字符串匹配得多。

编写自己的规则

规则一般由两部分组成:

每个页面都带有示例。

通过将这些示例粘贴到 Piinguin“PII 配置” 列并单击字段以获取建议来尝试这些示例。

交互式编辑

解决此问题的最简单方法是,如果您已经拥有来自某个 SDK 的原始 JSON payload

转到我们的 PII 配置编辑器 Piinguin,然后:

  1. 粘贴到原始事件中
  2. 点击你想要消除的数据
  3. 粘贴其他有效负载并查看它们是否正常,如有必要,请转到步骤 2

在对配置进行迭代后,将其粘贴回位于 .relay/projects/<PROJECT_ID>.json 的项目配置中

例如:

{
"publicKeys": [
{
"publicKey": "___PUBLIC_KEY___",
"isEnabled": true
}
],
"config": {
"allowedDomains": ["*"],
"piiConfig": {
"rules": {
"device_id": {
"type": "pattern",
"pattern": "d/[a-f0-9]{12}",
"redaction": {
"method": "hash"
}
}
},
"applications": {
"freeform": ["device_id"]
}
}
}
}

PII 规则类型

pattern

自定义 Perl 风格的正则表达式 (PCRE)。

{
"rules": {
"hash_device_id": {
"type": "pattern",
"pattern": "d/[a-f0-9]{12}",
"redaction": {
"method": "hash"
}
}
},
"applications": {
"$string": ["hash_device_id"]
}
}
imei

匹配 IMEI 或 IMEISV。

{
"rules": {
"hash_imei": {
"type": "imei",
"redaction": {
"method": "hash"
}
}
},
"applications": {
"$string": ["hash_imei"]
}
}
mac

匹配一个 MAC 地址。

{
"rules": {
"hash_mac": {
"type": "mac",
"redaction": {
"method": "hash"
}
}
},
"applications": {
"$string": ["hash_mac"]
}
}
ip

匹配任何 IP 地址。

{
"rules": {
"hash_ip": {
"type": "ip",
"redaction": {
"method": "hash"
}
}
},
"applications": {
"$string": ["hash_ip"]
}
}
creditcard

匹配信用卡号。

{
"rules": {
"hash_cc": {
"type": "creditcard",
"redaction": {
"method": "hash"
}
}
},
"applications": {
"$string": ["hash_cc"]
}
}
userpath

匹配本地路径(例如C:/Users/foo/)。

{
"rules": {
"hash_userpath": {
"type": "userpath",
"redaction": {
"method": "hash"
}
}
},
"applications": {
"$string": ["hash_userpath"]
}
}
anything

匹配任何值。这基本上等同于通配符正则表达式。

例如,要删除所有字符串:

{
"rules": {
"remove_everything": {
"type": "anything",
"redaction": {
"method": "remove"
}
}
},
"applications": {
"$string": ["remove_everything"]
}
}
multiple

将多个规则合二为一。这是一个析取 (OR):有问题的字段必须只匹配一个规则来匹配组合规则,而不是全部。

{
"rules": {
"remove_ips_and_macs": {
"type": "multiple",
"rules": [
"@ip",
"@mac"
],
"hide_rule": false, // Hide the inner rules when showing which rules have been applied. Defaults to false.
"redaction": {
"method": "remove"
}
}
},
"applications": {
"$string": ["remove_ips_and_macs"]
}
}
alias

别名一个规则到另一个。这与 multiple 相同,只是您只能包装一个规则。

{
"rules": {
"remove_ips": {
"type": "multiple",
"rule": "@ip",
"hide_rule": false, // Hide the inner rule when showing which rules have been applied. Defaults to false.
"redaction": {
"method": "remove"
}
}
},
"applications": {
"$string": ["remove_ips"]
}
}

PII 编辑方法

remove

删除整个字段。Relay 可以选择将其设置为 null 或完全删除它。

{
"rules": {
"remove_ip": {
"type": "ip",
"redaction": {
"method": "remove"
}
}
},
"applications": {
"$string": ["remove_ip"]
}
}
replace

static string 替换 key

{
"rules": {
"replace_ip": {
"type": "ip",
"redaction": {
"method": "replace",
"text": [censored]"
}
}
},
"applications": {
"$string": ["replace_ip"]
}
}
### mask

"masking(掩码)" 字符 * 替换匹配字符串的每个字符。与 replace 相比,它保留了原始字符串的长度。

{
"rules": {
"mask_ip": {
"type": "ip",
"redaction": {
"method": "mask"
}
}
},
"applications": {
"$string": ["mask_ip"]
}
}
### hash

用它自己的 hash 版本替换字符串。相等的字符串将产生相同的 hash 值,因此,例如,如果您决定对用户 ID 进行散列处理而不是替换或删除它,您仍将获得受影响用户的准确计数。

{
"rules": {
"hash_ip": {
"type": "ip",
"redaction": {
"method": "hash"
}
}
}
"applications": {
"$string": ["mask_ip"]
}
}

PII 选择器

选择器允许您将规则限制在事件的某些部分。

这对于按变量/字段名称从事件中无条件删除某些数据很有用,但也可用于对真实数据进行保守的测试规则。

数据清理始终适用于原始事件负载。

请记住,UI 中的某些字段在 JSON schema 中的调用方式可能不同。

在查看事件时,应该始终存在一个名为 "JSON" 的链接,可让您查看数据清理器看到的内容。

例如,在 UI 中称为 "Additional Data" 的内容在事件负载中称为 extra。要删除名为 foo 的特定 key,您可以编写:

[Remove] [Anything] from [extra.foo]

另一个例子。Sentry 知道两种错误消息:异常消息顶级日志消息

以下是由 SDK 发送的此类事件负载(可从 UI 下载)的示例:

{
"logentry": {
"formatted": "Failed to roll out the dinglebop"
},
"exceptions": {
"values": [
{
"type": "ZeroDivisionError",
"value": "integer division or modulo by zero"
}
]
}
}

由于 "error message" 取自 exceptionvalue

而 "message" 取自 logentry,因此我们必须编写以下内容以将两者从事件中删除:

[Remove] [Anything] from [exception.value]
[Remove] [Anything] from [logentry.formatted]

布尔逻辑

您可以使用布尔逻辑组合选择器。

  • ! 为前缀来反转选择器。foo 匹配 JSON key foo,而 !foo 匹配除 foo 之外的所有内容。
  • 使用 && 构建连词 (AND),例如:foo && !extra.foo 以匹配 key foo,除非在 extra 内部。
  • 使用 || 构建析取 (OR),例如:foo || bar 匹配 foobar

通配符

  • ** 匹配所有子路径,因此 foo.** 匹配 foo 中的所有 JSON 键。
  • * 匹配单个路径项,因此 foo.* 匹配比 foo 低一级的所有 JSON 键。

值类型

使用以下内容按 JSON-type 选择子节:

  • $string 匹配任何字符串值
  • $number 匹配任何整数或浮点值
  • $datetime 匹配事件中代表时间戳的任何字段
  • $array 匹配任何 JSON 数组值
  • $object 匹配任何 JSON 对象

使用以下方法选择 schema 的已知部分:

  • $exception 匹配 {"exception": {"values": [...]}} 中的单个异常实例
  • $stacktrace 匹配一个堆栈跟踪实例
  • $frame 匹配一个帧
  • $request 匹配事件的 HTTP 请求上下文
  • $user 匹配事件的用户上下文
  • $logentry(也适用于 message 属性)
  • $thread 匹配 {"threads": {"values": [...]}} 中的单个线程实例
  • $breadcrumb 匹配 {"breadcrumbs": [...]} 中的单个面包屑
  • $span 匹配一个 trace span
  • $sdk 匹配 {"sdk": ...} 中的 SDK 上下文

示例

  • 删除 event.user:

    [Remove] [Anything] from [$user]
  • 删除所有帧局部变量:

    [Remove] [Anything] from [$frame.vars]

转义特殊字符

如果要匹配的对象 key 包含空格或特殊字符,可以使用引号将其转义:

[Remove] [Anything] from [extra.'my special value']

这与 附加数据 中的 key my special value 相匹配。

要在引号内转义 '(单引号),请将其替换为 ''(两个引号):

[Remove] [Anything] from [extra.'my special '' value']

这与 附加数据 中的key my special ' value 值相匹配。

更多

Sentry 企业级数据安全解决方案 - Relay PII 和数据清理的更多相关文章

  1. Sentry 企业级数据安全解决方案 - Relay 监控 & 指标收集

    内容整理自官方文档 系列 Sentry 企业级数据安全解决方案 - Relay 入门 Sentry 企业级数据安全解决方案 - Relay 运行模式 Sentry 企业级数据安全解决方案 - Rela ...

  2. Sentry 企业级数据安全解决方案 - Relay 运行模式

    内容整理自官方开发文档 Relay 可以在几种主要模式之一下运行,如果您正在配置 Relay server 而不是使用默认设置,那么事先了解这些模式至关重要. 模式存储在配置文件中,该文件包含 rel ...

  3. Sentry 企业级数据安全解决方案 - Relay 配置选项

    Relay 的配置记录在文件 .relay/config.yml 中.要更改此位置,请将 --config 选项传递给任何 Relay 命令: ❯ ./relay run --config /path ...

  4. Sentry 企业级数据安全解决方案 - Relay 操作指南

    内容整理自官方文档 本篇回顾了我们在自托管外部使用 Relay 时的操作指南,即在您的硬件上运行的 Relay 并将事件转发到 sentry.io. 系列 Sentry 企业级数据安全解决方案 - R ...

  5. Sentry 企业级数据安全解决方案 - Relay 项目配置

    内容整理自官方文档 系列 Sentry 企业级数据安全解决方案 - Relay 入门 Sentry 企业级数据安全解决方案 - Relay 运行模式 Sentry 企业级数据安全解决方案 - Rela ...

  6. Sentry 企业级数据安全解决方案 - Relay 入门

    内容整理自官方开发文档 Sentry Relay 通过提供作为应用程序和 sentry.io 之间中间层的独立服务来提供企业级数据安全性. Relay 专门设计用于: 在将个人身份信息 (PII) 发 ...

  7. 使用docker-compose部署Sentry(附Sentry数据清理)

    Ubuntu下Sentry部署 Sentry作为一款常见以及使用人数较多的监控服务,在接口监控.错误捕捉.错误报警等方面是非常不错的,在此之前我也用过Prometheus监控,各有各的好处,有兴趣的同 ...

  8. 《Hadoop高级编程》之为Hadoop实现构建企业级安全解决方案

    本章内容提要 ●    理解企业级应用的安全顾虑 ●    理解Hadoop尚未为企业级应用提供的安全机制 ●    考察用于构建企业级安全解决方案的方法 第10章讨论了Hadoop安全性以及Hado ...

  9. Foreman 企业级配置管理解决方案

    Foreman 企业级配置管理解决方案 Foreman 企业级配置管理解决方案 笔记本 puppet foreman 构建运维体系 本文是构建运维体系的其中一个关键环节. 什么是 foreman Fo ...

随机推荐

  1. Go语言核心36讲(Go语言实战与应用二十六)--学习笔记

    48 | 程序性能分析基础(上) 作为拾遗的部分,今天我们来讲讲与 Go 程序性能分析有关的基础知识. Go 语言为程序开发者们提供了丰富的性能分析 API,和非常好用的标准工具.这些 API 主要存 ...

  2. LuoguP7869 「Wdoi-4」使用三个系统程度的能力 题解

    Content 现在有一个转换后的文本文件,以一个长度为 \(n\) 的字符串表示.请判断这个文件是用哪一种写的,详情请返回题面. 数据范围:\(n\leqslant 10^5\).字符串里面至少有一 ...

  3. ffmpeg 系列博客

    https://www.ffmpeg.org/download.html#build-macffmpeg 系列博文https://me.csdn.net/blog/leixiaohua1020http ...

  4. wordpress页面F12时源码多出的内容在index.php header.php找不到

    wordpress页面按F12时源码多出的内容在index.php header.php找不到 比如类似这样的内容: <div style="position:absolute;fil ...

  5. 阿里巴巴分布式服务框架HSF

    HSF称之为高速服务框架HSF(High-speed Service Framework),是在阿里巴巴广泛使用的分布式RPC服务框架. HSF连通不同的业务系统,解耦系统间的实现依赖.HSF从分布式 ...

  6. wayne编译支持k8s1.16+

    GitHub: https://github.com/Qihoo360/wayne 文档: 由于wayne 官方文档链接已经失效了,我们可以通过这里查看 wayne 文档, 除了这个地方,我们询问之前 ...

  7. Java容器源码学习--ArrayList源码分析

    ArrayList实现了List接口,它的底层数据结构是数组,因此获取容器中任意元素值的时间复杂度为O(1),新增或删除元素的时间复杂度为O(N).每一个ArrayList实例都有一个capacity ...

  8. Android NDK开发篇:Java与原生代码通信(数据操作)

    虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...

  9. c++基础之虚函数表指针和虚函数表创建时机

    虚函数表指针 虚函数表指针随对象走,它发生在对象运行期,当对象创建的时候,虚函数表表指针位于该对象所在内存的最前面. 使用虚函数时,虚函数表指针指向虚函数表中的函数地址即可实现多态. 虚函数表 虚函数 ...

  10. C/C++ 结构体字节对齐

    在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此 ...