变更如何安全到达各地域

配置发布与运营中心

说明配置事实源、管理接口、本地域快照、紧急封禁和缓存一致性的责任边界。

说明配置事实源、管理接口、本地域快照、紧急封禁和缓存一致性的责任边界。

8. 数据模型

建议控制面使用以下关系模型。所有主键使用 UUID,所有时间使用 UTC,并在展示层转换时区。

关键字段关键约束
merchantsidexternal_refnamestatuscreated_atexternal_ref 全局唯一
api_keysidmerchant_idpublic_key_idenvironmentstatusnot_beforeexpires_atcreated_atpublic_key_id 全局唯一;商户外键不可空
api_key_secret_versionsidapi_key_idsecret_digestpepper_versionversionstatusvalid_fromvalid_until每个 Key 的 version 唯一;不保存明文 Secret;Pepper 版本外键不可空
api_key_signing_keysidapi_key_idalgorithmpublic_keystatusvalid_fromvalid_until只允许批准的非对称算法;不接收私钥
api_key_client_certificatesidapi_key_idcertificate_fingerprintissuer_refstatusvalid_fromvalid_until指纹与 Key 的绑定唯一;证书链必须来自批准的发行者
api_key_ip_bindingsidapi_key_idip_networkstatuscreated_at同一 Key 下规范化后的 ip_network 唯一;禁止重叠;执行第 5.3 节前缀限制
scopesidscope_nameplatformresourceactionstatusscope_name 全局唯一
api_key_scopesapi_key_idscope_idgranted_atgranted_byKey 与 Scope 联合唯一
routesidroute_nameenvironmentplatformmethodpath_rulerequired_scope_idservice_capability_idrequest_classpolicy_versionstatus数据库 CHECK 保证已发布路由具有 required scope、环境和服务能力声明
merchant_region_policiesmerchant_idenvironmentprimary_regionallowed_regionsfailover_modeversion每个商户和环境只有一条有效策略
service_capabilitiesidservice_nameenvironmentread_consistencymax_replication_lag_mssignal_max_age_secondssupports_global_idempotencyautomatic_read_failoverautomatic_write_failover每个服务与环境只有一条有效能力声明;能力提升需要审批
service_endpointsidservice_nameenvironmentregionendpoint_refhealth_policystatus服务、环境、地域和端点引用联合唯一
control_plane_epochsepochwriter_regionlease_idactivated_atfenced_previous_writer_at只追加;接管前必须记录旧主围栏证据
config_outboxidaggregate_typeaggregate_idconfig_epochconfig_sequenceevent_typepayloadpublished_at事件 ID 唯一;与配置写入同一事务;版本按 epoch 与 sequence 比较
admin_audit_logsidactor_idactionresource_typeresource_idbefore_digestafter_digestreasoncreated_at只追加,不允许更新和删除

IP 建议使用 PostgreSQL inet 类型。secret_digest、审计差异和 Outbox 载荷均需列级加密或磁盘加密;任何载荷都不得包含明文 Secret。

9. 管理接口

管理接口只允许从内部管理网络访问,并使用公司身份系统的短期访问令牌。建议提供以下固定资源接口:

方法与路径用途关键输入
POST /admin/v1/api-keys创建 Keymerchant_idenvironmentscopesip_bindingsexpires_atreason
GET /admin/v1/api-keys按商户、状态或环境查询 Key 元数据查询条件,不返回 Secret 或摘要
POST /admin/v1/api-key-rotations创建新 Secret 版本api_key_idoverlap_hoursreason
POST /admin/v1/api-key-signing-keys注册商户请求签名公钥api_key_idalgorithmpublic_keyvalid_untilreason
POST /admin/v1/api-key-client-certificates绑定 mTLS 客户端证书api_key_idcertificate_fingerprintissuer_refvalid_untilreason
POST /admin/v1/api-key-suspensions暂停 Keyapi_key_idreason
POST /admin/v1/api-key-revocations永久吊销 Keyapi_key_idreason
PUT /admin/v1/api-key-ip-bindings原子替换一个 Key 的 IP 绑定集合api_key_idip_bindingsexpected_versionreason
PUT /admin/v1/api-key-scopes原子替换一个 Key 的 Scope 集合api_key_idscopesexpected_versionreason
POST /admin/v1/routes/validations校验待发布路由配置完整路由配置和目标版本
POST /admin/v1/route-publications发布已校验的路由版本route_idexpected_versionreason

所有写接口必须支持幂等请求标识、乐观锁版本和操作原因。原子替换 IP 或 Scope 的响应必须返回替换前集合摘要和新版本号,供误操作审计与受控回滚使用。Secret 创建响应禁止被反向代理、APM 或审计中间件记录。

高风险操作包括生产 Key 创建、Scope 提权、扩大 IP 网段、允许跨地域写入和吊销恢复策略变更,建议要求双人审批。

10. 缓存与配置一致性

10.1 配置发布与运营中心

配置发布与运营中心有两条彼此独立的路径。普通变更走单写控制面、PostgreSQL 和 Outbox;紧急只拒绝路径使用不同网络、身份角色和硬件保护签名,在普通控制面不可用时仍可收缩访问。不可篡改审计写入属于本边界,可观测性中心只读取和关联这些记录。

