数据分类与标记:敏感数据识别与分类方法

说到数据分类与标记,其实是整个 DLP 项目中最容易被低估的一环。我见过好几个团队,上来就部署 DLP 策略,结果发现误报率高达 80%——为什么?说白了,就是没搞清楚自己的数据到底长什么样。

这一章咱们就聊聊怎么系统性地识别敏感数据,然后给它打上标签。内容不算复杂,但你要是跳过,后面做告警关联的时候大概率会抓瞎。

敏感数据长什么样?先摸清家底

你想想看,敏感数据其实就三种存在形式:结构化数据(数据库里的身份证号、手机号)、半结构化数据(XML、JSON 里夹着的信用卡号)、非结构化数据(合同、邮件、聊天记录里的秘密)。

我在项目里踩过最大的坑,就是只盯着结构化数据看,结果漏了 Word 文档里的客户隐私。后来学乖了——先做一次数据资产盘点,把所有可能存数据的资产列出来,Excel 里画个矩阵。

数据源类型 典型敏感字段 常见存放位置
关系数据库 身份证、手机号、银行卡 客户表、订单表、员工表
文件服务器 合同、简历、财务报表 共享文件夹、归档目录
邮件系统 附件、正文中的敏感词 Exchange、Gmail 归档
云存储 配置密钥、用户数据 S3 桶、OneDrive
建议:先从最容易出事的数据源开始——比如包含大量 PII 的生产数据库。别试图一次覆盖所有资产,分三周干完就行。

识别敏感数据的三种武器

摸清了数据在哪,接下来就是识别。我一般把它分成三个层次:

  1. 正则表达式匹配:最简单的武器。比如身份证号 18 位数字+字母 X,手机号 1[3-9] 开头。我在某项目中用一条正则在 5 分钟内扫出 12000 条未经脱敏的明文卡号。
  2. 关键词 + 上下文规则:光有正则不够。比如“密码”这个关键词出现在配置文件和聊天记录里,意义完全不同。我会加上邻近词判断,像“password=xxx”才算敏感。
  3. 机器学习分类器:对付非结构化数据的主力。训练一个轻量分类模型,判断一段文本是否包含“个人信息”或“商业机密”。我曾经用 500 条标注样本训练出的朴素贝叶斯,准确率就能到 85%。
# 一个极简的手机号正则识别
import re

phone_pattern = r'1[3-9]\d{9}'
text = "联系人张三,手机:13800138000"
match = re.search(phone_pattern, text)
if match:
    print(f"找到敏感数据:{match.group()}")
注意:正则表达式容易产生大量误报。比如连续数字也可能是订单号。我习惯在正则匹配后加一道“白名单”过滤——把常见公共数据或测试数据排除掉。

分类方法:给数据贴个标签

识别出来之后,得给它分个级、贴个标签。我习惯用这种四级分类:

等级 示例 标记颜色
公开 公司简介、产品文档 绿色
内部 内部通讯录、会议纪要 蓝色
敏感 客户 PII、合同金额 黄色
高敏感 密钥、用户密码、核心算法 红色

分类方法分两种路子:手动标记(靠人拍脑袋,适合刚起步)和自动标记(靠规则/模型,适合大规模)。我偏向混合策略——先用自动规则覆盖掉 70% 的数据,剩下难啃的骨头让安全团队人工审核。

关键原则:分类粒度不要太细。太多等级会导致运维人员记不住,最后谁都不遵守。4~5 级刚刚好。

标记技术:标签、水印、元数据

分了类就得留下证据。三种主流方式:

  • 元数据标签:在文件系统或数据库表上加扩展属性。比如 S3 的 Tag,SQL Server 的扩展属性。我常用这个方法——轻量且便于审计查询。
  • 文件水印:给 PDF/Office/图片加上不可见的水印,里面嵌入分类等级和时间戳。适合防止截图外泄的场景。
  • 列级别标记:在数据湖或数仓里,给敏感列打上标签。例如在 Hive 表上添加 COMMENT 'SENSITIVE: PII'。DLP 策略可以直接读这个标签。

核心流程:一张图讲清楚

下面这张图展示了从原始数据到已标记数据的完整流水线。你看一遍基本就能 get 到整个分类标记的逻辑——

数据分类与标记流程 原始数据源 敏感数据识别引擎 分类规则库 分类结果(等级) 标记器 已标记数据 说明:规则库可以定期更新,识别引擎的输出会回馈改善分类逻辑

避坑指南:我踩过的那些雷

我曾经在客户那边吃过一个大亏。当时我们自动用正则扫了一堆 CSV 文件,标记了 “SENSITIVE”,结果业务部门炸了——那些是脱敏后的测试数据。后来我才加上一条铁律:任何自动标记结果必须经过人工抽样验证,抽样率不低于 5%。

还有一次,我们给文件系统做水印标记,结果把生产系统搞慢了。原来水印引擎在每次文件写操作时都会触发,直接把 I/O 打满了。解决办法很简单:只对“高敏感”等级的文件做实时水印,其余等级用异步任务批量处理。

一句话总结别犯的错误:不要一上来就给所有数据贴标签。先挑一个业务线跑通流程,验证准确率,再推广到全公司。

小工具推荐:自动化分类脚本片段

最后给一个我常用的片段。它用关键字 + 正则组合快速给文本分段打分,超过阈值就自动贴标签。你可以照着改改,放在 DLP 前置机里跑:

def classify_text(text):
    score = 0
    # 正则匹配敏感模式
    if re.search(r'\b\d{18}[\dX]\b', text):
        score += 5   # 身份证
    if re.search(phone_pattern, text):
        score += 3   # 手机号
    if 'confidential' in text.lower():
        score += 4   # 机密关键词
    # 阈值判断
    if score >= 8:
        return 'HIGHLY_SENSITIVE'
    elif score >= 4:
        return 'SENSITIVE'
    else:
        return 'INTERNAL'

说白了,数据分类与标记就是给 DLP 打地基。地基稳了,后面的告警关联才能真正落地。你可以在实际环境里拿一个小范围数据先验证一下效果,看看误报率到底有多少。