Caloogy 文章
English

混沌工程与故障注入

日期
2025 年 7 月 22 日
系列
方法论
阅读
4 分钟
主题
TestingChaos engineeringFault injectionResilience

一句话版本

系统总会出故障:服务器宕机、网络延迟、依赖服务返回错误、数据源返回假数据。与其等它在半夜自己发生,不如主动在可控的条件下制造故障,看系统会怎样反应。这就是混沌工程。 对安全来说,它回答的问题是:我设计的 fail-closed、交叉验证、告警、自动止损,在故障真的发生时真的会生效吗?很多防线只有在被"打"过一次之后,才知道它是不是摆设。

全文分三层:

  1. 通俗理解:消防演习
  2. 实际用处:Netflix 的 Chaos Monkey、游戏日、安全领域的应用
  3. 原理与工程要点:实验的步骤、注入哪些故障、怎么控制爆炸半径

第一层:通俗理解

1.1 消防演习

一栋楼装了烟雾报警器、喷淋系统、应急灯、逃生通道。但:

不演习,永远不知道。而真正着火时才发现问题,就太晚了。

1.2 从"希望它能工作"到"知道它能工作"

只设计不测试 主动注入故障
"数据源不一致时系统会拒绝" 真的让一个数据源返回假数据,看系统是否拒绝
"页面被篡改会告警" 在测试环境里真的改一下页面,看告警多久到达、发给了谁
"主数据库挂了会自动切换" 真的关掉主库
"备份可以恢复" 真的从备份恢复一次

第二层:实际用处


第三层:原理与工程要点

3.1 一次实验的步骤

  1. 定义稳态:系统正常时的可观测指标是什么?(比如:请求成功率、交易确认时间、告警数)
  2. 提出假设:"当 X 发生时,稳态保持不变"或"当 X 发生时,系统会进入安全状态并在 Y 分钟内告警";
  3. 注入故障:在受控范围内制造 X;
  4. 观察:稳态是否保持?告警是否触发?系统是否进入了预期的安全状态?
  5. 复盘与修复:假设不成立的地方,就是需要修的地方。

3.2 安全相关的故障注入

注入的故障 验证的防线
一个数据源返回错误或伪造数据 多源交叉验证是否拒绝并告警
外部名单拉取失败、返回空名单 Fail-closed是否保留旧名单并告警
页面内容被修改 完整性巡检多久发现(见《Bybit事件与前端完整性》)
签名链路篡改交易参数 签名后核对是否抓到
告警渠道本身失效(邮件服务挂了) 有没有心跳机制发现"告警系统沉默了"(见《安全监控与告警疲劳》)
证书过期、时钟偏移 系统是否给出清晰的错误而不是悄悄降级
凭证被撤销 服务是否安全地失败,而不是回退到更弱的认证方式

3.3 控制爆炸半径

措施 说明
先在测试环境做 熟练之后再考虑生产环境
从小开始 先影响一台机器、一小部分流量
有"紧急停止"按钮 随时可以中止实验,恢复正常
避开高风险时段 不在大促、发布当天做
通知相关人员 至少让值班的人知道,避免被当作真实事故

3.4 自动化

成熟之后,可以把故障注入纳入持续流程:

3.5 心态

混沌工程的目的不是"搞破坏",而是用可控的小故障,避免不可控的大故障。每一次实验发现的问题,都是一次在真实事故之前的免费学习。


总结

层次 要点
直觉 消防演习:不演习不知道防线是不是摆设
方法 定义稳态 → 假设 → 注入 → 观察 → 修复
安全用途 验证 fail-closed、交叉验证、告警、备份恢复是否真的生效
控制 测试环境先行、从小开始、紧急停止、通知相关人员