%%{init: {"flowchart": {"curve": "linear", "nodeSpacing": 34, "rankSpacing": 38, "htmlLabels": true}}}%% flowchart TB subgraph STANDARD["普通配置发布 · 统一控制面单写"] direction TB ADMIN["内部管理后台 / 自动化系统"] --> ADMIN_API["Gateway Admin API<br/>内部身份 · 最小权限 · 双人审批"] ADMIN_API --> VALIDATE["配置不变量校验<br/>乐观锁 · 单写租约 · 旧主围栏"] VALIDATE --> TX["PostgreSQL 事实源<br/>同一事务写配置、审计与 Outbox<br/>(epoch, sequence)"] TX --> AUDIT["不可篡改审计存储<br/>操作者 · 审批 · 原因 · 变更摘要"] TX --> OUTBOX["事务 Outbox 与消息总线<br/>幂等发布 · 重放 · 版本对账"] OUTBOX --> ROUTE_SNAPSHOT["路由策略快照<br/>供流量路由策略中心"] OUTBOX --> ACCESS_SNAPSHOT["Key · IP · Scope 快照<br/>供访问控制中心"] OUTBOX --> GOVERN_SNAPSHOT["路由治理快照<br/>供请求治理与执行层"] end subgraph EMERGENCY["紧急只拒绝 · 独立安全通道"] direction LR SECURITY["安全事件指挥<br/>独立身份角色"] --> SIGNED["硬件签名拒绝指令<br/>只追加 Key / 商户 / IP 拒绝项"] SIGNED --> REGIONAL_DENY["各地域访问控制中心<br/>验签后与中央配置取并集"] SIGNED --> LOCAL_AUDIT["本地只追加审计副本<br/>恢复后归档到正式记录"] end classDef external fill:#F7F9FC,stroke:#8A9AAF,color:#18212F,stroke-width:1.5px classDef control fill:#F2F0FF,stroke:#6657C7,color:#292057,stroke-width:1.5px classDef output fill:#FFFFFF,stroke:#4F79A7,color:#18212F,stroke-width:1.5px classDef emergency fill:#FFF2EC,stroke:#C7582B,color:#6B2812,stroke-width:1.5px class ADMIN,SECURITY external class ADMIN_API,VALIDATE,TX,OUTBOX,AUDIT control class ROUTE_SNAPSHOT,ACCESS_SNAPSHOT,GOVERN_SNAPSHOT output class SIGNED,REGIONAL_DENY,LOCAL_AUDIT emergency style STANDARD fill:#FAF9FF,stroke:#C9C0F1,stroke-width:2px style EMERGENCY fill:#FFFAF7,stroke:#E8B69F,stroke-width:2px

普通发布流程如下:

  1. 控制面在同一 PostgreSQL 事务中更新配置和写入 Outbox 事件。
  2. 发布器把事件发送到消息总线,事件包含 (epoch, sequence) 配置版本。
  3. 各地域消费者幂等应用事件,先比较 epoch 再比较 sequence,拒绝旧版本覆盖新版本。
  4. 各地域的 API Key 验证服务维护 Redis 快照和进程内短缓存。
  5. 每个地域周期性执行全量版本对账,发现缺口后从事实源重建快照。

10.2 吊销优先级

吊销、暂停和 IP 移除属于安全事件,必须走高优先级通道,并向所有地域推送失效通知。建议目标为 99.9% 的安全变更在 10 秒内生效。

如果消息总线异常,各地域使用短周期版本轮询补偿。对于无法确认状态的新 Key 或未缓存 Key,数据面必须拒绝;不得为了可用性绕过授权。

10.3 紧急只拒绝通道

控制面或 PostgreSQL 不可用时,安全人员仍必须能够立即阻止泄露的 Key。每个地域提供独立的 break-glass 紧急封禁入口,并遵守以下约束:

  1. 入口仅允许新增对公开 Key ID、商户 ID 或来源 IP 的拒绝项,不能新增允许项、扩大权限或删除中央吊销记录。
  2. 指令使用硬件保护的内部安全签名密钥签名,各地域的 API Key 验证服务先验签再把拒绝项与中央配置做并集。
  3. 正常情况下需要两名授权安全人员审批;已声明的最高级安全事件允许事件指挥官先执行,第二名审批人必须在 15 分钟内复核。
  4. 地域本地拒绝项的初始租期为 24 小时。控制面仍不可用时,安全人员可以通过相同签名与审批流程续期;API Key 验证服务在距离到期 2 小时和 1 小时告警,且在控制面不可用、拒绝项尚未正式归档时不得因租期到期自动恢复允许。控制面恢复后必须转为正式暂停或吊销记录,未完成归档前不得提前删除。
  5. 每个地域把操作人、审批人、原因、签名摘要、接收时间和生效时间写入本地只追加审计存储。
  6. break-glass 入口与普通 Gateway Admin API 使用不同网络路径、身份角色和签名密钥,季度演练一次。

10.4 降级策略

故障行为
PostgreSQL 控制面主库不可用普通管理写入停止;数据面使用最后一次已验证快照继续服务;紧急封禁使用第 10.3 节通道
消息总线不可用控制面提交配置但标记为待发布;区域通过版本轮询补偿;发布完成前不宣告变更生效
地域 Redis 不可用API Key 验证服务使用有界的进程内快照;未知 Key 和超过快照有效期的 Key 拒绝;分布式限流降级为实例本地令牌桶,实例只能使用故障前已租用且未过期的配额份额,新实例配额为零,因此全部实例份额之和不得超过该商户或 Key 的全局配额
API Key 验证服务不可用网关认证失败关闭,返回 503,不绕过权限校验
单个后端实例不可用健康检查摘除并在同一服务池选择健康实例
整个后端地域不可用按第 7.3 节的读取与写入前提决定故障转移或返回 503

最后一次已验证快照的最大离线使用时间建议为 15 分钟。超过该时间仍无法取得新版本时,应拒绝高风险写请求;读取请求是否继续需要由各平台按风险分级确认。