本项目实现 dlpagent.html 中的模块一:敏感文件识别 Agent。
核心流水线:文件抽取 → 固定格式检测(18 种正则)→ 业务语义检测(16+10 组关键词)→ 规则生成(regex/keyword/compound)→ 指纹计算(SHA256 + SimHash)→ 向量化(可选)→ Agent 解释(可选)。
# 1. 确保 Go 1.21+ 已安装
go version
# 2. 下载 Go 模块依赖
cd d:\0-实训项目
go mod download
# 3. 安装可选工具(按需)
winget install UB-Mannheim.TesseractOCR # 图片 OCR 文本提取
winget install 7zip.7zip # rar/7z 解压 + Outlook .msg 解析Tesseract 中文 OCR 需额外安装中文语言包,安装后运行
tesseract --list-langs确认包含chi_sim。
# 设置环境变量(LLM 和 Embedding 均为可选)
$env:ARK_CHAT_MODEL="<chat endpoint id>"
$env:ARK_EMBEDDING_MODEL="<embedding endpoint id>"
$env:ARK_API_KEY="<api key>"
$env:ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3"
$env:ARK_REGION="cn-beijing"
# 启动
go run ./cmd/dlpagent server --addr :8080浏览器访问 http://127.0.0.1:8080。
| 步骤 | 操作 | 说明 |
|---|---|---|
| ① 生成样本 | 点击"生成样本" | 已提供 data/sample_library/,可直接跳过 |
| ② 上传入库 | 选择样本文件 → 上传入库 | 自动分析风险等级并写入敏感文件库 |
| ③ 查看样本库 | 点击"查看样本库" | 确认入库文件的敏感类型和风险等级 |
| ④ 生成规则 | 点击"生成规则" | 输出 data/rules.json,供客户端拉取 |
| 步骤 | 操作 | 说明 |
|---|---|---|
| ① 同步规则 | 点击"同步规则" | 从服务端拉取最新 rules.json |
| ② 识别/扫描 | 单文件识别 或 批量扫描目录 | 对文件提取文本并匹配规则 |
| ③ 查看标签 | 点击"刷新标签" | 查看 SQLite 中的敏感文件标记 |
| 等级 | 文件数 | 格式 | 识别通过率 |
|---|---|---|---|
| critical | 16 | txt/csv/json/xml/md/docx/xlsx/pptx/pdf/go/py/java/sql/ini/cfg/conf | 100% |
| high | 16 | 同上 | 100% |
| medium | 16 | 同上 | 100% |
| low | 16 | 同上 | 100% |
| 目录 | 文件数 | 格式 | 识别通过率 |
|---|---|---|---|
| sensitive_critical | 25 | 25 种格式 | 23/25 |
| sensitive_high | 25 | 25 种格式 | 24/25 |
| sensitive_medium | 25 | 25 种格式 | 23/25 |
| sensitive_low | 25 | 25 种格式 | 24/25 |
| nonsensitive | 25 | 25 种格式 | 25/25 |
未通过项:.dat × 5(二进制仅指纹,设计如此)、.png × 2(依赖 Tesseract OCR 精度)。
go run ./cmd/dlpagent gen-samples --out data/sample_library # 样本库
go run ./cmd/dlpagent gen-testset --out data/test_set # 测试集
⚠️ 重新生成后,PPTX、PDF 需按data/sample_library/PPTX_PDF内容.md手动替换;PPT、PPTX、PDF、PNG、7z、RAR、ZIP 需按data/test_set/手动替换指南.md手动替换,才能通过全部验证。
| 等级 | 触发条件 |
|---|---|
| critical | 私钥存在 或 同时命中 ≥3 个数据库连接串 + ≥2 个密码 |
| high | 包含凭证(密码/API Key/数据库连接串) |
| medium | 业务关键词 + PII 同时出现,或加权分 ≥ 7 |
| low | 有命中但低于 medium 门槛 |
| info | 无任何匹配 |
critical也可由 LLM 输出,但规则引擎独立产出。上传入库时 LLM 仅填充explanation,不覆盖risk_level。
# 单文件识别
go run ./cmd/dlpagent identify --file data/sample_library/critical_纯文本文件_01.txt
# 生成规则集
go run ./cmd/dlpagent gen-rules --input data/sample_library/critical_纯文本文件_01.txt,data/sample_library/medium_Excel表格_07.xlsx --out data/rules.json
# 目录扫描
go run ./cmd/dlpagent scan --root data/test_set --rules data/rules.json --db data/labels.db
# 生成样本库
go run ./cmd/dlpagent gen-samples --out data/sample_library
# 生成测试集
go run ./cmd/dlpagent gen-testset --out data/test_set
# 启动 HTTP 服务
go run ./cmd/dlpagent server --addr :8080| 接口 | 方法 | 说明 |
|---|---|---|
/health |
GET | 健康检查 |
/api/synth |
POST | 生成合成样本 |
/api/samples/upload |
POST | 上传样本入库 |
/api/identify |
POST | 单文件识别 |
/api/rules/generate |
POST | 生成规则集 |
/api/scan |
POST | 目录扫描 |
/api/labels |
GET | 查看标签库 |
/api/client/rules |
GET | 客户端拉取规则 |
/api/library/samples |
GET | 查看样本库记录 |
| 类别 | 扩展名 |
|---|---|
| 文本/代码/配置 | .txt .md .csv .json .xml .yaml .yml .ini .cfg .conf .log .sql .go .py .java .js .ts .tsx .jsx .sh .ps1 .rb .php .rs .c .cc .cpp .h .hpp .cs .kt .swift |
| Office/PDF | .pdf .doc .docx .xls .xlsx .ppt .pptx |
| 图片 OCR | .png .jpg .jpeg .webp .gif .bmp .tiff |
| 压缩包 | .zip .rar .7z .tar .gz |
| 邮件 | .eml .msg |
固定格式(18 类): 身份证号、手机号、银行卡号、邮箱、地址、车牌号、护照号、社保号、税号、统一社会信用代码、API Key、Access Token、私钥、密码、数据库连接串、内网 IP、域名、账号凭证。
企业业务(15 类): 合同编号、客户名称、客户联系方式、项目名称、报价信息、财务数据、薪酬数据、组织架构、商业计划、招投标文件、源代码、内部接口文档、系统架构图、安全漏洞信息、运维账号信息。
文档语义(10 类): 保密协议、客户名单、财务预算、报价单、薪资明细、研发设计文档、源代码说明、内部培训资料、未公开财报、战略规划。
.
├─ cmd/dlpagent/main.go CLI 入口
├─ internal/
│ ├─ agent/agent.go Eino ADK ChatModelAgent(LLM 可选)
│ ├─ analysis/analysis.go 分析流水线(抽取 → 检测 → 规则 → 指纹 → 向量 → 解释)
│ ├─ api/
│ │ ├─ server.go HTTP API
│ │ └─ web/index.html 内置前端(服务端 + 客户端工作台)
│ ├─ config/config.go 环境变量配置
│ ├─ detect/detect.go 敏感信息检测 + risk_level 分级
│ ├─ embed/embed.go Ark Embedding 封装(可选)
│ ├─ extract/ 多格式文本抽取(PDF/OOXML/图片/压缩包/邮件)
│ ├─ fingerprint/fingerprint.go SHA256 + SimHash
│ ├─ rules/rules.go 规则生成、保存、加载、匹配(regex/keyword/compound/AND/OR)
│ ├─ scan/scan.go 目录扫描与标签生成
│ ├─ store/
│ │ ├─ sqlite.go SQLite 标签存储
│ │ └─ library.go 敏感文件库与规则集存储
│ ├─ synth/
│ │ ├─ generator.go 原始合成样本生成器
│ │ └─ datasets.go 样本库 + 测试集生成器
│ ├─ types/types.go 数据结构
│ └─ util/ 文件类型检测、文本工具
└─ data/
├─ sample_library/ 样本库(64 文件)
├─ test_set/ 测试集(125 文件)
├─ library.db 敏感文件库 + 规则集
└─ labels.db 客户端标签库
| 需求 | 状态 | 位置 |
|---|---|---|
| 正则规则 | ✅ | detect.go 18 种正则 |
| 关键词规则 | ✅ | detect.go 16 组业务 + 10 组语义 |
| 组合规则(AND/OR) | ✅ | rules.go |
| 文件指纹(SHA256 + SimHash) | ✅ | fingerprint.go |
| 语义向量(可选) | ✅ | embed.go |
| 文本文件抽取 | ✅ | txt/csv/json/xml/md/代码/配置 |
| 办公文档抽取 | ✅ | docx/xlsx/pptx + 旧版 .doc/.xls/.ppt |
| PDF 抽取 | ✅ | extract/pdf.go |
| 图片 OCR | ⬚ | 需 Tesseract |
| 压缩包抽取 | ✅ | zip/tar/gz(rar/7z 需 7-Zip) |
| 邮件解析 | ✅ | eml/msg |
| 样本上传入库 | ✅ | API + 前端 |
| 规则集生成 | ✅ | rules.go + API |
| 客户端规则拉取 | ✅ | GET /api/client/rules |
| 目录扫描 | ✅ | scan.go + API |
| 敏感文件标记(SQLite) | ✅ | store/sqlite.go |
| 前端操作台 | ✅ | 服务端 + 客户端双页面 |
| 内容 | 必须 | 用途 |
|---|---|---|
| Go 工具链 | 是 | 编译运行 |
| Tesseract OCR | 否 | 图片文本识别 |
| 7-Zip | 否 | rar/7z 解压、Outlook .msg 解析 |
| 火山方舟 API | 否 | LLM 解释 + Embedding 向量化 |