CnOps 智能运维与可观测社区
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题
导航菜单
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题

CnOps 智能运维与可观测社区

愿景

CnOps 智能运维与可观测社区是一个以"智能运维与可观测"为核心的开放、包容、分享的技术社区,旨在聚集运维专家、开发者和爱好者,共同探讨、学习和分享可观测最佳实践与最新技术,与众多技术社区合作互动,共同探讨交叉领域的技术挑战,推动可观测领域的创新与进步。

内容社区

  • 实践文章
  • 视频课程
  • 开源项目
  • 常见问答
  • 开发者工具

友情链接

  • Prometheus
  • Grafana Lab
  • OpenTelemetry
  • LoongCollector

关注我们

阿里云云原生公众号阿里云云原生
阿里云可观测公众号阿里云可观测

Copyright © 2026 CnOps 社区. All rights reserved.

首页实践文章车企数据隐私保护必修课:如何用 SLS mask 守住日志中的敏感信息

车企数据隐私保护必修课:如何用 SLS mask 守住日志中的敏感信息

#SLS#数据隐私#GDPR#车联网

CNOps | 2026-10-25

车联网、车主服务和智能座舱日志在记录运行状态与业务参数时,也可能带入 VIN、身份信息、联系方式和地址。这些内容分散在请求、响应和交互文本中,还可能进入查询、告警和分析环节;海外业务与大模型应用进一步增加了识别复杂度。

image (90).png

图中:1 汽车数据管理规定第六条 · 2 GDPR 保护原则。

《汽车数据安全管理若干规定(试行)》第六条倡导脱敏处理,尽可能匿名化、去标识化。面向欧盟用户的汽车服务,还需关注 GDPR 的数据最小化及设计与默认数据保护原则。

阿里云日志服务 SLS 的 mask 函数可在采集或写入阶段替换匹配的敏感值,同时保留业务状态与调用链,并结合访问控制和保留期限管理减少暴露。下文通过车辆与车主服务、海外联网订阅、智能座舱交互三类业务中的四组日志,介绍规则选择与脱敏效果。

选择脱敏位置与识别方式

这些日志可能通过 LoongCollector 采集,也可能由 SDK、OpenAPI 直接写入 SLS。采集端可在发送前执行 mask 的 buildin、keyword 规则,替换匹配的敏感内容;服务端写入处理器则在日志到达 SLS 后、写入 Logstore 前执行脱敏。企业可按接入方式和处理要求选择位置,也可组合配置。

处理位置确定后,再根据内容选择识别方式:VIN、手机号、IMSI 等使用 buildin 内置规则;固定键对应的姓名、地址、用户标识和自定义凭证使用 keyword,两种模式均支持端上和服务端。中文自然语言中的姓名、地址使用 semantic模式,在服务端启用模型进行识别。

下文以写入处理器 SPL 展示配置。多种规则可在一次 mask 调用中组合,覆盖范围由接入配置、业务条件及指定字段决定;处理后的日志继续用于查询、告警和分析。

image (84).png

本文日志及个人信息均为构造示例

保护车辆标识与车主个人信息

车辆事件处理、身份核验和售后履约的排障依据不同,保留字段也不同:车辆日志保留信号与规则结果,身份接口保留核验状态,工单记录保留权益和服务进度。敏感值则按内置类型或固定键替换。下面三个案例分别说明这些配置。

案例 1:车联网事件处理日志

车辆信号经消息队列进入规则计算和云端诊断服务,事件日志会记录 VIN、软件版本、信号值与规则结果。同一 VIN 可能同时出现在事件头和嵌套载荷中,规则需要覆盖正文里的每一处匹配。

以下冷却液温度评估日志中,两处 VIN 使用占位符,车牌保留前两位,接口 token 按业务键替换。配置对整个 content 执行识别。

原始日志

{
  "time": "2026-10-13T09:18:42.036+08:00",
  "level": "INFO",
  "service": "vehicle-event-processor",
  "trace_id": "demo-event-a201",
  "event": "vehicle_signal_evaluated",
  "vin": "LZZAB12C7T1006842",
  "plate_no": "粤B24680",
  "payload": {
    "vin": "LZZAB12C7T1006842",
    "signal": "coolant_temperature",
    "value": 94,
    "rule_id": "coolant_temp_guard",
    "rule_version": "r12",
    "decision": "NORMAL"
  },
  "software_version": "5.4.0",
  "mq": {
    "topic": "vehicle.signal.events",
    "partition": 3,
    "offset": 873204
  },
  "latency_ms": 21,
  "token": "demo_vehicle_token_82"
}

SPL 配置

