概述
功能开关可以关闭下单、改变价格或提前暴露未完成功能,因此开关变更本质上是生产变更,值得拥有与发布同等级的审计记录。厂商审计日志有保留期限且导出往往靠人工,内部只追加表则提供可长期保存、能与发布时间和事件编号关联的记录。
步骤
- 创建只追加审计表,并收回应用角色的 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;
- 写入前用 HMAC 校验 webhook 签名,并用常量时间比较避免时序攻击;签名无效直接返回 401。
- 查询最近五分钟生产环境的高风险开关变更,推送到负责团队。
- 每日运行对账脚本,与厂商审计 API 比对,补齐丢失的 webhook 事件。
验证
预期一次生产开关切换产生一行记录,字段包含修改人、前后值和原始时间;重复投递因唯一索引被拒绝且视为成功。签名错误的请求不产生任何行。对账脚本应报告零缺失或列出需补录的事件 id。
注意事项
- webhook 可能延迟或丢失,必须每日对账,不能假设事件完整。
- 审计表要独立备份、设置保留期与访问控制,否则本身会成为篡改点。
- actor 字段应映射到具体人员或受管服务账号,避免只记录 API token 名称。
- 事件时间使用厂商提供的时间而非接收时间,便于延迟投递时正确排序。