
买安全工具的时候,很多人会陷入"功能军备竞赛",觉得工具越多越安全。但我踩过不少坑之后发现,这个问题没这么简单——你不只是在买功能,你买的是一种**推理方式**。这个问题不搞清楚,工具越买越多,问题越堆越杂。
Stave 是我参与开发的一个开源项目,下面的讨论中会涉及它,相关的论断我会标出边界。Cynefin 是 Dave Snowden 的框架,后文会展开介绍。
团队在组装云安全工具时总会出现一个反复出现的困惑:给问题套错了方法——明明有确定的答案,却用概率推断;明明不可能提前知道答案,却用一套死规则去套。Dave Snowden 的 Cynefin 框架精确地描述了这种错配,一旦你看清楚这点,"我需要什么工具"这个问题基本上就自己回答了——包括那些诚实地告诉你"不是我现在卖的这个"的部分。
Cynefin 按因果关系的本质来对问题分类。其中两个领域支撑整个讨论:
Complicated(繁杂)——因果关系是可知的。存在正确答案;找到它需要分析或专业知识,但可以从眼前的数据推导出来。有经验的工程师(或一个好的引擎)可以把它算出来。方法是分析,再响应。
Complex(复杂)——因果关系只有在事后才能理清。系统是一堆相互作用的组件绞在一起,无论盯多久任何单一的东西都无法提前给出答案。你无法推导,只能探测、感知、响应——做实验、观察结果、形成假设。答案到来时,是当前的最佳解释,不是证明。
Cynefin 还有其他领域——Clear(清晰),答案显而易见;Chaotic(混乱),先行动再思考;以及中心的 Confused(困惑)状态,指你还没搞清楚自己处于哪个领域。大多数买家都处于最后一个状态。
搞砸工具决策的错误就是:把 Complex 问题当 Complicated 来处理,或者反过来。
生产环境中分布式系统的线上事故就是典型的 Complex 问题。为什么凌晨两点延迟突然飙升?原因是负载、一次部署、一个慢依赖、一次缓存变更、还有流量模式之间的某种交互——只有事后重建才能理清。你无法从任何单一数据源推导,必须调查。
这就是 AI 调查代理(investigation agent)的用武之地。这些工具连接可观测性数据、代码和基础设施,跨维度推理找到根本原因并预警潜在故障。它们构建模型、评估相互竞争的假设,给出最佳解释。某款代理报告称在全新事故上达到了 70%+ 的准确率。
Cynefin 的视角:这个 70% 不是弱点,恰恰是 Complex 领域的诚实上限。当因果关系只能在事后才能理清时,确定性本来就不是菜单上的选项,因为这个问题本身就不存在一个可以提前推导出的答案。这类代理运行的逻辑是溯因推理(abduction)——最佳解释的推断:"这些症状最好由这个原因来解释。"溯因推理本质上是不确定的;同一个证据可以匹配多个原因,所以输出是一组带置信度的排序假设,而不是裁决。异常模型也依赖归纳——从大量历史数据中泛化——但在事故发生时设定准确率上限的,是溯因推理这一步。概率推断在这里是正确的工具。如果一个工具声称对全新事故的原因有 100% 确定性,那它是在对自己所处的领域撒谎。探测、感知、响应——做好了——就是 Complex 的正确姿势。
这个领域的失败模式恰恰相反:用僵硬、预写的规则去套。静态阈值和 runbook 是 Complicated 领域的工具——"如果指标 > X 就告警"——它们在 Complex 环境中失败的原因正是:你无法提前列举出所有会起作用的条件。这就是为什么阈值调优永无止境、runbook 永远落后一个事故。领域错配了。
现在换一个不同的问题:这个配置是否满足一条明确的安全规则?这个 IAM(身份与访问管理)策略是否授予了不该有的权限?这个存储是否以我们策略禁止的方式暴露了?
这些问题有确定的答案,而且答案可以从配置本身推导出来。这是 Complicated,不是 Complex。调查代理靠溯因推理——从证据猜最佳答案;配置评估靠演绎推理(deduction):结论从配置和规则中必然得出。没有"大概"。配置要么满足规则,要么不满足,确定性引擎每次都能得出同样的结果、可复现。
在这个领域用概率推断是错配。一个告诉你配置"87% 可能合规"的工具,扔掉了本来可以拿到的确定性。你不需要一个关于 S3 桶策略是否违反规则的猜测;你需要裁决,而且希望明天得到同样的裁决,这样审计人员重新跑一遍结果相同。确定性在这里不是限制或保守选择,是领域本身要求的方法。用模型回答一个可以推导的问题,徒增成本、延迟和不确定性,而这些本来都不需要存在。
这就是我参与开发的工具 Stave 所专注的领域:对配置快照进行确定性评估,对抗一系列安全不变量,模型不参与其中。关键是:对于 Complicated 领域的问题,Stave 是正确的,而用推断反而是错误。
框架在这里逼出了一个坦诚的承认。
云安全中最有价值的一些风险往往是复合的——来自资源的组合方式,而不是任何单一错误配置。逐个检查单个资源的扫描器看不到这种风险。本来很想直接宣称"复合风险是我们的地盘,用确定性方法处理",但 Cynefin 不让这么说,因为复合风险同时存在于 Complicated 和 Complex 边界的两侧,给定风险具体落在哪一边,决定了应该用哪个工具。
能从配置推导的复合风险是 Complicated——确定性评估可以覆盖。如果一条攻击路径的存在完全由配置决定——这个函数有这个角色,这个角色可以读取这个桶,这个桶里存着敏感数据——那么这条路径就可以从配置图中推导出来。不需要运行时观察。通过遍历图就能证明路径在快照中存在,图遍历是确定性计算,不是猜测。这确实是确定性工具的领域,也是扫描器遗漏的部分——因为它们看节点,不看边。
依赖行为的复合风险是 Complex——不是确定性工具的菜。如果一条路径的存在取决于运行时状态——这个服务是否调用那个服务,这段代码在真实流量下是否可达,这个权限是否被实际使用——那么仅靠配置本身无法推导。它只有在观察运行中的系统时才能显现。这是 Complex 领域,确定性引擎对此天生是盲的。调查代理的探测-感知-响应在这里打败了确定性评估,因为没有什么可以推导,只有什么可以观察。
所以,一个确定性配置工具能诚实声称的范围比"我们捕获复合风险"要窄。它说的是:我们捕获从配置图可推导的复合风险。一旦风险的存在取决于行为,它就跨入了演绎推理没有东西可处理、推断才是正确方法的领域。配置快照可以证明路径在配置中存在;无法证明路径在生产环境被触发,也无法证明路径可被利用。快照可能没有捕捉到的控制措施是另一个问题,在另一个领域。
关于复合风险的故事并不意味着工具有它本来没有的覆盖范围。它确实有的覆盖范围——配置可推导的跨资源路径、用确定性方法评估——是真实的、被逐资源扫描器遗漏的。这个主张足够强,不需要夸大。
有一个第四领域让确定性评估何时可行这个问题更加清晰。Cynefin 的 Chaotic(混乱)领域是因果关系在当下无法知晓的状态——没时间分析,没有稳定状态可供推理。一次正在发生的入侵可以把一个本来属于 Complicated 的系统拖入其中:事态发展太快、系统受损太严重,什么都推导不出来。Snowden 对 Chaotic 的处方很直接。先行动(遏制、隔离、关闭),把系统逼回一个可以推理的领域。
确定性配置评估不是 Chaotic 领域的工具。入侵进行中它对你毫无用处——那时候你在遏制,不是在推导。它的窗口是在失误发生之前。在一切平静时评估配置姿态之所以有价值,是因为演绎推理只在系统稳定时才可用;一旦陷入混乱,分析的成本就超过时间带来的价值。确定性(配置)仍然存在,但房子着火的时候你承受不起去看它,只剩下行动。所以配置治理不是"入侵时救你的东西"——那是 incident response(事件响应),不同领域、不同工具。它是在事前缩小可推导的攻击面,让更少的路径站在那里等着被利用变成混乱事件。在 Complex 向 Chaotic 转化的那个时刻里运作的工具是调查代理,不是配置评估器——这又是两者的互补性。
如果把工具映射到各自对应的领域,所谓竞争就消解了:
这些工具谁也替代不了谁,因为它们回答的是不同领域的问题。只有在负载下才会显现的运行时风险,对配置工具是不可见的。在一切平稳运行时悄悄违反策略的配置违规,对运行时代理是不可见的。要求一个工具同时覆盖两个领域,就是把最初的 Cynefin 错误包装成了采购决策。
Cynefin 的中心状态——有时叫 Confused 或 Aporetic——是你还没搞清自己的问题属于哪个领域的状态。这就是安全买家说"我们已经跑了一个调查代理,为什么还要其他东西?"时所站的位置。这个问题混淆了两个领域。他们覆盖了 Complex(运行时调查),以为就覆盖了 Complicated(配置姿态),或者反过来。
有用的做法不是争你的工具更好,而是帮助对方区分领域——让他们看清自己拿着的是两个不同的问题,需要两种不同的方法。一旦 Complex 问题和 Complicated 问题被分别命名,工具问题就不再是竞赛,而是一份清单:这两个问题中,我分别用对了方法的那个覆盖了哪个?
把 Cynefin 引入安全讨论的全部价值就在于此。它不告诉你买哪家厂商。它告诉你一个给定的问题本质上能有什么样的答案,而这比任何功能对比都能防止你买一个概率答案去回答本该有确定性答案的问题,或者买一个死规则去回答一个本来就不可能安静下来的问题。
Stave 是一个我参与开发的开源、确定性配置评估工具(Apache 2.0,早期阶段)。我尽量把它的声明限制在它所属的 Complicated 领域内。如果你认为我在 Complicated/Complex 边界划错了位置——把我称为可推导的配置风险划到了需要运行时观察的类别,或者反过来——那才是值得讨论的分歧。Cynefin 属于 Dave Snowden;应用中的任何错误都是我的。