跳转至

企业大模型数据分类与脱敏规范

版本:v1.0
编制日期:2026-03-26
适用对象:数据管理员、安全团队、开发团队


一、数据分类分级

1.1 分类分级原则

原则 说明 实施要点
最小化 只收集和存储必要数据 数据收集前评估必要性
分级保护 不同级别采用不同保护措施 L1-L5 分级管理
全程管控 数据全生命周期保护 采集→传输→存储→使用→销毁
责任明确 明确数据所有者和管理者 数据 Owner 制度

1.2 数据分级定义

┌─────────────────────────────────────────────────────────────────────────┐
│                          数据分级保护矩阵                               │
│                                                                         │
│  级别  │  名称    │  定义                    │  示例                  │
│  ─────┼─────────┼──────────────────────────┼────────────────────────│
│  L1   │  公开    │  可对外公开的信息          │  产品介绍、新闻稿      │
│  ─────┼─────────┼──────────────────────────┼────────────────────────│
│  L2   │  内部    │  仅限内部员工知悉          │  内部通知、会议纪要    │
│  ─────┼─────────┼──────────────────────────┼────────────────────────│
│  L3   │  敏感    │  泄露会造成一定损失        │  客户姓名、电话、邮箱  │
│  ─────┼─────────┼──────────────────────────┼────────────────────────│
│  L4   │  高度敏感│  泄露会造成严重损失        │  身份证、银行卡、住址  │
│  ─────┼─────────┼──────────────────────────┼────────────────────────│
│  L5   │  机密    │  泄露会造成重大损失        │  商业机密、核心算法    │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

1.3 详细数据分类表

L1 - 公开数据

数据类型 具体示例 可否上云 处理方式
产品信息 产品描述、规格参数 ✅ 可以 无需特殊处理
公开文档 用户手册、FAQ ✅ 可以 无需特殊处理
新闻稿 公司新闻、公告 ✅ 可以 无需特殊处理
营销材料 宣传册、广告文案 ✅ 可以 无需特殊处理
公开代码 开源代码、示例代码 ✅ 可以 无需特殊处理

处理规范: - ✅ 可直接使用公有云 API - ✅ 无需脱敏 - ✅ 无需加密存储


L2 - 内部数据

数据类型 具体示例 可否上云 处理方式
内部通知 行政通知、人事通知 ⚠️ 谨慎 建议脱敏
会议纪要 部门会议、项目会议 ⚠️ 谨慎 建议脱敏
工作流程 内部流程文档 ⚠️ 谨慎 建议脱敏
培训材料 内部培训资料 ⚠️ 谨慎 建议脱敏
一般代码 业务代码、脚本 ⚠️ 谨慎 建议脱敏

处理规范: - ⚠️ 建议使用专属 API 或专属云 - ⚠️ 建议移除人员姓名等标识 - ✅ 传输需加密


L3 - 敏感数据

数据类型 具体示例 可否上云 处理方式
客户信息 客户姓名、公司名称 ❌ 不建议 必须脱敏
联系方式 工作电话、工作邮箱 ❌ 不建议 必须脱敏
合同信息 合同金额、合作条款 ❌ 不建议 必须脱敏
项目信息 项目名称、进度 ❌ 不建议 必须脱敏
供应商信息 供应商名称、联系方式 ❌ 不建议 必须脱敏

处理规范: - ❌ 禁止使用公有云 API - ✅ 必须使用专属云或私有化 - ✅ 必须脱敏后处理 - ✅ 完整审计日志

脱敏规则

1
2
3
4
客户姓名:张三 → 张*
工作电话:021-12345678 → 021-****5678
工作邮箱:zhangsan@company.com → z***n@company.com
合同金额:100 万元 → [已脱敏]


L4 - 高度敏感数据

数据类型 具体示例 可否上云 处理方式
个人身份 身份证号、护照号 ❌ 禁止 本地处理
金融信息 银行卡号、账户信息 ❌ 禁止 本地处理
生物特征 指纹、人脸数据 ❌ 禁止 本地处理
健康信息 病历、体检报告 ❌ 禁止 本地处理
家庭住址 详细居住地址 ❌ 禁止 本地处理
个人通信 私人邮件、聊天记录 ❌ 禁止 本地处理

