← 中文资源

简体中文版本

审计每一次功能开关变更

在只追加表中记录开关的修改人、时间、环境与前后值,并对生产环境高风险开关变更告警。

阅读英文原文

概述

功能开关可以关闭下单、改变价格或提前暴露未完成功能,因此开关变更本质上是生产变更,值得拥有与发布同等级的审计记录。厂商审计日志有保留期限且导出往往靠人工,内部只追加表则提供可长期保存、能与发布时间和事件编号关联的记录。

步骤

  1. 创建只追加审计表,并收回应用角色的 UPDATE 与 DELETE 权限:
CREATE TABLE flag_audit (
  id bigserial PRIMARY KEY,
  flag_key text NOT NULL,
  environment text NOT NULL,
  actor text NOT NULL,
  action text NOT NULL,
  before_value jsonb,
  after_value jsonb,
  occurred_at timestamptz NOT NULL,
  received_at timestamptz NOT NULL DEFAULT now()
);
CREATE UNIQUE INDEX flag_audit_dedupe
  ON flag_audit (flag_key, environment, actor, occurred_at);
REVOKE UPDATE, DELETE ON flag_audit FROM app_rw;
  1. 写入前用 HMAC 校验 webhook 签名,并用常量时间比较避免时序攻击;签名无效直接返回 401。
  2. 查询最近五分钟生产环境的高风险开关变更,推送到负责团队。
  3. 每日运行对账脚本,与厂商审计 API 比对,补齐丢失的 webhook 事件。

验证

预期一次生产开关切换产生一行记录,字段包含修改人、前后值和原始时间;重复投递因唯一索引被拒绝且视为成功。签名错误的请求不产生任何行。对账脚本应报告零缺失或列出需补录的事件 id。

注意事项

  • webhook 可能延迟或丢失,必须每日对账,不能假设事件完整。
  • 审计表要独立备份、设置保留期与访问控制,否则本身会成为篡改点。
  • actor 字段应映射到具体人员或受管服务账号,避免只记录 API token 名称。
  • 事件时间使用厂商提供的时间而非接收时间,便于延迟投递时正确排序。