Havenlon|Policy 不是神谕(七):多策略不等于安全,策略收敛才是关键 多个 Policy 同时存在只能说明系统拥有多个判断来源只有这些判断能够向同一个受限边界收敛系统才真正拥有策略安全。摘要在复杂系统里单一 Policy 很难覆盖全部风险。于是系统开始叠加更多策略来源SaaS 负责组织和业务规则本地 Policy 负责额度与设备状态审批 Policy 负责人的授权风险模型负责动态判断执行边界负责最终参数检查管理员保留异常处置能力。从架构图上看这像是一套多层防线。但多策略并不天然等于安全。如果这些 Policy 之间没有明确关系它们可能产生完全相反的效果任一来源允许即可继续、冲突时由业务系统选择、一个来源失效后自动退回更宽松规则、多个 Policy 依赖同一份错误数据、不同来源分别放宽不同维度、最终执行取所有策略的并集而不是交集。这时策略数量越多系统中的例外路径和解释空间反而越大。策略的数量制造的是安全感策略的收敛才制造安全。前六篇拆解了单一策略的边界并从攻击者视角说明了寻找最宽松来源的游戏。这一篇正面回答那个被反复推到面前的问题为什么拥有多个 Policy并不天然安全以及如何让多个有限判断收敛成一个可证明、风险受限的结果。策略收敛不是选出一个最权威的裁判也不是把所有判断机械地做布尔 AND而是让不同来源在自己的职责范围内提出限制并确保最终可执行空间不能超过任何必要来源共同允许的范围。多策略提供视角策略收敛才提供边界。一、为什么系统会走向多策略单一 Policy 的局限非常明显。SaaS 可以理解业务却看不见全部本地执行状态本地 Policy 靠近执行却不掌握完整组织上下文人工审批可以理解语义却会受到界面、时间压力和错误信息影响风险模型可以识别动态异常却可能漏报也可能被诱导硬件约束可以守住不可突破的底线却无法解释复杂业务目的。因此系统自然会增加更多判断来源。一项高风险付款可能同时要求业务订单有效、成员身份有效、两人审批完成、风险评分低于阈值、金额低于组织限额、金额低于本地设备限额、收款目标在白名单、最终参数与审批一致、执行设备状态正常。这种多策略结构是必要的因为没有任何单一来源能够独立看见全部事实。但从需要多个来源到多个来源自然形成安全中间还差一个关键步骤系统必须定义这些来源如何共同决定最终执行范围。多个答案同时存在不会自动变成一个安全结果。如果没有这一步多策略就只是多个答案并列——热闹但没有边界。二、多个判断不等于多重约束假设一个系统有三个 Policy。SaaS 允许单笔最高 100,000 元本地允许向白名单目标执行、单笔最高 50,000 元审批人同意向目标 A 支付 30,000 元。如果系统真正执行的是目标 A、金额 30,000、仅执行一次那么三个 Policy 的限制形成了共同边界。但如果系统把不同来源的宽松部分拼接起来——使用 SaaS 的 100,000 上限、本地的全部白名单、审批的已通过状态——最终就可能得到可以向任意本地白名单目标支付最高 100,000 元。这个结果没有任何一个 Policy 单独明确允许过。它是系统把多个局部许可错误组合后的产物。多个 Policy 通过拼接产生的权限可能比其中任何一个单独允许的都大。这说明多个 Policy 可以同时存在却没有形成多重约束——它们甚至可能通过组合制造出无人授权的能力。三、最危险的错误是把多策略做成并集多策略系统最常见的问题是默认使用并集逻辑SaaS 允许的可以执行本地允许的也可以执行审批通过的也可以风险模型认为正常的也可以最终把所有可用能力合并起来。举个完整的例子。SaaS 允许目标 A/B/C、金额最高 100,000、有效期 30 分钟。本地允许目标 A/B、金额最高 50,000、有效期 10 分钟。审批允许目标 A、金额 30,000、仅一次、有效期 5 分钟。如果取并集最终可能变成目标 A/B/C、金额最高 100,000、有效期 30 分钟甚至允许多次。这相当于从每个来源挑出最宽松的部分——每个 Policy 原本都带着限制组合之后限制却被相互抵消了。真正合理的结果应该接近交集只允许目标 A、金额最高 30,000、仅一次、5 分钟内有效。并集是把每个来源最松的地方拼起来交集是把每个来源最紧的地方叠起来。安全永远站在交集这一边。用格论lattice的语言说收敛就是在策略空间里不断取下确界meet——每一步都只能往更小的可执行集合走。四、策略收敛的本质是不断缩小可执行空间Policy 经常被表达成ALLOW / DENY但真实策略通常包含多个维度哪个主体、对哪个目标、执行什么动作、金额或数量上限、执行多少次、在什么时间内有效、使用什么设备、需要哪些审批、是否允许重试、异常时如何处理。因此策略收敛不是统计有多少个ALLOW而是在多个维度上不断缩小可执行空间。最初的请求可能是允许财务 Agent 处理供应商付款经过 SaaS 收缩为只允许已确认订单单笔不超过 100,000经过本地收缩为只允许白名单目标单笔不超过 50,000经过审批收缩为只允许向目标 A 支付 30,000经过执行边界后最终成为在 5 分钟内使用指定执行槽位向目标 A 支付 30,000仅一次。收敛的每一层都不在增加能力只在前一层的基础上继续限定。这是一条从模糊意图到具体动作的单向下坡路越往下可执行空间越小攻击者的解释空间也越小。五、收敛不是选一个最高权威而是让每层守住自己的维度面对多个 Policy最简单的做法是规定优先级SaaS 优先于本地本地优先于 SaaS人工审批优先于机器。实现简单但它仍然在寻找唯一裁判——一旦最高优先级来源给出结论其他来源就失去意义。如果规定 SaaS 最高SaaS 允许、本地拒绝系统仍可能执行。如果规定本地最高本地允许、但组织已冻结系统仍可能执行。如果规定人工最高审批人同意、但最终参数已变化系统仍可能继续。每一种最高权威都在给攻击者指明该攻哪一层。真正的策略收敛不问谁的权力最大而问每个来源能够对哪些维度施加不可被其他来源取消的限制。SaaS 可以决定组织是否冻结本地可以决定设备状态是否允许审批可以限定具体目标和金额执行边界可以拒绝参数不一致——这些限制应该同时成立。好的多策略体系不是让所有 Policy 重复判断同一件事而是让不同来源负责自己最擅长的约束SaaS 管组织身份、角色关系、业务订单、全局风险、组织级额度本地管本地额度、执行频率、本地白名单、设备状态、状态新鲜度、Safe Mode审批管具体业务目的、目标、金额、操作范围、执行次数、有效期执行边界管最终参数、Intent 绑定、密钥槽位、计数器、不可突破的硬边界、执行证据。每一层拥有有限职责最终结果是这些限制的共同作用——这比让所有来源都返回一个模糊的ALLOW安全得多。六、多个 Policy 如果依赖同一来源并不是真正多源一个系统可能有身份 Policy、风险 Policy、审批 Policy、额度 Policy、目标 Policy 五个模块但如果它们全部依赖同一个 SaaS 数据库那么这仍然可能是单一来源。设想数据库中同时保存用户角色、白名单状态、审批结果、风险标签、当前额度、Policy 配置。一旦这个数据库被污染所有策略可能同时得出一致的错误结论。系统会看到身份有效、目标可信、审批完成、风险正常、额度充足——五个 Policy 全部通过。但这不是五个独立来源共同验证只是同一个错误事实被读取了五次。共享同一个信任根的多策略不是多源治理而是同一个错误被复制了很多份。因此策略收敛不仅要求多个 Policy还要求关键判断之间具有真实的独立性组织状态来自 SaaS本地额度由 Hub 独立维护审批绑定人的签名或设备确认最终参数由执行边界重新计算执行结果由本地设备生成证明。只有来源真正分散多策略才有能力限制单点错误。这正是第六篇埋下的来源独立条件。七、一致不等于正确但冲突一定值得重视多个 Policy 得出一致结论不代表结论一定正确——它们可能共享同一份错误输入可能都被同一套错误上下文诱导也可能都没覆盖某种新风险。所以策略收敛不能把多数一致当成绝对正确。但策略冲突本身通常就是一个重要信号SaaS 显示成员有效而本地显示状态过期、审批允许而本地额度不足、业务订单有效而设备进入 Safe Mode、风险模型低风险而最终参数与审批不一致、云端策略已更新而本地仍用旧版本。这些冲突意味着系统当前无法形成一致的执行事实。此时不应由业务系统快速选择一方也不应简单相信最新、最高权限或最方便的来源。更合理的动作是停止扩大权限、重新同步、重新审批、缩小金额、限制目标、要求额外确认、暂停高风险执行。策略冲突不是流程故障而是安全系统在提醒你现实此刻无法收敛。冲突是免费的告警——攻击者制造它防御者浪费它成熟的系统尊重它。八、策略收敛必须是单向的一个安全的收敛过程应该具有明确方向从宽泛意图逐步收缩为具体、有限、可执行的动作且不应该在后续层重新扩大。审批已经限定目标 A、金额 30,000、一次执行执行层就不能因为本地上限是 50,000 而把金额提到 50,000SaaS 也不能因为组织上限是 100,000 而解释为可以增加金额本地白名单包含 A/B也不代表审批目标 A 可以被替换为 B。一旦某一层施加了更严格限制后续层只能保持、进一步收紧或拒绝——不能放宽。收敛是单行道。任何一处允许回头放宽整个过程就退化成了讨价还价。在数学上这要求整个收敛链是单调递减monotonic narrowing的每一步的输出集合都是输入集合的子集。对高风险执行来说反复协商会重新制造攻击者可利用的解释空间而单向收敛从结构上消灭了这种空间。九、ALLOW不是一个完整的策略结果多策略难以收敛一个重要原因是很多系统只传递一个ALLOW。这个结果没有表达允许谁、允许做什么、对哪个目标、金额多少、有效多久、可以执行几次、基于哪个状态、哪些条件必须继续成立。于是不同来源的ALLOW根本无法比较SaaS 的ALLOW可能表示业务订单有效本地的ALLOW可能表示额度未超限审批的ALLOW可能表示某个人同意——系统却把它们当成同一种通行证。一个不带范围的ALLOW是无法参与收敛的你没法对两句可以取交集。真正可收敛的 Policy 结果应该更像一组约束Subject: Finance Agent 7 Action: Transfer Target: Account A Max Amount: 30,000 Max Count: 1 Valid Until: 14:05 Policy Hash: P7 Intent Hash: H1 Required Device State: Normal Retry: Not Allowed只有当 Policy 结果足够具体系统才能计算共同允许范围。这正是把第二篇的带条件决策凭据用于多源比较的前提。十、策略收敛必须绑定同一个 Intent多个 Policy 即使都返回允许也可能判断的不是同一件事。SaaS 判断的是支付供应商服务费审批人看到的是支付 30,000 元本地检查的是账户 A 在白名单执行设备面对的是最终 Payload。如果这些对象之间没有强绑定系统就可能出现每一层都允许但每一层允许的其实不是同一个动作——这正是第六篇的语义缝隙。所以收敛必须围绕一个共同 Intent。这个 Intent 至少应该表达执行类型、目标、金额或数量、权限范围、时间、次数、关键参数、业务引用、必要的状态版本。系统为它生成统一摘要Intent Hash不同 Policy 的判断都必须绑定该摘要最终执行前再验证真实 Payload 是否仍对应同一 Intent。没有共同 Intent多策略只是多个松散意见有了共同 Intent它们才是在约束同一件事。十一、执行边界负责收敛但不必复制整个业务世界有一种设计思路是前面所有系统只负责提供信息最后由执行设备统一决定。这看起来很安全因为最终权力集中在独立边界。但它也可能把执行层变成新的复杂策略中心——执行设备需要理解组织结构、业务订单、审批角色、动态风险、本地额度、合规规则、AI Agent 上下文、异常流程。复杂度越高越难验证也越难保持独立第四篇的警告。更合理的方式是让每一层生成可验证、范围明确的约束结果最后一层负责验证这些结果、检查它们是否绑定同一个 Intent、计算最终交集、确认没有冲突和过期状态、执行不可突破的本地限制。执行边界的职责是收敛与许可不是重新理解整个世界。它是最后一道闸门不是又一个全知中心。十二、收敛规则不能交给业务系统临时解释也不是多数投票当多个 Policy 冲突时很多系统会把决定交给业务代码例如如果本地拒绝但 SaaS 标记紧急则允许管理员强制执行如果风险服务不可用则使用审批结果继续。这些规则看起来在处理特殊情况实际上让业务系统拥有了重新解释安全约束的能力——它可以决定哪个拒绝可以忽略、哪个状态可以复用、什么算紧急、什么时候可以降级、哪个 Policy 更权威。一旦业务系统能够重新解释安全约束收敛的方向就会被可用性目标悄悄改写。可靠的收敛规则应该明确、可验证、尽量少依赖临时解释、不允许业务层取消不可突破限制、在异常时向收缩方向变化。业务系统可以提出紧急性但不能因为紧急就改变底层收敛方向。另一个常见误区是把收敛当成多数投票——三个 Policy 中两个允许就执行。但不同 Policy 负责的不是同一种判断SaaS 判断业务订单有效、本地判断设备状态异常、审批人同意业务目的此时两个允许一个拒绝按投票会执行但本地设备状态异常是不可被票数覆盖的必要条件。同样两个风险模型判低风险也不能消除最终参数与审批 Intent 不一致。不同 Policy 不是平等的选票而是不同维度的必要条件。安全问的是所有必需约束是否同时成立不是有多少来源支持执行。十三、不同类型的限制应该采用不同收敛方式策略收敛不是一种数学规则不同字段需要不同处理。金额和数量取更小值SaaS 100,000、本地 50,000、审批 30,000 → 最终 30,000目标集合取交集A/B/C ∩ A/B ∩ A → A有效期取最早到期30 分钟、10 分钟、5 分钟 → 5 分钟执行次数取最小未限制、3 次、1 次 → 1 次风险状态与设备状态是必要条件不满足直接拒绝参数绑定则要求任何关键参数不一致时重新审批或拒绝。收敛需要语义而不只是对一个抽象ALLOW做布尔运算。这也解释了为什么第六篇说取交集不等于机械 AND不同维度有不同的取更严格方式但方向永远一致——朝更小、更短、更少、更严走。十四、缺失状态不能被解释成宽松状态当系统无法获得某个 Policy 结果——SaaS 离线、风险服务超时、本地同步失败、审批撤销状态无法确认、设备时间不可验证——它有两种解释。第一种没有收到拒绝所以继续。第二种缺少必要状态无法证明仍然允许。对高风险执行第二种更合理。因为策略收敛要求的是共同可验证范围如果一个必要来源缺失就无法计算完整交集。此时系统应使用已明确预授权的低风险范围、禁止新增目标、禁止提高额度、限制执行次数、要求本地确认、暂停高风险动作或进入 Safe Mode。缺失不是允许未知不是零风险。这是 default-deny 在多源语境下的直接推论拿不到证据就不能签发许可。十五、策略更新本身也必须经过收敛很多系统只在执行请求时考虑收敛但 Policy 更新本身也会改变执行能力SaaS 把额度从 50,000 提到 100,000、本地增加新目标、审批要求从两人降为一人、Agent 获得新工具权限、有效期从 5 分钟延到 1 小时、Safe Mode 被解除。这些变化都在扩大可执行空间。因此它们不能仅由某一来源单独决定后立即生效需要区分两类更新。收紧型更新降低额度、删除目标、缩短时间、增加审批、冻结成员可以更快生效扩权型更新提高额度、新增目标、延长授权、降低审批要求、开放新工具需要更多独立确认。收缩可以快扩张必须慢——这条不对称原则不仅管请求也管策略自身的演化。因为策略收敛不仅发生在请求之间也发生在系统权力本身如何变化。这与第三、四、五篇对每个来源的要求完全同构。十六、收敛失败本身就是一个明确的结果很多系统认为只有两个有意义的结果ALLOW和DENY。但在多策略体系中还存在第三类同样重要的结果CANNOT CONVERGE它可能表示状态版本冲突、Intent 不一致、必要来源缺失、审批已过期、本地状态无法验证、策略之间存在不可解释差异、关键参数发生变化。这不等于系统故障它表示当前没有足够证据形成一个一致、有限、可执行的边界。此时最安全的动作不是让业务系统猜测而是停止高风险执行、重新获取状态、重新绑定 Intent、重新审批、进入收缩模式。收敛失败是策略系统诚实地承认我现在无法确定。而承认不确定本身就是一种安全能力。从这个角度看Safe Mode 不只是设备故障后的备用状态而是收敛失败后的策略结果当多个必要 Policy 无法形成可信交集时系统主动缩小可执行空间——禁止新增目标、禁止提高额度、禁止高风险执行、仅允许只读、仅允许本地恢复、要求更强确认、保留已有最小能力。进入 Safe Mode 不是 Policy 停止工作而是 Policy 在不确定性上升后完成了一次更严格的收敛。这一点第十一篇会专门展开。十七、按风险分级让收敛既安全又可用策略收敛不意味着所有动作都要经过同样复杂的流程不同风险等级可以有不同要求。低风险、可逆动作小额退款、只读查询、临时低权限操作、对既有目标的有限动作可以依据本地预授权、固定额度、短有效期自动执行中风险动作可以要求 SaaS Policy、本地 Policy、单人审批、明确 Intent 绑定高风险、不可逆动作则要求多源状态、多角色审批、独立本地限制、最终参数确认、设备级执行证明。关键不是所有动作都最严格而是每个风险等级都必须有明确、固定的收敛规则绝不能在运行时临时寻找更宽松的路径。分级是为了可用性固定是为了安全——两者并不矛盾矛盾的是运行时自由挑选等级。十八、策略收敛真正限制的是单点权力从表面看策略收敛是在计算最低额度、最短时间、最小目标集合、最少执行次数。但它更深层的作用是防止任何一个 Policy 来源单独扩大真实执行能力。SaaS 即使被接管也不能突破本地限制本地管理员即使误配也不能忽略组织冻结审批人即使被诱导也不能改变最终参数风险模型即使漏报也不能取消额度与目标限制执行设备即使严格执行也不能把一个 Payload 自动解释成正确业务意图。每一层都有限每一层都可能错但没有一层可以单独把自己的错误变成整个系统的错误。所以多策略这个词与其理解成多个裁判竞争权威不如理解成多条边界共同围出一个有限区域。SaaS 说组织已冻结不能执行本地说额度最多 50,000审批人说我只同意向 A 支付 30,000执行边界说最终参数必须与 Intent H1 完全一致——这不是四个裁判在争而是四条边界在围。只有落在这个区域内的动作才具备执行资格。裁判是在比谁说了算边界是在比谁的限制更严。安全需要的是后者。十九、结语安全不来自 Policy 的数量而来自边界的交集增加 Policy 很容易——增加一条规则、一个审批节点、一个风险模型、一套本地限制都能让架构图看起来更完整。但如果系统没有定义这些 Policy 如何相互作用那么更多策略也可能意味着更多冲突、更多例外、更多回退路径、更多可供挑选的放行来源、更多能够被重新解释的ALLOW。真正安全的系统不会把多个 Policy 当成多个独立通行证。它会要求这些 Policy 判断同一个 Intent、提出明确限制、保留来源和版本、在各自职责内独立约束、不允许单点取消其他来源的必要限制、在冲突和缺失时向更严格方向收缩、最终形成一个具体、有限、可验证的执行范围。多策略不是终点只是策略安全的原材料只有完成收敛这些判断才会从多个意见变成一条真实边界。Policy 不是神谕。多策略只有在共同缩小可执行空间时才构成安全否则它们只是为系统提供了更多可以说允许的声音。一个只会累加允许的系统加的不是防线是入口。本文是「Policy 不是神谕」系列第七篇也是第四阶段建立策略收敛机制的开篇。它回答了多策略为什么不天然安全并给出收敛的两个必要条件——来源独立与结果收缩。第八到十篇将把收敛落到冲突处理、边界互限与取更严格者的具体工程规则上。