处理规范: - ❌ 禁止上传云端 - ✅ 必须本地处理或私有化部署 - ✅ 必须加密存储 - ✅ 严格访问控制 - ✅ 完整审计追踪

脱敏规则

1
2
3
身份证号:110101199001011234 → ***************
银行卡号:6222021234567890 → ****************
手机号:13800138000 → 1****8000


L5 - 机密数据

数据类型 具体示例 可否上云 处理方式
商业机密 核心算法、配方 ❌ 禁止 完全离线
战略规划 公司战略、并购计划 ❌ 禁止 完全离线
财务核心 未公开财报、预算 ❌ 禁止 完全离线
核心技术 专利前的技术 ❌ 禁止 完全离线
国家秘密 涉及国家秘密的信息 ❌ 禁止 完全离线

处理规范: - ❌ 禁止任何形式的网络连接 - ✅ 完全离线环境处理 - ✅ 物理隔离 - ✅ 专人专机 - ✅ 严格审批流程


二、数据脱敏规范

2.1 脱敏方法

方法 说明 适用场景 示例
替换 用固定字符替换 身份证、银行卡 110101199001011234 → ***************
截断 保留部分字符 手机号、邮箱 13800138000 → 1****8000
哈希 单向哈希处理 需要关联的场景 user123 → 5f4dcc3b5aa765
加密 可逆加密 需要还原的场景 明文 → AES 加密密文
泛化 精确值变为范围 年龄、收入 35 岁 → 30-40 岁
扰动 添加随机噪声 统计场景 10000 元 → 10000±500 元
屏蔽 完全隐藏 极高敏感数据 敏感内容 → [已脱敏]

2.2 脱敏规则配置

# masking-rules.yaml

masking:
  # 中国身份证
  - name: china_id_card
    pattern: "\\d{17}[\\dXx]"
    method: replace
    replacement: "****************"
    level: L4

  # 手机号
  - name: mobile_phone
    pattern: "1\\d{10}"
    method: truncate
    keep_prefix: 1
    keep_suffix: 4
    replacement_char: "*"
    level: L3

  # 固定电话
  - name: landline_phone
    pattern: "\\d{3,4}-\\d{7,8}"
    method: truncate
    keep_prefix: 4
    keep_suffix: 4
    replacement_char: "*"
    level: L3

  # 邮箱
  - name: email
    pattern: "[\\w.-]+@[\\w.-]+\\.[\\w]+"
    method: truncate
    keep_prefix: 1
    keep_suffix: 10
    replacement_char: "*"
    level: L3

  # 银行卡号
  - name: bank_card
    pattern: "\\d{16,19}"
    method: replace
    replacement: "****************"
    level: L4

  # 中国姓名
  - name: chinese_name
    type: chinese_name
    method: replace
    replacement: "**"
    level: L3

  # 地址
  - name: address
    pattern: "(.*?省 | .*?)市 | .*?) (.*?区 | .*?)县.*"
    method: replace
    replacement: "[已脱敏地址]"
    level: L4

  # IP 地址
  - name: ip_address
    pattern: "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"
    method: truncate
    keep_prefix: 7
    replacement_char: "*"
    level: L2

  # 日期时间
  - name: datetime
    pattern: "\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}"
    method: generalize
    precision: day
    level: L2

  # 金额
  - name: amount
    pattern: "¥?\\d{1,3}(,\\d{3})*(\\.\\d{2})?"
    method: generalize
    ranges:
      - max: 10000
        label: "1 万以下"
      - max: 100000
        label: "1  -10 万"
      - max: 1000000
        label: "10  -100 万"
      - label: "100 万以上"
    level: L3

2.3 脱敏引擎实现

# masking_engine.py

import re
import hashlib
from typing import Dict, List, Optional
from dataclasses import dataclass
from enum import Enum

class DataLevel(Enum):
    L1 = "公开"
    L2 = "内部"
    L3 = "敏感"
    L4 = "高度敏感"
    L5 = "机密"

@dataclass
class MaskingRule:
    name: str
    pattern: str
    method: str
    replacement: str
    level: DataLevel
    enabled: bool = True

