# 05 — 数据安全 > GB/T 22239-2019 第三级「应用和数据安全 — 数据部分」控制点映射。 ## 1. 维度说明 AgentKit 处理的数据类型: - **用户输入**:聊天消息、终端命令、工作流配置 - **LLM 调用**:prompt + completion(含潜在 PII) - **持久化数据**:用户账户、会话、记忆(情景/语义/工作) - **审计数据**:RBAC 变更、终端命令、SCIM 操作 AgentKit 自身实现: - **已实现**:PII 脱敏(U2 fail-closed + hash 审计)、 session 撤销(剩余信息保护)、PG + pgvector 完整性、 审计数据 hash 化。 - **P0 补齐项**:PostgreSQL 备份恢复 runbook。 - **P1 参考**:国密加密(R11a,SM4/SM2 替代 AES/RSA)。 ## 2. GB/T 22239-2019 三级要求(简要) | 控制点 ID | 要求摘要 | |-----------|----------| | DAT-01 | 数据完整性:数据传输/存储完整性,校验机制 | | DAT-02 | 数据保密性:敏感数据加密存储/传输,密钥管理 | | DAT-03 | 数据备份与恢复:重要数据定期备份,恢复演练 | | DAT-04 | 剩余信息保护:鉴别信息/文件/内存空间释放前清理 | | DAT-05 | 个人信息保护:PII 采集/处理/传输最小化与脱敏 | | DAT-06 | 数据采集与分类分级:按敏感度分级保护 | | DAT-07 | 数据销毁:数据销毁审计,不可恢复 | | DAT-08 | 国密算法合规(R11a,政企客户要求):敏感数据加密使用国密算法 | ## 3. AgentKit 实现映射 ### 3.1 数据完整性(DAT-01)— 已实现 - **PostgreSQL + pgvector**:主数据库使用 PostgreSQL(事务 ACID 保证), pgvector 扩展存储向量记忆数据。 - 连接串:[values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml) `postgres.url: postgresql+asyncpg://agentkit@postgres:5432/agentkit` - SQLAlchemy 2 async ORM 提供应用层事务管理。 - **JWT 签名完整性**:HS256 签名防篡改(详见 `04-application.md` §3.4)。 - **Webhook 签名校验**:fail-closed 防篡改 ([channels.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/routes/channels.py))。 - **Pydantic 模型校验**:所有 API 入口 `extra="forbid"` 拒绝未知字段, 防止数据注入。 ### 3.2 数据保密性 / PII 脱敏(DAT-02 / DAT-05)— 已实现(U2) #### PII 脱敏 hook [src/agentkit/llm/pii_filter.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/llm/pii_filter.py) 设计要点: - **正则版(默认)**:识别手机号 / 邮箱 / 身份证 / 银行卡, 替换为 `[REDACTED_TYPE:hash8]`。 - **ner_hook(可选)**:客户内网 NER 模型(LAC/HanLP), `module:func` 路径动态 import,优先于正则版。 - **fail-closed**:任何异常时拒绝发送至 LLM(`raise PIIFilterError`), **不降级到原文发送**。 - **hash 审计**:脱敏前后记录 sha256 前 8 位(仅 hash,不含原文), 用于审计追溯。 #### PII 类型与正则 | PII 类型 | 正则模式 | 替换格式 | |----------|----------|----------| | 身份证 | 18 位(含校验位 X) | `[REDACTED_ID_CARD:hash8]` | | 手机号 | `1[3-9]\d{9}` | `[REDACTED_PHONE:hash8]` | | 邮箱 | 标准邮箱正则 | `[REDACTED_EMAIL:hash8]` | | 银行卡 | 16-19 位数字 | `[REDACTED_BANK_CARD:hash8]` | > 身份证正则优先于手机号正则匹配,避免身份证号内 11 位数字子串被 > 手机号正则误匹配。 #### OTel 脱敏指标 - `pii_filter.coverage` — 脱敏扫描覆盖率(status: success/failed_closed/fallback_regex) - `pii_filter.redacted` — 脱敏实体计数 ([metrics.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/telemetry/metrics.py)) #### fail-closed 策略 ```python try: result = _redact(text, ner_hook=ner_hook) ... except Exception as e: if fail_closed: raise PIIFilterError(f"PII filter failed (fail-closed): {e}") from e # fail-open(非默认):降级到正则版重试 ``` 生产环境默认 `fail_closed=True`,宁可拒绝服务也不泄露 PII。 ### 3.3 国密加密(R11a)— P1 参考 **当前状态:P1**。AgentKit 当前使用: - **传输加密**:TLS(Ingress 终止),算法套件由 nginx ingress controller 默认配置(含 AES-GCM 等国际算法)。 - **密码哈希**:bcrypt(国际算法)。 - **JWT 签名**:HS256(HMAC-SHA256,国际算法)。 - **PII hash**:SHA-256(国际算法)。 **未使用国密算法**(SM2/SM3/SM4/SM9)。 **P1 补齐计划**(R11a): 1. **JWT 签名**:替换 HS256 → SM2-HMAC 或国密 JWT 库(如 `gmssl`)。 2. **密码哈希**:评估 SM3 替代 bcrypt(需兼顾兼容性,可能双算法并行)。 3. **PII hash**:SHA-256 → SM3。 4. **TLS**:启用国密 TLS 套件(需 nginx ingress controller + 国密证书)。 5. **数据加密**:PG 字段级加密(透明数据加密 TDE 或应用层 SM4)。 **注**:国密算法**不阻碍等保三级认证**(三级要求「加密」而非「国密」), 但政企客户常要求国密合规,故列入 P1 整改计划。 ### 3.4 数据备份与恢复(DAT-03)— P0 补齐项 **当前状态:P0**。AgentKit 自身未提供 PG 备份 runbook, 依赖客户侧数据库运维。 **AgentKit 侧已实现**: - PostgreSQL 持久化(pgvector 扩展,事务日志 WAL 默认开启)。 - Redis 配置 AOF/RDB(由客户 Redis 运维决定)。 **P0 补齐计划**: 1. 新增 `docs/deployment/pg-backup-runbook.md`,包含: - 全量备份策略(每日 `pg_dump`,保留 7 天) - WAL 归档(连续归档,PITR 恢复) - 恢复演练流程(每季度执行一次恢复测试) - 备份加密(备份文件 SM4/AES-256 加密,密钥由 KMS 托管) 2. Helm Chart 增加 `backup` 段,可选部署 pg-backup sidecar / CronJob。 3. pgvector 向量数据备份纳入 `pg_dump`(已原生支持)。 ### 3.5 剩余信息保护(DAT-04)— 已实现 #### Session 撤销 JWT V2 token 携带 `sid`(session id)+ `jti`(access token 唯一 id), 中间件校验 session 是否被服务端撤销 ([jwt_utils.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/jwt_utils.py)): - 销户时撤销该用户全部 session ([auth.py deprovision](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/routes/auth.py))。 - Refresh token 轮换:旧 token 进入 denylist 30s 窗口 ([denylist.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/denylist.py))。 - Token reuse 检测:reuse 触发撤销该用户全部 session(强制重新登录)。 #### Refresh token hash 化 denylist 不存储明文 refresh token,存储其 SHA-256 hash ([denylist.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/denylist.py) `hash_token`),减少敏感信息驻留内存。 #### JIT 用户随机密码 OIDC/SAML JIT 创建的本地用户使用随机密码 (`hash_password(secrets.token_urlsafe(32))`),不可用于本地登录, 避免 SSO 用户的本地密码驻留 ([oidc.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/providers/oidc.py) `_find_or_create_user`)。 #### SCIM 用户随机密码 SCIM 创建的用户同样使用随机密码 ([scim/router.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/scim/router.py) `create_user`)。 ### 3.6 数据采集与分类分级(DAT-06)— 已实现 - **PII 分类**:pii_filter.py 按 PII 类型分级 (id_card / phone / email / bank_card),不同类型采用相同脱敏策略 但审计 hash 独立记录。 - **记忆分层**:4 层记忆架构(SOUL/USER/MEMORY/DAILY)按敏感度存储 (SOUL 最敏感,DAILY 最不敏感),详见 AGENTS.md。 - **数据最小化**:PII 脱敏后原文不落盘(仅 hash 用于审计), LLM prompt 中不含原文 PII ([pii_filter.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/llm/pii_filter.py))。 ### 3.7 数据销毁(DAT-07)— 已实现 - **账户销户**:deprovision 禁用账户(`is_active = 0`)+ 撤销全部 session。 - **审计保留**:销户操作本身记录审计日志,不可删除(admin 不可删除审计记录, 审计表无 delete 接口)。 - **PII 销毁**:脱敏后 PII 原文不落盘(内存中处理后即替换), 无需专门销毁流程。 - **PG 数据销毁**:客户侧 PG 运维负责(如需彻底删除用户数据, 由 admin 发起 SQL 操作,记录审计)。 ## 4. 测评建议 1. **DAT-01 / DAT-04 / DAT-06 / DAT-07**:直接展示 PG 配置 + jwt_utils.py + denylist.py + pii_filter.py 即可。 2. **DAT-02 / DAT-05**:展示 pii_filter.py fail-closed 流程 + OTel 脱敏指标。 3. **DAT-03**:P0 补齐项,需在测评前完成 pg-backup-runbook.md。 4. **国密**:P1 参考,不阻碍三级认证,但写入整改计划。 ## 5. PII 脱敏边界(重要说明) AgentKit PII 脱敏的**边界**: 1. **覆盖范围**:仅脱敏发送至 LLM 的 prompt,**不脱敏**: - 用户本地终端命令(终端命令有自己的审计) - 用户上传的文档原文(文档处理模块不经过 pii_filter) - bitable 数据(结构化数据,由客户自行控制) 2. **ner_hook 依赖客户**:正则版覆盖中国常见 PII(手机/邮箱/身份证/银行卡), 复杂 PII(地址/姓名/组织)需客户接入内网 NER 模型。 3. **不替代 DLP**:AgentKit PII 脱敏是应用层防护,不替代客户侧 DLP(数据防泄漏)系统。