安全与密钥管理手册

最后更新:2025-11-10 · 负责人:Security/DevOps

这是 Python/FastAPI + React 技术栈的安全指引单一事实源。

1. 威胁模型速览

AssetPrimary RisksMitigations
Provider API keys(静态加密存储)数据库泄露、日志泄露、内存抓取使用 AES-GCM 配合外置 ENCRYPTION_KEY;信封式密钥管理接入 HSM/vault;结构化日志进行 secrets 脱敏。
评测结果与数据集未授权访问、篡改、去匿名化角色权限控制(未来)、签名导出、访问日志、带完整性校验的备份。
控制面(FastAPI、Celery、CLI)依赖漏洞导致 RCE、provider webhook 引发 SSRF、SSE 通道泄露docs/toolchain 升级后保持 uv.lock 同步;锁定依赖;服务以非 root 的 eval752 用户运行;限制请求体大小和超时;通过反向代理限制 SSE 来源。
基础设施 secretsCompose 与 K8s 配置漂移、人工复制粘贴出错.env.prod 仅存放在 vault(AWS Secrets Manager、Doppler 等)中,通过 CI 或编排平台 secret store 注入,绝不提交进仓库。

2. Provider 密钥生命周期

  1. 存储:Provider API keys 在写入 Postgres 前先使用 AES-GCM 加密。ENCRYPTION_KEY 必须是 32-byte hex 字符串,并在 backend、Celery worker、Celery beat 之间保持一致。
  2. 轮换节奏:至少每月轮换一次,或在发生安全事件后立即轮换。通过 PATCH /providers/{id} 原子替换加密后的 payload,然后在上游 provider 侧吊销旧 key。
  3. 备份ENCRYPTION_KEY 必须与数据库备份分开保存。一份存放在硬件密码管理器中,另一份放在云端 secret vault 中。每次轮换都记录到 specs/4_notes.md
  4. 访问边界:只有 backendcelery-worker 容器应接触 provider secrets。前端构建绝不能嵌入 API keys;一律通过应用内 Provider manager 管理。

3. 应用凭据矩阵

ScopeVariable(s)Hardening Notes
PostgresDATABASE_URL, POSTGRES_PASSWORD使用强密码;可用时启用 TLS;仅允许来自应用子网的访问。
Redis / CeleryREDIS_URL优先使用 redis://:password@host:6379/0,禁用匿名访问,在事件响应流程中轮换。
Hugging FaceHF_TOKEN通过 secrets manager 注入;如怀疑泄露,应审计使用日志。
工作区运行时策略Settings → runtime controlsProvider 凭据仅保留在数据库;超时 / 重试 / 取消策略现存于数据库,并作用于后续 run。
Prometheus 抓取PROMETHEUS_PASSWORD/metrics 对 localhost 之外暴露时,添加 basic auth 或 IP allow-list。
Telemetry 端点SENTRY_DSN, OTEL_EXPORTER_*可选,但在适用场景下也应视为 secrets。

新增变量时,请同步更新 配置说明.env.example 和 release notes。

4. 网络与平台控制

  • 分段隔离:通过反向代理(Traefik/Caddy/Nginx)暴露 FastAPI。除非必须,外部只开放 80/443(前端/代理)和 22(SSH)。禁止从公网直接访问 Postgres/Redis。
  • TLS:在代理层或 Kubernetes Ingress 上终止 HTTPS,并使用托管证书(ACM、Cert-Manager)。测试期至少启用 min-age ≥ 1 day 的 HSTS,稳定后在生产环境提升到 ≥ 6 months
  • 安全头:确保启用 Strict-Transport-SecurityContent-Security-Policy 'self' data: blob:X-Frame-Options DENYReferrer-Policy strict-origin-when-cross-origin。在 specs/4_notes.md 中跟踪覆盖情况。
  • 容器:所有 Docker 镜像都以 eval752 用户运行。Bind mount 目录应归该 UID 所有,或至少对所属组可写。如果编排平台支持,请为前端容器启用只读 root filesystem。

5. 运维护栏

  • 推送前在本地运行 uvx pre-commit run -a,确保 secret 扫描器与 lint 规则和 CI 使用同一份代码树。
  • CI 流水线必须从 repository/environment secrets 中获取所有敏感信息,不能把明文值写入 workflow YAML。
  • 在任何非一次性环境中,必须先替换示例 .env 中的占位值,再存入真实 provider keys。
  • 即使使用 Docker Compose,也优先使用基础设施 secret store(AWS Secrets Manager、Azure Key Vault、Doppler、1Password Connect);通过自动化生成 .env 文件挂载到服务器,而不是手工编辑。

6. 事件响应清单

  1. 轮换 ENCRYPTION_KEY(需要维护窗口,以便重新加密 provider keys)。执行期间建议暂停 Celery beat,避免并发条件竞争。
  2. 在 eval_752 中轮换受影响的 provider 凭据,并在上游彻底吊销旧 key。
  3. 撤销 HF/LiteLLM token,并重新生成 CI/自动化使用的服务账号。
  4. 重建 Docker 镜像并重新部署,确认没有残留 pod/container 仍引用被污染的 secrets。
  5. specs/4_notes.md 中记录时间线与缓解措施,并在 specs/3_tasks.md 中开闭相关 follow-up 任务。
  6. 运行 scripts/tests/run_docker_integration.sh --full-run,确认事件后系统仍满足基线能力。

7. 季度审计清单

  • 确认每个环境使用独立的 Postgres 与 Redis 凭据
  • 确认 vault / backup 中保存的是当前 ENCRYPTION_KEY
  • 审查 CI 配置,确保无明文 secrets
  • 抽查日志,确认 secrets 已脱敏
  • 运行容器与依赖扫描(Grype/Trivy + pip-audit)并记录结果