这份清单是生产评审入口。每个勾选项都应链接到配置快照、测试报告、仪表板、审计查询或演练记录。没有证据的“已确认”不能作为商业 GA 结论。
先运行 Host 启动门禁
API 的 RuntimeConfigurationGuard 在 Production 与 Staging 检查关键依赖,发现 Shell/default infrastructure 时拒绝启动。当前门禁覆盖数据库、RabbitMQ、Redis、可信代理、OTLP、对象存储、Webhook delivery 与 Runtime License。
# 以类生产环境执行启动烟测,期望配置缺失时非零退出。ASPNETCORE_ENVIRONMENT=Staging \ dotnet run --project src/Hosts/BitzOrcas.Api/BitzOrcas.Api.csproj
# 使用部署系统注入完整配置后再次执行,保留启动日志为证据。ASPNETCORE_ENVIRONMENT=Production \ dotnet run --no-build --project src/Hosts/BitzOrcas.Api/BitzOrcas.Api.csproj门禁通过只表示必要配置键和部分显式条件成立,不会主动验证所有远端权限、证书链、密钥可轮换或备份可恢复。
身份与认证
- JWT issuer、audience 与签名密钥来自受控来源,未知
kid、过期 token 和错误 audience 被拒绝; - 新旧 signing key 的重叠、切换和撤销完成演练;
- HMAC timestamp/nonce/body、API Key hash、SCIM 独立 scheme 均有负向测试;
- Development fixtures 在 Production/Staging 不存在;
- 管理员和高风险操作启用 MFA/step-up;
- 密码找回、MFA 恢复和会话撤销不会产生认证绕过;
- 认证失败响应不泄露账号、租户或凭据状态。
证据:认证契约报告 + key rotation 演练 + fixture 全局扫描负责人:Identity owner + Platform Security阻断项:弱默认密钥、未知 kid 可通过、生产测试凭据授权与数据范围
- 所有公开 Command/Query 的 resource/action 经过清单审查;
- Deny 优先、全 Neutral 默认拒绝、依赖故障拒绝均有测试;
- Application scope 不会冒充 User RBAC;
- DataScope 已编译为列表查询谓词,而非只存在于决策对象;
- 权限、关系与 Feature 变更会失效缓存;
- Delegated caller 不复用普通授权缓存;
- 批量、导出、搜索与复杂 join 具有越权测试。
不要只验证一个管理员 happy path。至少使用同租户无权限用户、其他租户用户、应用调用者和 delegated caller 运行相同用例。
多租户隔离
- tenant id 只来自可信 Claim、应用凭据、Host 映射或作业作用域;
- Header/Path tenant 与可信身份不一致时拒绝;
- ORM 查询、按主键读取、更新、删除和唯一约束覆盖 tenant;
- 缓存、幂等、限流、消息与对象存储 key 包含 tenant 维度;
- 后台任务显式恢复 tenant/caller context;
- Consumer Contract Tests 覆盖全部商业 persistence profile;
- Host 与客户租户的特权边界有独立测试。
跨租户负向测试必须证明“另一租户数据不存在或被拒绝”,不能只检查响应状态是 2xx。
网络、代理与浏览器
- 公网流量强制 TLS,内部 mTLS 或网络 ACL 符合拓扑;
- KnownProxies/KnownNetworks 或 DirectExposure 通过启动门禁;
- 伪造
X-Forwarded-For不会影响 IP 限流与审计; -
Host/X-Forwarded-Host保留公开端口,伪造X-Forwarded-Port不会改写受信 Host; - CORS 只列生产 Origin,非法 Origin 无授权响应头;
- HSTS、CSP、frame、MIME、referrer、permissions 策略从公网入口验证;
- Gateway 与 API 不产生冲突或弱化的重复头;
- OpenAPI/Scalar 在生产关闭;若业务例外要求开启,产品 Host 已设置
RequireAuthentication=true,并由 HTTPS、VPN、IP 白名单或网关 SSO 纵深保护; - 文档访问登录与登出路径可达,正式产品登出会同步清除
bitzorcas.docs会话; - 共享文档环境关闭 Scalar 鉴权持久化,配置和文档中没有账号、Token、API Key 或 HMAC Secret;
- 健康端点不泄露连接串、版本细节或内部拓扑。
Secret、密钥与许可证
- 仓库、Git 历史、CI 日志、镜像和 source map 通过 Secret 扫描;
- 每个 Secret 有 owner、用途、读取主体、版本、轮换周期和撤销路径;
- API Key/SCIM token 运行态只存 hash,明文只展示一次;
- Webhook/Provider secret 静态加密,Data Protection purpose 独立;
- Redis key ring 跨副本交叉解密并完成备份恢复;
- Runtime License 私钥不随产品部署,trusted public key 防篡改;
- 部署身份与许可证缓存位于稳定、受限存储;
- 日志、审计和 ProblemDetails 不含凭证明文。
数据、文件与隐私
- 数据库、对象存储、备份和导出启用静态加密;
- 数据库账号按读写、迁移和运维职责拆分;
- 上传大小、类型、对象 key 和访问授权有负向测试;
- Files 当前实现边界被明确记录:未交付恶意内容扫描与会话过期校验时不得宣传已具备;
- PII 分类、保留、删除与导出流程符合业务制度;
- 数据恢复后再次验证租户隔离和密钥可用;
- 生产数据不会复制到非生产环境,或已完成不可逆脱敏。
消息、任务与 Webhook
- 消费者按至少一次投递设计,业务副作用以稳定幂等键保护;
- 重试有上限、退避和死信处置负责人;
- outbox/inbox、Broker 与数据库失败窗口有故障注入测试;
- Webhook 签名覆盖 event id、timestamp 和 payload hash;
- 接收方独立检查时间窗并原子去重 event id;
- Webhook 新旧 secret 轮换与旧 key 撤销完成演练;
- 后台任务失败可观测,不会静默丢失 tenant context。
限流、超时与滥用防护
- 匿名、登录、验证码、上传、搜索、导出和 Webhook 使用合适策略;
- 类生产环境使用共享 Redis 配额,而非实例内独立计数;
- 分区 key 由可信 tenant/caller/IP 构成;
- 请求大小、分页上限、查询复杂度和并发数有边界;
- 超时传播到 Handler、数据库、HTTP 和消息调用;
- 超时/取消不会留下半完成副作用;
- 限流拒绝和高成本请求有指标与告警。
审计、日志与检测
- 认证失败、授权拒绝、代理、权限变更、Secret 操作可查询;
- actor 与 impersonator、tenant 与目标 tenant 同时保留;
- CorrelationId 和 TraceId 可串联 API、消息与 Job;
- 审计 store 不允许在类生产环境配置为 None;
- 日志注入、敏感值和高基数字段已经审查;
- 告警有阈值、owner、升级链与 runbook;
- 安全事件时间线能从不可变证据重建。
供应链与制品
- 锁定依赖并执行漏洞、许可证与恶意包扫描;
- 生成 SBOM、provenance 与制品签名;
- 镜像以非 root、只读文件系统和最小 capabilities 运行;
- 基础镜像和 Runtime 版本有升级 SLA;
- 部署制品可追溯到审查过的 commit 与 CI run;
- 发布环境只接受受信签名制品;
- 临时调试工具和诊断端口未进入生产镜像。
备份、恢复与应急
- 数据库、对象、配置、Data Protection key ring 和许可证状态纳入恢复范围;
- 恢复演练测得 RPO/RTO,而不是只确认“存在备份”;
- 恢复后运行认证、租户、消息和文件完整性 smoke test;
- 数据库回滚不依赖破坏性 down migration;
- 不可逆迁移有前向修复方案;
- Secret 泄露、账号接管、跨租户事件和 Broker 积压有 runbook;
- break-glass 账号短期、强 MFA、强审计并定期验证。
发布证据包
# 安全评审记录只引用 Secret 的版本,不写明文。# 每个链接必须绑定同一 commit、环境和配置版本。release: 2026.07.0commit: <git-sha>evidence: startup_guard: <ci-artifact-url> tenant_negative_tests: <ci-artifact-url> key_rotation_drill: <runbook-record> restore_drill: <runbook-record>accepted_risks: []approvers: [platform-security, service-owner]证据包应和制品不可变关联。检查报告日期、环境、commit 和配置版本必须一致,避免拿旧环境截图批准新制品。
发布结论规则
跨租户隔离失败、认证绕过、签名/Secret 泄露、生产测试凭据、审计丢失或无法恢复的关键数据属于阻断项。其他未完成项必须有 owner、截止时间、补偿控制和明确风险接受人。
发布评审的结论应是“哪项能力在何种部署拓扑下由哪些证据证明”,而不是笼统的“安全已完成”。