* | extend content = mask(content, '[
  {"mode":"buildin","types":["VIN"],"maskType":"placeholder"},
  {"mode":"buildin","types":["LICENSE_PLATE"],"keepPrefix":2},
  {"mode":"keyword","keys":["token"],"maskType":"placeholder"}
]')

脱敏后日志

image (85).png

处理后,外层 vin 和 payload.vin 均变为 [VIN_MASKED],车牌变为 粤B*****。信号值 94、判定 NORMAL、规则版本 r12 与软件版本 5.4.0 保持原值,可继续核对事件内容与版本。mq.offset 保留消费位点,latency_ms 保留处理耗时。

内置 VIN 识别包含格式与校验条件,异常格式的车辆标识可按已知键补充处理。需要跨日志追踪事件时,应选用经过评估的事件 ID 或 Trace ID;占位符及部分打码的车辆标识无法承担唯一关联键的作用。

案例 2:车主实名认证与车辆绑定

在用户中心,日志还会记录车主实名认证和车辆绑定的请求。身份信息可能出现在请求参数中,用户标识则可能同时出现在请求和数据库查询上下文中。检查这类接口时,需要隐藏个人信息,并保留核验结果和绑定状态。

owner_name、user_id 使用关键词占位符,中国大陆手机号保留前三后四,身份证号完全替换。用户标识以字符串记录,替换后 JSON 正文仍可解析。

原始日志

2026-10-13 09:24:16.218 INFO [owner-identity-service] trace_id=demo-owner-b018 uri=/api/owners/bind method=POST cost_ms=38 status=200
{
  "request": {
    "owner_name": "陈宁",
    "phone": "13900004567",
    "id_card": "320104199408190028",
    "user_id": "owner-demo-018"
  },
  "response": {
    "verification": "PASS",
    "binding_status": "SUCCESS",
    "code": "OK"
  },
  "query": {
    "mapper": "OwnerBindingRepository.findByUser",
    "user_id": "owner-demo-018"
  }
}

SPL 配置

* | extend content = mask(content, '[
  {"mode":"buildin","types":["PHONE"],"keepPrefix":3,"keepSuffix":4},
  {"mode":"buildin","types":["IDCARD"],"maskType":"placeholder"},
  {"mode":"keyword","keys":["owner_name","user_id"],"maskType":"placeholder"}
]')

脱敏后日志

image (86).png

 

请求和查询中的两处 user_id 都被替换,姓名和完整身份证号不再出现在正文中。verification=PASS、binding_status=SUCCESS 和 code=OK 保留,可确认这次请求已通过核验并完成绑定。日志头中的接口路径、Trace ID 和 38 毫秒耗时也保持原值,便于按请求查找调用记录。

keyword 配置需包含实际键名,例如 owner_name、userName 等命名应分别核对。手机号保留部分数字是本例的选择;不需要人工核对号码的业务可改用占位符。处理范围还应检查请求、响应及查询上下文中的重复信息。

按地域识别海外手机号与通信订阅标识

前面的手机号配置面向国内业务。企业开展海外联网服务时,日志仍需保留订阅状态和套餐信息,手机号及通信订阅标识则要按实际归属匹配。仅沿用国内规则,可能遗漏海外数据。

案例 3:欧洲联网订阅状态查询

车辆的 T-Box 或通信模块通过 SIM、eSIM 接入移动网络。连接管理平台查询订阅状态和流量额度时,运营商接口可能返回 IMSI,即国际移动用户识别码。它标识通信订阅,可关联同一订阅的服务记录,因此也应纳入脱敏范围。

示例为连接管理平台的业务汇总日志:phone、email 是订阅账户的联系方式,imsi、SIM 状态与流量额度来自通信订阅信息。

以下德国、英国两条订阅记录使用 regions=["DE","GB"] 识别手机号与 IMSI;邮箱隐藏 @ 前的本地部分,运营商接口 token 使用关键词规则。

原始日志

2026-10-13 09:41:22.075 INFO [connectivity-subscription-service] trace_id=demo-connect-d005 uri=/api/subscriptions/status method=GET cost_ms=34 status=200
{
  "code": "OK",
  "subscriptions": [
    {
      "market": "DE",
      "phone": "+4915700002468",
      "imsi": "262010000345678",
      "email": "driver.de@example.com",
      "sim_status": "ACTIVE",
      "connection_status": "CONNECTED",
      "quota_mb": 4096
    },
    {
      "market": "GB",
      "phone": "+447700900123",
      "imsi": "234100000456789",
      "email": "driver.gb@example.com",
      "sim_status": "ACTIVE",
      "connection_status": "CONNECTED",
      "quota_mb": 2048
    }
  ],
  "token": "demo_subscription_token_05"
}

