fischer-agentkit/docs/compliance/dengbao-level3/05-data.md

218 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 参考**国密加密R11aSM4/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 当前使用:
- **传输加密**TLSIngress 终止),算法套件由 nginx ingress controller
默认配置(含 AES-GCM 等国际算法)。
- **密码哈希**bcrypt国际算法
- **JWT 签名**HS256HMAC-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数据防泄漏系统。