本文件描述了一種我們希望最終對使用者隱藏的配置格式。該頁面仍然存在的唯一原因是當前 Relay 接受這種格式以替代常規資料清理設定。
以下文件探討了 Relay 使用和執行的高階資料清理配置的語法和語義。有時,這也稱為 PII
清理。
- https://github.com/getsentry/relay
- https://docs.sentry.io/product/data-management-settings/scrubbing/advanced-datascrubbing/
- Scrub personally identifiable information (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
匹配,無論它是否包含password
、credentials
或類似的字串。@anything:remove
、@anything:replace
和@anything:hash
用於刪除、替換或hash
任何值。它本質上等同於萬用字元正規表示式,但它也比字串匹配得多。
編寫自己的規則
規則一般由兩部分組成:
每個頁面都帶有示例。
通過將這些示例貼上到 Piinguin 的 “PII 配置”
列並單擊欄位以獲取建議來嘗試這些示例。
互動式編輯
解決此問題的最簡單方法是,如果您已經擁有來自某個 SDK
的原始 JSON payload
。
轉到我們的 PII 配置編輯器 Piinguin,然後:
- 貼上到原始事件中
- 點選你想要消除的資料
- 貼上其他有效負載並檢視它們是否正常,如有必要,請轉到步驟 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" 取自 exception
的 value
,
而 "message" 取自 logentry
,因此我們必須編寫以下內容以將兩者從事件中刪除:
[Remove] [Anything] from [exception.value]
[Remove] [Anything] from [logentry.formatted]
布林邏輯
您可以使用布林邏輯組合選擇器。
- 以
!
為字首來反轉選擇器。foo
匹配 JSON keyfoo
,而!foo
匹配除foo
之外的所有內容。 - 使用
&&
構建連詞 (AND),例如:foo && !extra.foo
以匹配 keyfoo
,除非在extra
內部。 - 使用
||
構建析取 (OR),例如:foo || bar
匹配foo
或bar
。
萬用字元
**
匹配所有子路徑,因此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
值相匹配。