SPL 配置

* | extend content = mask(content, '[
  {"mode":"buildin","types":["PHONE","IMSI"],"regions":["DE","GB"],"maskType":"placeholder"},
  {"mode":"buildin","types":["EMAIL"],"maskType":"anchor","maskBeforeChar":"@"},
  {"mode":"keyword","keys":["token"],"maskType":"placeholder"}
]')

脱敏后日志

image (87).png

当前 buildin 支持德国 DE、英国 GB 的手机号与 IMSI。本例中手机号输出 [PHONE_MASKED],IMSI 输出 [IMSI_MASKED];邮箱使用 anchor 保留域名;token 输出关键词占位符。号码和订阅标识被隐藏后,市场、连接状态及流量额度仍保持原值。

两条记录的 sim_status=ACTIVE、connection_status=CONNECTED 均保留,流量额度分别为 4096 MB 和 2048 MB,可继续查看订阅状态及套餐信息。regions 选择的是识别规则,车辆销售地不一定等于号码或 IMSI 的归属网络,尤其需要核对跨境连接方案中的实际号码。德国、英国的手机号与 IMSI 支持,不代表所有欧洲国家、证件和车牌类型均已覆盖。

识别座舱交互文本中的中文姓名与地址

前面的案例通过格式规则或业务键定位敏感值。座舱交互日志中的姓名和目的地则嵌在自然语言句子里,同一信息可能以不同表达出现。处理这类中文文本时,需要结合上下文确定实体边界,再与手机号、凭证等内置规则一起完成脱敏。

案例 4:座舱语音指令与大模型调用

座舱将语音转写文本交给意图识别或大模型,再调用通讯录、导航等工具。同一姓名和目的地可能在转写文本、工具返回与模型回复中重复出现,日志脱敏需要同时覆盖这些位置。

以下通话与导航组合指令中,使用mask的semantic 模式识别中文姓名、地址,buildin 处理手机号和符合支持特征的 API Key,keyword 处理自定义凭证键;模型名称、意图、工具状态和耗时保留。

原始日志

{
  "time": "2026-10-13T09:48:30.906+08:00",
  "service": "cockpit-assistant-gateway",
  "session_id": "session-demo-047",
  "trace_id": "demo-cockpit-e047",
  "model": "cockpit-text-model",
  "intent": "NAVIGATE_AND_CALL",
  "asr_text": "请给林晨打电话,号码是13600007890,然后导航到杭州市西湖区示例路28号。",
  "tool_calls": [
    {
      "name": "contacts.lookup",
      "result_text": "联系人林晨,联系电话13600007890。",
      "status": "SUCCESS"
    },
    {
      "name": "navigation.search",
      "result_text": "目的地为杭州市西湖区示例路28号。",
      "status": "SUCCESS"
    }
  ],
  "assistant_text": "已找到林晨,将导航至杭州市西湖区示例路28号。",
  "llm_api_key": "sk-DemoCockpitKeyAbcdef0123456789",
  "input_tokens": 96,
  "output_tokens": 27,
  "cost_ms": 463
}

SPL 配置

* | extend content = mask(content, '[
  {"mode":"semantic","types":["NAME","ADDRESS"],"maskType":"placeholder"},
  {"mode":"buildin","types":["PHONE","API_KEY"],"maskType":"placeholder"},
  {"mode":"keyword","keys":["token","api_key"],"maskType":"placeholder"}
]')

脱敏效果示意

image (88).png

脱敏后的日志可以看出,asr_text、两个 result_text 和 assistant_text 中的姓名、地址均按实体位置替换,手机号和 API Key 也被隐藏。模型名称、意图 NAVIGATE_AND_CALL、两个工具的 SUCCESS 状态、输入输出 Token 数及 463 毫秒总耗时保留。研发可核对意图与工具结果,并统计整体响应时间;分析各阶段耗时还需记录相应的计时字段。

使用类型标记与脱敏预览参数,兼顾隐私保护与问题定位

在自然语言和混合文本日志中,打码后仍可能需要区分手机号、凭证等信息类型,并保留必要的核对线索。prependPlaceholder:true 可在字符打码或锚点打码结果外添加类型标记,通常输出 [TYPE_MASKED]{脱敏预览},便于查询和审计时识别已处理的信息类别。

以案例 4 为例,姓名、地址继续使用占位符完全替换;手机号和 API Key 则保留前三后四,并附加类型标记。配置如下:

