其他
客户日志脱敏:逐行替换敏感值同时保持原始格式不变
当需要把客户提供的日志、样本事件或测试夹具安全地分享或提交时,用两遍映射法替换所有身份标识,同时逐字符保留原有结构、分隔符和格式。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 47/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 51/100 ×0.15
适用场景
客户日志脱敏:逐行替换敏感值同时保持原始通用
解决思路
- 先扫描整个文件或整行,为每个敏感 token 建立 `原始值 → 占位符` 映射,再全局应用;不要边读边替换,避免不同原始值塌缩成同一占位符或只替换首次出现。
- 不同原始值必须映射到不同占位符,相同原始值必须映射到相同占位符,保证跨事件关联仍可测试。
- 应用映射后再次扫描遗漏项:URL 中的 IP、复合 ID 中的十六进制 dword、看起来像产品名的内部主机名。
- 覆盖认证类标识:API key、bearer token、密码、OAuth token、base64 凭据、PEM/SSH 私钥、TLS/SSH 指纹(JA3/JA4、主机密钥指纹、证书指纹)、DHCP 指纹、部分泄露的密钥(token_prefix、password_hash_prefix、hashed_token)。
- 覆盖个人标识:邮箱(含 CC/BCC、delegate/owner/creator 变体)、用户名、显示名、员工 ID、电话、principal name(如 user@tenant.onmicrosoft.com)、邮件主题与正文。
- 覆盖组织标识:公司名、tenant ID(含 home_tenant_id、resource_tenant_id、aad_tenant_id 变体)、account ID、subscription ID、billing account ID、路径或 JSON 中的 org slug、orgunit_path、部门名与 ID、cost center ID、Windows SID。
- 覆盖基础设施标识:内部主机名、FQDN、私有 IP、MAC、内部 URL、云资源 ID(ARN、S3 bucket、GCP project、Azure 资源名)、Kubernetes 集群/节点/Pod/命名空间名、容器名与 ID、数据库主机与库名、Windows 域拓扑字段(域控主机名、NT 域名、domain_controller_object_guid、domain_controller_object_sid)。
- 覆盖设备与硬件标识:序列号、硬件 UUID、machine ID、设备 UUID、设备专属 BIOS/固件版本字符串,包括 device_id / serial 等字段。
- 覆盖文件系统路径:进程命令行、文件路径、注册表路径、日志路径中嵌入的用户名、组织名或内部系统结构(如 C:\Users\alice\、/home/bob/、HKLM\...\S-1-5-21-...)。
- 覆盖连接字符串:数据库 URI、Redis URL,以及任何包含凭据或内部主机名的连接串。
- 覆盖资源归属字段:owner email、creator email、last-modified-by、delegate user email、assignee email、impersonator 等指明具体操作人的字段。
- 覆盖追踪标识:session ID、request/correlation ID、transaction ID,以及任何绑定真实实体的长不透明字符串。
- 覆盖可能由敏感输入派生的哈希:密码哈希、HMAC secret;但保留文件内容哈希(MD5/SHA1/SHA256)和内容寻址引用(git SHA、用作标识的 TLS 证书哈希)。
- 覆盖地理细节:精确 GPS 坐标、真实街道地址;geo enrichment 字段中的城市和国家名通常可保留,但 inventory/topology 字段中的城市/站点 token 属于标识,需替换。
- 处理嵌套与复合标识:复合 ID 中的十六进制 dword 可能是 IPv4,尝试两种字节序,若解码为合理 IP 且与已替换的 origin 不同,则用与 origin 相同的文档 IP 的十六进制编码替换该 dword(保留 0x + 8 位十六进制和外围 {0x…,0x…} 形状)。
- 处理拓扑编码主机名:如 SW-BLDG-01、CHI-FW-01、DC1-VPN-MGMT,在 hostname/syslog-host/device-name 字段替换站点/角色/楼宇代码;不要替换厂商 syslog message ID(如 %NAME-6-302018);占位符按原长度类别使用 host-1.example.local 或 example-fw-01。
- 处理 policy/ACL/access-group 名称:将 8-14 位日期串替换为 20240101000000(同位数),vs\d+ 替换为 vs01 或去掉 vs/日期后缀为 example-policy,VLAN 号替换为 vlan100,保持 token 类别。
- 处理接口名:ethN-MM.VLAN → eth1-01.100(保留 eth + 点分子单元形状);IF-<org>-… / 位置词 → IF-Example(保留 IF- 前缀);inside/outside/lan/wan 若为接口角色可保留,若是客户站点或组织则替换。
- 处理含组织单元的 Windows/SMB 路径:把最后两级以上的目录组件替换为通用段(example-department、E01、EXAMPLE-UNIT),保留深度、反斜杠和通用 OS 文件名(如 Thumbs.db);年份目录如 \2026\ 可保留。
- 处理前缀保留的不透明 ID:保留短类型前缀,替换长混合大小写后缀;同一原始值映射同一占位符;URL 路径中的 base64 blob 替换为同长度合成 base64;真实应用/角色显示名替换为通用等价物。
- 处理设备序列号与 MDM ID:device_id / serial / DeviceId 等字段中的长十六进制/字母数字值替换为同字符集同长度的合成值(SN000000000001、SEC123ABCDEFG45H)。
- 处理身份存储名与组层级:<NAME>-AD / 身份存储 → EXAMPLE-AD;哈希分隔层级保留结构前缀(Location#All Locations#、Device Type#All Device Types#),若叶子是真实城市/站点则替换为 Example-Site;即使用户名已脱敏,真实存储名仍需替换。
- 处理 URL 和查询串中嵌套的 IP:替换顶层 src_ip/dst_ip 后,扫描 URL query 和 path 中的 ip=、src=、dst= 和点分四段;若该主机已用过某 RFC 5737 IP 则复用,否则用 198.51.100.10;即使 URL 畸形也要处理。
- 处理 OCSP/AIA/CRL 证书路径:若主机名匹配 ocsp./crl./cacerts.(无论是否公共),将路径替换为同长度合成 base64/十六进制(全 0 或 A),保留 / 数量和字符集类别。
- 处理用户名中的 JNDI/插值探测:若字段含 ${jndi:、${lower: 或 ${::-,将整个字段值替换为合成用户名(alice.johnson,或按原引号/撇号保留为 Lab1's User),保留外围引号。
- 处理客户遥测中的公共目标主机名:在 firewall、proxy、DNS、UTM、content-filter 事件中,目标主机名和目标 IP 属于客户遥测,即使是 youtube.com 等知名站点或公共单播 IP 也要替换;但日志来源厂商 API 的产品主机(如 GitHub audit log 中的 api.github.com)保留。
- 替换时使用一致且形似的占位符,不要用 REDACTED 这类破坏格式敏感解析器的字符串;按类型使用约定:邮箱 user@example.com、IPv4 RFC 5737 段、IPv6 2001:db8::10、主机名 host-1.example.local、域名 example.com、UUID 89a1d5c1-2b3e-4f67-8a9b-0c1d2e3f4a5b、API key sk_test_example_key_1234567890、用户名 alice.johnson、显示名 Alice Johnson、组织 Example Corp、tenant ID 000000000000、云资源 ARN arn:aws:iam::000000000000:user/example-user、S3 bucket example-bucket、MAC 00-00-5E-00-53-23、序列号 SN000000000001、Windows SID S-1-5-21-000000000-000000000-000000000-1000、Windows 路径 C:\Users\example-user\AppData\...、Unix 路径 /home/example-user/...、Kubernetes example-cluster、电话 734-555-0100、数据库 db-host.example.local、部门 example-department、JA4 同长度十六进制、数值型 transaction/sequence ID 同位数合成整数、session/request/correlation ID 同长度同字符集合成串、policy example-policy、接口 eth1-01.100、身份存储 EXAMPLE-AD、位置层级叶子 Example-Site、OCSP 路径同长度 A/0 base64。
- 遵守形状规则:数值 ID → 数值 ID(/d/123/edit → /d/456/edit);UUID → 同版本合成 UUID;URL → 只替换敏感段,保留 scheme、路径结构、查询串形状和非法字符;字符串 ID → 同长度或同格式的不透明字符串;不确定时参考同文件同字段类型的邻近值。
- 畸形或垃圾值不要替换:如 http://1=Y +z\、00/00/0000、N/A、空串、看起来像占位符的值,保持原样;但可替换其中的真实身份(IP、主机名、用户),只要畸形特征(多余引号、未编码的 { }、URL 中空格、截断字段、U+FFFD)保留。
- 不要重新格式化内容:NDJSON 每行保持单行紧凑 JSON,不 pretty-print、不重排缩进;syslog/CEF/KV 不增删空格、不改引号、不归一化字段顺序;多行日志保持行分组;只替换标识真实人/系统/组织的值,字段名、分隔符、结构 token 逐字符保留。
- 不要添加、删除或重写 syslog PRI / RFC5424 头,不要给裸行加 <134> 之类前缀。
- 截断绝不是脱敏策略:不要删除重复字段、丢弃尾部 KV 对或截断行尾来“完成”脱敏,改用两遍映射。
- 替换后验证结构完整:行数不变、不丢尾部 KV 对;输出长度 ≥ 输入的 70%(除非仅把长 token 换成同形占位符);再次扫描 URL ip=/src=/dst=/点分四段、复合 ID 中的十六进制 dword、类主机拓扑 token、设备序列号、前缀保留不透明 ID。
- 对 NDJSON 用 python3 校验每行仍是合法 JSON:python3 -c "import json,sys; [json.loads(l) for l in open('FILE') if l.strip()]"。
- 确认时间戳格式未变,包括时区缩写;不要改时区缩写、epoch 值或时钟字段(如不要把 Jun 27 14:06:33.189 JST 改成 Jul 24 00:47:24.618 CET,不要偏移 epoch/Unix 时间戳,不要替换 JST/EDT/EST/Eastern/(GMT-3:00)Buenos Aires, Georgetown)。
- 保留不应替换的内容:协议名、动作动词、事件类型、严重级别(ALLOW/DENY/INFO/ERROR)、产品定义的事件码/类型 ID(如 Windows event ID)、厂商 syslog message ID、HTTP 状态码、端口号、数值指标、字段名与键、结构 token(括号、花括号、管道、逗号、制表符)、文件内容哈希、user agent 字符串、geo enrichment 中的城市和国家名、syslog PRI/RFC5424 头。
- 保留解析器或条件分支依赖的 enum/status/action 值不变。
适用边界 · 注意事项
- 不要用于需要保留真实身份以便复现或关联真实事件的场景(脱敏后跨事件关联只能基于占位符一致性)。
- 不要对已经是合成、畸形或无真实身份信息的值做替换,否则会改变形状。
- 不要用截断、删除重复字段或丢弃尾部 KV 对的方式“完成”脱敏。