第3章 敏感数据发现技术:内容扫描、元数据分析与指纹识别

说实话,做DLP项目第一步就卡住的情况,我见得太多了。很多团队一上来就定规则、设策略,结果漏报满天飞。

问题出在哪?——压根没搞清楚自己的敏感数据到底长什么样、藏在哪。

敏感数据发现,说白了就是先要搞清楚你的家底。你连家里有多少钱、放在哪个抽屉都不知道,怎么装防盗门?

这一章,我们就聊三种最基本、也最实用的发现手段。我在多个数据安全项目里都把它们当组合拳来打。

敏感数据发现技术框架 敏感数据发现技术全景 内容扫描 正则 / 关键字 / NLP 元数据分析 文件属性 / 标签 / 路径 指纹识别 精确 / 模糊 / 哈希 数据分类分级 支撑DLP策略制定 迭代优化 正则表达式匹配 身份证 / 手机号 / 银行卡 文件标签与分类 敏感词 / 责任人 精确指纹(全文哈希) 100%匹配

3.1 内容扫描:最直接的挖掘方式

内容扫描的工作方式很简单——打开文件、读内容、匹配规则。

我早期做的一款邮件DLP原型,就是靠正则跑全文扫描。效果明显,但坑也不少。

3.1.1 正则表达式匹配

这是最基础,也是最容易被误报的技术。你想想看,一个规则的严谨程度,直接决定了你后续要花多少精力处理告警。

个人习惯:优先使用官方或行业标准正则库,不要自己「发明」匹配规则。
比如身份证号,不仅要看18位数字,还要校验校验位和出生日期范围。
# 身份证号 18 位正则示例(含校验位)
^(?:[1-9]\d{5}[1-9]\d{3}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx])$

我在一个金融客户现场就踩过坑。他们的CRM系统里存了大量客户经理的工号,格式刚好符合15位身份证的规则。结果规则一上线,直接报警上万条——全是误报。

避坑指南:我曾经因为没做「上下文白名单」吃了大亏。建议在正则前后加几个关键字辅助判断。
比如身份证号前面要有「身份证号:」、「证件号码」等上下文标识。

3.1.2 关键字组合扫描

有些场景正则搞不定,比如合同的敏感条款。这时候关键字组合反而更靠谱。

关键字规则典型场景误报率(经验值)
含「机密」+「项目编号」研发文档5%-10%
含「不公开」+「财报」财务文件15% 左右
含「密码」+ 「.sql」数据库脚本20% 以上

为什么误报率差异这么大?核心在于关键字的区分度。「密码+sql」在很多运维手册里也经常一起出现,但根本不含真实凭据。

3.1.3 NLP 语义识别

这几年NLP也开始用在敏感数据扫描上。说白了,就是让模型理解一句话的「意图」。

比如「张三工资 25000」和「张三出差费用 2500」,前者是薪资数据,后者是报销数据。正则很难区分,但NLP可以。

注意:NLP 方案目前还不能单独扛大旗。我建议用它做「二次研判」,而不是主扫描通道。
原因很简单——模型推理的延迟和GPU开销,搞全量扫描成本太高。

3.2 元数据分析:不打开文件也能识别

这个技术很多人容易忽略。但你想想看,如果一个文件的扩展名是 .xlsx,标题是「2025年薪酬表」,创建者是HR主管——你还需要打开它才知道里面有什么吗?

元数据分析就是在文件本身打开之前,通过文件属性、标签、路径、作者等信息做快速预判。

3.2.1 常见的元数据字段

  • 文件扩展名:.xlsx / .docx / .pdf / .sql
  • 文件大小:超大文件可能含数据库备份
  • 最后修改者:敏感部门(财务、HR、法务)
  • 存储路径:/财务/薪资/ 这种路径本身就泄露信息
  • 自定义标签:Windows的NTFS备用数据流、SharePoint标签
我在项目中遇到过:一个客户的DLP扫描引擎只做内容扫描,结果每天高峰期CPU飙到90%。后来我建议加了一层元数据预过滤——先根据文件名和目录排除90%的「明显非敏感」文件,CPU直接降到40%。

3.2.2 元数据的局限性

这里我要泼点冷水。元数据分析的准确性上限不高。用户完全可以把一份薪资表改名为「团建照片.zip」然后外发——元数据扫描会直接漏掉。

所以:元数据适合做兜底扫描(快速排除),不适合做唯一发现手段。我是把它当作扫描流水线上的「预处理器」用的。

3.3 指纹识别:最精确的发现方式

指纹识别是三种技术里准确率最高的。它不依赖规则,而是基于样本本身。

我把它分两类:

  1. 精确指纹:文件全量哈希(SHA-256 / MD5),100%匹配,改一个字符就不匹配。
  2. 模糊指纹:基于内容分片(shingle / simhash),允许部分修改。

3.3.1 精确指纹的使用场景

适合固定的合同模板、政策文件、源代码基线。

# 生成精确指纹
import hashlib

def gen_fingerprint(file_path):
    with open(file_path, 'rb') as f:
        content = f.read()
    return hashlib.sha256(content).hexdigest()

用这个,你可以把公司所有已签署合同的指纹提前入库。后面任何人在邮件、网盘、U盘里发这个文件,DLP都能精准识别。

3.3.2 模糊指纹的实际价值

精确指纹太死板。用户把文档改个标题、改个尾页,哈希就变了。这时候就得用模糊指纹。

我记得做某银行项目时,有员工把客户的身份证照片截屏后,用微信发给自己。截屏和原文件哈希完全不同,但内容的shingle指纹能对上一部分。模糊指纹就是专门对付这种「变型」操作的。

经验分享:选择模糊指纹算法时,注意两点——
1. 分片粒度(shingle size)建议设为 8-16 字节,太细容易误报,太粗容易漏报。
2. 阈值不要设固定值。我在项目中一般会跑一次样本测试,找到「召回率 vs 误报率」的最佳平衡点。

3.4 三种技术的组合策略

场景推荐技术组合我的建议
财务数据外发内容扫描(关键字)+ 指纹先用关键字粗筛,再用指纹精确定位
源代码泄露元数据(文件后缀)+ 模糊指纹防篡改名称和部分代码修改
合同统一管控精确指纹 + 元数据(作者/部门)适合标准化文件基线

没有哪种技术是万能的。我自己的做法是:元数据做第一道门(快速滤掉90%的非敏感文件),内容扫描做第二道门(识别有规律敏感字段),指纹做最内层的精准射击(锁定变异版本)。

最后提醒一点:敏感数据发现是个持续过程,不是一次性项目。数据在变、人在变、业务在变。
我曾经见过一个团队,扫描规则写好后就再也没更新过。半年后新业务上线,新类型的敏感数据根本没覆盖到。
定期重扫、增加新样本、更新规则——这三件事一个月至少做一次。