class MaskingEngine:
    def __init__(self, rules: List[MaskingRule]):
        self.rules = {rule.name: rule for rule in rules if rule.enabled}

    def detect_level(self, text: str) -> DataLevel:
        """检测文本中的数据级别"""
        max_level = DataLevel.L1
        for rule in self.rules.values():
            if re.search(rule.pattern, text):
                if rule.level.value > max_level.value:
                    max_level = rule.level
        return max_level

    def mask(self, text: str, target_level: DataLevel = DataLevel.L2) -> str:
        """脱敏处理"""
        result = text
        for rule in self.rules.values():
            if rule.level.value >= target_level.value:
                if rule.method == "replace":
                    result = re.sub(rule.pattern, rule.replacement, result)
                elif rule.method == "truncate":
                    result = self._truncate_match(result, rule)
                elif rule.method == "hash":
                    result = self._hash_match(result, rule)
                elif rule.method == "generalize":
                    result = self._generalize_match(result, rule)
        return result

    def _truncate_match(self, text: str, rule: MaskingRule) -> str:
        """截断脱敏"""
        def replace_func(match):
            original = match.group(0)
            keep_prefix = getattr(rule, 'keep_prefix', 0)
            keep_suffix = getattr(rule, 'keep_suffix', 0)
            replacement_char = getattr(rule, 'replacement_char', '*')

            if len(original) <= keep_prefix + keep_suffix:
                return original

            masked = (
                original[:keep_prefix] +
                replacement_char * (len(original) - keep_prefix - keep_suffix) +
                original[-keep_suffix:] if keep_suffix > 0 else ""
            )
            return masked

        return re.sub(rule.pattern, replace_func, text)

    def _hash_match(self, text: str, rule: MaskingRule) -> str:
        """哈希脱敏"""
        def replace_func(match):
            original = match.group(0)
            return hashlib.sha256(original.encode()).hexdigest()[:16]

        return re.sub(rule.pattern, replace_func, text)

    def _generalize_match(self, text: str, rule: MaskingRule) -> str:
        """泛化脱敏"""
        # 实现泛化逻辑
        return re.sub(rule.pattern, "[已脱敏]", text)

# 使用示例
if __name__ == "__main__":
    rules = [
        MaskingRule(
            name="id_card",
            pattern=r"\\d{17}[\\dXx]",
            method="replace",
            replacement="****************",
            level=DataLevel.L4
        ),
        MaskingRule(
            name="mobile",
            pattern=r"1\\d{10}",
            method="truncate",
            replacement="*",
            level=DataLevel.L3,
            keep_prefix=1,
            keep_suffix=4
        ),
    ]

    engine = MaskingEngine(rules)

    text = "客户张三,身份证 110101199001011234,电话 13800138000"
    masked = engine.mask(text, DataLevel.L2)
    print(masked)
    # 输出:客户**,身份证 ****************,电话 1****8000

三、数据处理流程

3.1 数据上传流程

┌─────────────────────────────────────────────────────────────────────────┐
│                          数据上传处理流程                               │
│                                                                         │
│  ┌─────────┐    ┌─────────┐    ┌─────────┐    ┌─────────┐    ┌───────┐ │
│  │  数据   │───▶│  级别   │───▶│  脱敏   │───▶│  审核   │───▶│  上传  │ │
│  │  采集   │    │  检测   │    │  处理   │    │  (L4+)  │    │  云端  │ │
│  └─────────┘    └─────────┘    └─────────┘    └─────────┘    └───────┘ │
│       │              │              │              │              │     │
│       ▼              ▼              ▼              ▼              ▼     │
│   原始数据      识别数据类型    应用脱敏规则    人工审批       加密传输 │
│                                                                         │
│  如果 L5 级别 → 直接拒绝上传,转本地处理                                 │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

3.2 数据处理流程代码

# data_upload_processor.py

from enum import Enum
from typing import Tuple, Optional
from dataclasses import dataclass
import logging

class UploadDecision(Enum):
    ALLOW = "允许上传"
    MASK_REQUIRED = "需脱敏后上传"
    REVIEW_REQUIRED = "需人工审核后上传"
    DENY = "禁止上传"

@dataclass
class UploadResult:
    decision: UploadDecision
    masked_data: Optional[str]
    reason: str
    level: DataLevel