* | extend content = mask(content, '[
  {"mode":"semantic","types":["NAME","ADDRESS"],"maskType":"placeholder"},
  {"mode":"buildin","types":["PHONE","API_KEY"],"keepPrefix":3,"keepSuffix":4,"prependPlaceholder":true},
  {"mode":"keyword","keys":["token","api_key"],"keepPrefix":3,"keepSuffix":4,"prependPlaceholder":true}
]')

脱敏效果

image (89).png

可通过 [PHONE_MASKED] 判断这是已脱敏的手机号,用保留的前后缀辅助核对调用对象,再通过 trace_id 关联调用链路,查看工具调用状态和耗时。手机号的中间部分被隐藏,业务上下文保持可用。保留位数应按排障需要选择。

该参数也适用于姓名、地址等类型。例如,语义规则识别到“林晨”时,设置 keepPrefix: 1 和 prependPlaceholder: true,可输出 [NAME_MASKED]{林*}。

mask 配置要点与地域支持

函数调用形式为 mask(field, params):field 是待处理的字符串字段,params 是规则组成的 JSON 数组字符串。以下保留五个案例用到的主要参数。

主要参数

参数用途
mode

必填。

  • buildin 为内置识别
  • keyword 按键名匹配
  • semantic 识别中文姓名、地址(目前仅特定地域支持)
types、keysbuildin、semantic 用 types 指定类型;keyword 用 keys 指定业务键名。语义类型为 NAME、ADDRESS。
regions选择内置地域规则,仅对 PHONE、IDCARD、IMSI 生效,覆盖范围见下表,该字段不填时默认 CN。
maskChar替换字符,默认 *。用于默认字符打码及锚点打码。
keepPrefix、keepSuffix默认字符打码时保留的前、后字符数,均默认为 0。如手机号保留前三后四。
maskType
  • 省略时按字符打码
  • placeholder 替换为占位符
  • anchor 按锚点打码
maskBeforeChar配合 anchor 使用。案例 4 设为 @,替换邮箱用户名,保留 @ 及域名。
prependPlaceholder可选布尔值,默认 false。设为 true 时,在字符或锚点打码结果外添加类型标签。例如手机号保留前三后四:13600007890 → [PHONE_MASKED]{136****7890};未开启时为 136****7890。

前后保留位数只用于默认字符打码,anchor 使用锚点参数,placeholder 使用占位符。

内置类型与地域范围

types识别对象regions 支持情况
PHONE手机号支持,见下方地域矩阵
IDCARD身份证或个人身份识别号码支持,见下方地域矩阵
IMSI移动通信订阅标识支持,见下方地域矩阵
VIN17 位车辆识别代号不支持地域切换,按内置格式及校验规则识别
LICENSE_PLATE中国大陆车牌不支持地域切换,仅中国大陆规则
LANDLINE_PHONE中国大陆固定电话不支持地域切换,仅中国大陆规则
EMAIL邮箱地址不按地域选择规则
CREDIT_CARD银行卡号不按地域选择规则,需符合内置格式及校验规则
IP_ADDRESSIPv4 地址不按地域选择规则
ACCESSKEY阿里云 LTAI 前缀的 AccessKey ID不按地域选择规则
API_KEY符合内置规则的 sk-、GitHub Token 格式不按地域选择规则

只有 PHONE、IDCARD、IMSI 支持地域切换,“—”表示当前无对应内置规则。

regions 代码国家或地区PHONEIDCARDIMSI
CN中国大陆支持支持支持
HK中国香港支持支持支持
DE德国支持—支持
GB英国支持—支持
AE阿联酋支持—支持
SA沙特阿拉伯支持—支持
SG新加坡支持—支持
KZ哈萨克斯坦支持支持—
UZ乌兹别克斯坦支持支持—
RU俄罗斯支持——

更多脱敏使用方式,可参考明文不扩散,日志仍可用:阿里云可观测敏感数据保护方案。

文章大纲

推荐文章

超过 2000+ 位开发者正在阅读

给 OpenClaw 加上企业级 Memory

给 OpenClaw 加上企业级 Memory

4646 阅读

阿里云 STAROps 全域智能运维平台发布!

阿里云 STAROps 全域智能运维平台发布!

3453 阅读

阿里云正式发布 RCA Benchmark

阿里云正式发布 RCA Benchmark

2716 阅读

推荐视频

UModel 最佳实践 Vol.1 UModel 数据建模全景解读

UModel 最佳实践 Vol.1 UModel 数据建模全景解读

3854 观看50:35
云监控2.0全景:可观测范式升级与智能运维蓝图

云监控2.0全景:可观测范式升级与智能运维蓝图

2532 观看41:06

推荐工具

精选可观测领域开发者工具

云监

云监控 2.0 沙箱体验

7483 使用

免费

免费网络拨测工具

2746 使用