跳到正文
阿里云云原生· 阿里云云原生·· 5 小时前AI 评分58

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

AI 导读

阿里云云原生介绍日志服务 SLS 的 mask 函数在车企日志场景下的脱敏配置方法,可在采集或写入阶段替换敏感值,同时保留业务状态与调用链。

正文

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

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

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

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

选择脱敏位置与识别方式

Cloud Native

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

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

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

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

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

Cloud Native

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

▍案例 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"}
]')

脱敏后日志

处理后,外层 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"}
]')

脱敏后日志

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

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

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

Cloud Native

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

▍案例 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"}
]')

脱敏后日志

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

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

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

Cloud Native

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

▍案例 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"}
]')

脱敏效果示意

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

使用类型标记与脱敏预览参数,

兼顾隐私保护与问题定位

Cloud Native

在自然语言和混合文本日志中,打码后仍可能需要区分手机号、凭证等信息类型,并保留必要的核对线索。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}
]')

脱敏效果

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

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

mask 配置要点与地域支持

Cloud Native

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

▍主要参数

参数

用途

mode

必填。

  • buildin 为内置识别

  • keyword 按键名匹配

  • semantic 识别中文姓名、地址(目前仅特定地域支持)

types、keys

buildin、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

移动通信订阅标识

支持,见下方地域矩阵

VIN

17 位车辆识别代号

不支持地域切换,按内置格式及校验规则识别

LICENSE_PLATE

中国大陆车牌

不支持地域切换,仅中国大陆规则

LANDLINE_PHONE

中国大陆固定电话

不支持地域切换,仅中国大陆规则

EMAIL

邮箱地址

不按地域选择规则

CREDIT_CARD

银行卡号

不按地域选择规则,需符合内置格式及校验规则

IP_ADDRESS

IPv4 地址

不按地域选择规则

ACCESSKEY

阿里云 LTAI 前缀的 AccessKey ID

不按地域选择规则

API_KEY

符合内置规则的 sk-、GitHub Token 格式

不按地域选择规则

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

regions 代码

国家或地区

PHONE

IDCARD

IMSI

CN

中国大陆

支持

支持

支持

HK

中国香港

支持

支持

支持

DE

德国

支持

—

支持

GB

英国

支持

—

支持

AE

阿联酋

支持

—

支持

SA

沙特阿拉伯

支持

—

支持

SG

新加坡

支持

—

支持

KZ

哈萨克斯坦

支持

支持

—

UZ

乌兹别克斯坦

支持

支持

—

RU

俄罗斯

支持

—

—

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

相关链接:

[1] 汽车数据管理规定第六条

https://www.cac.gov.cn/2021-08/20/c_1631049984897667.htm

[2] GDPR 保护原则

https://commission.europa.eu/law/law-topic/data-protection/information-business-and-organisations/principles-gdpr_en

[3]《明文不扩散,日志仍可用:阿里云可观测敏感数据保护方案》

https://developer.aliyun.com/article/1748652

来源:阿里云云原生 · mp.weixin.qq.com