class DataUploadProcessor:
    def __init__(self, masking_engine: MaskingEngine):
        self.masking_engine = masking_engine
        self.logger = logging.getLogger(__name__)

    def process_upload(self, data: str, user_level: str) -> UploadResult:
        """处理数据上传请求"""
        # 1. 检测数据级别
        detected_level = self.masking_engine.detect_level(data)

        # 2. 根据级别决定处理方式
        if detected_level == DataLevel.L5:
            return UploadResult(
                decision=UploadDecision.DENY,
                masked_data=None,
                reason="L5 机密数据禁止上传云端",
                level=detected_level
            )

        elif detected_level == DataLevel.L4:
            # L4 需要人工审核
            return UploadResult(
                decision=UploadDecision.REVIEW_REQUIRED,
                masked_data=None,
                reason="L4 高度敏感数据需要人工审核",
                level=detected_level
            )

        elif detected_level == DataLevel.L3:
            # L3 需要脱敏
            masked_data = self.masking_engine.mask(data, DataLevel.L2)
            return UploadResult(
                decision=UploadDecision.MASK_REQUIRED,
                masked_data=masked_data,
                reason="L3 敏感数据已脱敏",
                level=detected_level
            )

        else:
            # L1/L2 可以直接上传
            return UploadResult(
                decision=UploadDecision.ALLOW,
                masked_data=data,
                reason=f"{detected_level.value}数据可直接上传",
                level=detected_level
            )

    def log_upload(self, result: UploadResult, user: str):
        """记录上传日志"""
        self.logger.info(
            f"用户上传数据 - 用户:{user}, 决策:{result.decision.value}, "
            f"级别:{result.level.value}, 原因:{result.reason}"
        )

四、数据访问控制

4.1 基于数据级别的访问控制

数据级别 可访问人员 审批要求 审计要求
L1 - 公开 所有人 无需审批 无需审计
L2 - 内部 内部员工 无需审批 记录访问日志
L3 - 敏感 授权员工 部门审批 完整审计
L4 - 高度敏感 特定人员 多级审批 完整审计 + 告警
L5 - 机密 极少数人 高管审批 完整审计 + 实时告警

4.2 RBAC 权限配置

# rbac-config.yaml

roles:
  - name: employee
    description: 普通员工
    data_access:
      - L1
      - L2
    operations:
      - read

  - name: manager
    description: 部门经理
    data_access:
      - L1
      - L2
      - L3
    operations:
      - read
      - write
    approval_limit: L3

  - name: director
    description: 总监
    data_access:
      - L1
      - L2
      - L3
      - L4
    operations:
      - read
      - write
      - approve
    approval_limit: L4

  - name: executive
    description: 高管
    data_access:
      - L1
      - L2
      - L3
      - L4
      - L5
    operations:
      - read
      - write
      - approve
      - delete
    approval_limit: L5

  - name: data_admin
    description: 数据管理员
    data_access:
      - L1
      - L2
      - L3
      - L4
      - L5
    operations:
      - read
      - write
      - delete
      - configure
    special: true

五、数据生命周期管理

5.1 生命周期阶段

┌─────────────────────────────────────────────────────────────────────────┐
│                        数据生命周期管理                                 │
│                                                                         │
│  采集 ──▶ 传输 ──▶ 存储 ──▶ 使用 ──▶ 共享 ──▶ 归档 ──▶ 销毁           │
│   │       │       │       │       │       │       │                    │
│   ▼       ▼       ▼       ▼       ▼       ▼       ▼                    │
│ 分类    加密    分级    脱敏    审批    定期    安全                    │
│ 定级    传输    存储    使用    共享    备份    销毁                    │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

5.2 数据保留策略

数据类型 保留期限 存储位置 销毁方式
日志数据 90 天 热存储 安全删除
业务数据 3 年 温存储 安全删除
财务数据 10 年 冷存储 安全删除
合同数据 永久 归档存储 -
审计数据 5 年 温存储 安全删除

六、附录

6.1 数据分类清单模板

下载链接

6.2 相关文档


文档版本控制

版本 日期 变更内容 编制人
v1.0 2026-03-26 初始版本 AI 助手

下一步:继续阅读 05-安全合规要求.md