fix: P0-1 RateLimiter并发写安全 + P0-2工单操作错误码区分 + P1 rows.Close修复
P0-1 (limits.go): Allow()方法改为全程使用写锁保护counters map读写,避免RLock写入时的data race P0-2 (ticket_workflow.go+ticket_handler.go): Assign/Resolve/Close操作先查询ticket存在性和状态,返回明确的CS_TICKET_4001/CS_TKT_4002/CS_TICKET_4092/CS_TICKET_4093错误码,handler根据错误前缀路由HTTP状态码 P1-1 (ticket_store.go): 移除GetStats中3处手动rows.Close(),只保留defer Close()
This commit is contained in:
171
prd/DATA_COMPLIANCE_RETENTION_POLICY.md
Normal file
171
prd/DATA_COMPLIANCE_RETENTION_POLICY.md
Normal file
@@ -0,0 +1,171 @@
|
||||
# 数据合规与留存策略
|
||||
|
||||
> 版本:v1.0 | 状态:已生效
|
||||
> 关联:tech/INTERFACE.md、PRODUCTION_PHASE1_STATUS.md
|
||||
|
||||
---
|
||||
|
||||
## 1. 数据分类
|
||||
|
||||
### 1.1 数据类别
|
||||
|
||||
| 类别 | 内容 | 示例 |
|
||||
|------|------|------|
|
||||
| 用户数据 | 用户在客服系统中的会话、消息、工单 | session_id、message_content、ticket_id |
|
||||
| 账户数据 | 与主系统关联的用户身份、配额、Token | user_id、email、quota |
|
||||
| 行为数据 | 用户操作日志、审计日志 | audit_logs、action、source_ip |
|
||||
| 运营数据 | 转人工原因、统计指标 | handoff_reason、priority |
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据合规要求
|
||||
|
||||
### 2.1 法律法规遵循
|
||||
|
||||
本系统应遵循以下合规要求:
|
||||
|
||||
| 要求 | 说明 | 当前状态 |
|
||||
|------|------|----------|
|
||||
| 数据最小化 | 只收集业务必需的数据 | 部分满足 |
|
||||
| 目的限定 | 数据仅用于客服目的,不用于其他用途 | 满足 |
|
||||
| 用户知情 | 用户应知道自己的数据被收集 | 待补充 |
|
||||
| 删除权 | 用户请求删除时,应可删除相关数据 | 待实现 |
|
||||
|
||||
### 2.2 敏感数据处理
|
||||
|
||||
| 数据类型 | 存储要求 | 展示要求 | 当前状态 |
|
||||
|----------|----------|----------|----------|
|
||||
| 用户邮箱 | 加密存储(待实现) | 脱敏后展示 | 未实现 |
|
||||
| 手机号 | 加密存储(待实现) | 脱敏后展示 | 未实现 |
|
||||
| 消息内容 | 明文存储 | 不脱敏 | 已实现 |
|
||||
| 退款金额 | 明文存储 | 需登录态 | 已实现 |
|
||||
| IP 地址 | 明文存储 | 日志中记录 | 已实现 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 数据留存策略
|
||||
|
||||
### 3.1 留存周期
|
||||
|
||||
| 数据类型 | 留存周期 | 说明 |
|
||||
|----------|----------|------|
|
||||
| 审计日志(security) | 2 年 | 不可删除,用于安全审计 |
|
||||
| 审计日志(operation) | 1 年 | 工单操作记录 |
|
||||
| 会话消息 | 90 天 | 用户对话历史 |
|
||||
| 工单记录 | 1 年 | 已解决/已关闭工单 |
|
||||
| 开放工单 | 永久保留 | 直到关闭 |
|
||||
| 健康检查日志 | 30 天 | 运维数据 |
|
||||
|
||||
### 3.2 数据删除流程
|
||||
|
||||
**触发条件**:
|
||||
- 用户主动请求删除(GDPR/个人信息保护法)
|
||||
- 超过留存周期的数据
|
||||
|
||||
**删除执行**:
|
||||
1. 软删除:在对应记录上标记 `deleted_at` 时间戳
|
||||
2. 硬删除:超过保留期后执行物理删除(仅 admin 可执行)
|
||||
3. 备份清理:删除备份中的对应数据
|
||||
|
||||
> **注**:软删除和硬删除机制**当前未实现**(所有数据直接物理删除),需 Phase 4 补充。
|
||||
|
||||
### 3.3 数据隔离
|
||||
|
||||
| 隔离维度 | 当前状态 | 说明 |
|
||||
|----------|----------|------|
|
||||
| 多租户隔离 | 未实现 | 生产一期仅支持单租户 |
|
||||
| 测试数据隔离 | 部分实现 | 测试环境使用独立数据库 | 跨租户数据访问 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 审计日志规范
|
||||
|
||||
### 4.1 审计日志表结构
|
||||
|
||||
**表**:`cs_audit_logs`
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | uuid | 审计记录唯一 ID |
|
||||
| tenant_id | string | 租户 ID(当前固定为 `default`) |
|
||||
| object_type | string | 对象类型:ticket、session、message |
|
||||
| object_id | string | 对象 ID |
|
||||
| action | string | 操作类型:create/update/delete/security_reject |
|
||||
| before_state | jsonb | 操作前状态(可选) |
|
||||
| after_state | jsonb | 操作后状态(可选) |
|
||||
| actor_id | string | 操作者 ID(若为空则降级为 open_id) |
|
||||
| source_ip | string | 操作来源 IP(**P0 缺口:当前未写入**) |
|
||||
| created_at | timestamp | 创建时间 |
|
||||
|
||||
### 4.2 记录范围
|
||||
|
||||
**已记录**:
|
||||
- ✅ 工单创建(ticket.create)
|
||||
- ✅ 消息处理(message.processed)
|
||||
- ✅ 审计写入失败(fail-closed,整体请求返回错误)
|
||||
|
||||
**未记录(P0 缺口)**:
|
||||
- ❌ 工单分配(ticket.assign)
|
||||
- ❌ 工单解决(ticket.resolve)
|
||||
- ❌ 安全拒绝事件(signature_invalid、timestamp_invalid、body_rejected)
|
||||
|
||||
### 4.3 审计日志不可篡改性
|
||||
|
||||
- 审计日志表**无 UPDATE / DELETE 权限**,仅 INSERT
|
||||
- 定期备份到冷存储
|
||||
- 备份文件设置保留策略(2年)
|
||||
|
||||
---
|
||||
|
||||
## 5. 数据库安全
|
||||
|
||||
### 5.1 PostgreSQL 安全
|
||||
|
||||
| 要求 | 当前状态 |
|
||||
|------|----------|
|
||||
| 强密码策略 | ✅ 配置文件中使用强密码 |
|
||||
| SSL 连接 | ✅ 支持 SSL(配置项:`POSTGRES_SSL_MODE`) |
|
||||
| 最小权限原则 | ✅ 应用使用专用数据库用户,仅授予必要权限 |
|
||||
| 连接池限制 | ✅ 使用 pgbouncer 或内置连接池 |
|
||||
| 定期备份 | 手动备份(待自动化) |
|
||||
|
||||
### 5.2 备份策略
|
||||
|
||||
| 备份类型 | 频率 | 保留时间 |
|
||||
|----------|------|----------|
|
||||
| 全量备份 | 每天 | 30 天 |
|
||||
| 增量备份 | 每小时 | 7 天 |
|
||||
| 审计日志备份 | 每周 | 2 年 |
|
||||
| 异地备份 | 每月 | 1 年 |
|
||||
|
||||
> **注**:备份自动化**当前未落地**,需在部署阶段补充。
|
||||
|
||||
---
|
||||
|
||||
## 6. 当前阶段说明
|
||||
|
||||
### 6.1 已满足的合规项
|
||||
|
||||
- 数据最小化:系统只收集业务必需字段
|
||||
- 审计日志持久化到 PostgreSQL,fail-closed 保证审计不丢失
|
||||
- 无外部数据共享
|
||||
- 单租户数据隔离
|
||||
|
||||
### 6.2 待补充的合规项
|
||||
|
||||
| 项目 | 优先级 | 说明 |
|
||||
|------|--------|------|
|
||||
| 敏感数据加密存储 | P1 | 邮箱、手机号等加密存储 |
|
||||
| 软删除/硬删除机制 | P1 | 支持用户数据删除请求 |
|
||||
| 备份自动化 | P1 | 定时备份脚本 |
|
||||
| 用户知情同意 | P1 | 前端告知用户数据收集 |
|
||||
| 隐私政策页面 | P1 | 展示数据处理说明 |
|
||||
| RBAC 权限模型 | P0 | 防止越权访问 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 当前版本状态
|
||||
|
||||
- **本文档版本**:v1.0
|
||||
- **生效日期**:2026-04-30
|
||||
- **下次审查**:Phase 4 补充隐私政策后
|
||||
Reference in New Issue
Block a user