跳到主要内容

安全与合规

Cirrus CDN 在认证、数据存储、传输与运维流程上贯彻安全最佳实践。本章梳理已实现的控制措施,并指出面向合规场景的注意事项。

身份与访问管理

  • 用户认证——密码使用 Argon2 哈希(core/security.py)。会话通过 HTTP-only Cookie 实现,可配置域名、Secure 标志与 SameSite 属性。登录失败返回通用错误,避免用户枚举。
  • 会话管理——会话存于内存(SESSIONS 字典)。每次请求刷新过期时间(SESSION_TTL_SECONDS,默认 7 天)。登出会显式清除 Cookie 并删除服务端记录。
  • 服务令牌——令牌使用 secrets.token_urlsafe 生成,采用 SHA-256 哈希存储,不保留明文。令牌后缀(最后两个字符)方便安全识别。删除令牌会同时移除哈希与 ID。
  • Master 令牌——环境变量 MASTER_API_TOKEN 具备特权(列出/创建/删除服务令牌)。端点会检查 request.state.cirrus_auth_method == "master" 才允许操作。
  • 引导模式——当系统无用户或令牌时,require_user 允许匿名访问以完成初始配置;一旦创建账户,认证将成为必需。

数据保护

  • Redis 存储——敏感值(密码哈希、令牌哈希、证书)存于 Redis。不会保存明文密码或令牌。证书(cdn:cert:{domain})同时含完整链与私钥,需确保 Redis 基础设施安全(TLS、网络分段)。
  • TLS 证书——OpenResty 在握手时直接从 Redis 加载证书到内存;签发后私钥不会写入磁盘。占位证书仅用于握手引导。
  • ACME 凭据——acme-dns 的用户名/密码存于 cdn:acme:{domain} 哈希;若受监管要求,可考虑加密或隔离 Redis。
  • 日志——访问日志包含客户端 IP 与请求元数据,应按照隐私法规制定保留与脱敏策略。

传输安全

  • 边缘 HTTPS——启用 TLSv1.2 与 TLSv1.3;nginx.conf 配置了会话缓存与 stapling,并支持 QUIC。
  • 内部信任——Celery worker 通过 docker/entrypoint.sh 从 Caddy 拷贝内部 CA 证书,使 HTTP 客户端信任 ACME 端点。
  • Redis 连接——默认部署在本地网络使用明文 Redis;生产环境应启用 TLS 或限制访问范围。
  • 指标端点——/metrics 监听 9145,默认仅对回环开放;可通过构建参数 NGX_METRICS_ALLOW 扩大允许列表。

清缓存与配置安全

  • 清缓存请求需通过 API 鉴权;OpenResty 的 /cache/purge 位置限制为 127.0.0.1,防止未授权失效操作。
  • 域名与节点负载验证器(schemas.py)校验结构、IP 格式与状态字段,防止注入恶意配置。
  • 启用 ENFORCE_ACME_CNAME_CHECK 时,ACME 任务会在 DNS 未对齐的情况下拒绝签发。

秘密管理

  • .env 文件(justfileset dotenv-load)通常提供 MASTER_API_TOKEN、ACME 端点、Redis 凭据等敏感信息。必须将 .env 排除在版本控制之外并安全存储。
  • 生产环境应使用 Docker Secrets 或编排平台的密钥管理(如 Kubernetes Secrets)替代纯环境变量。

合规考量

  • 审计日志——应用日志记录关键事件(登录、证书签发)。若需更严格合规,可扩展至 CRUD 操作记录用户 ID,并输出结构化事件至 SIEM(参见第 11 章)。
  • RBAC——现有实现仅区分认证用户与 master 令牌;企业场景可能需要细粒度角色(只读、运维、管理员),应将 RBAC 扩展纳入安全待办事项。
  • 数据驻留——Redis 与日志卷需符合驻留要求;可采用托管服务或区域化部署。
  • 证书处理——Redis 中的私钥可能需要加密或使用 HSM 支撑存储以满足监管。
  • 漏洞管理——基础镜像(ghcr.io/astral-sh/uv:python3.13-trixie-slimopenresty/openresty:jammy)需定期更新。建议集成 Dependabot/Snyk。

威胁模型摘要

威胁缓解措施
凭据窃取Argon2 哈希、HTTP-only Cookie、修改密码时会话失效。
令牌泄露令牌哈希静态存储、仅展示后缀、master 令牌限制、客户端不持久化。
缓存投毒严格的源站选择、可选头部覆盖、Redis 驱动配置避免任意 Lua 注入。
未授权清缓存API 认证 + 本地限定清缓存端点。
证书滥用ACME 锁防并发签发,CNAME 校验确保域名对齐。

默认安全姿态稳健,同时保留向更严格合规扩展的路径。第 9 章将关注运维工具与可观测性,确保这些控制易于验证与执行。