MCM520 ← 资料站首页 Cyber Strong? 预算约束下的防御投资优化 打开交互阅读器 →

Cyber Strong? 预算约束下的防御投资优化

摘要

ICM 2025 F 题要求在网络安全的「强健度(cyber strong)」框架下,于预算与合规约束下优化防御资源配置。本文是第二篇,承接第一篇的评估模型,正面回答「下一笔钱该花在哪」这一决策问题。把组织抽象为 10 类资产、7 类威胁、10 项防御控制构成的网络(资产关键性合计 1.0、威胁年概率与攻击面各异、控制有成本与缓解效力),我们在总预算 B=50 内对全部 2^10=1024 个控制子集做可行性枚举,得到 598 个成本不超限的可行组合;在其上抽取 46 点帕累托前沿(成本 vs 可达最大 Cyber Strong 指数 CS),并以单位成本边际增益 ROI=ΔCS/成本刻画出「性价比最高的一笔钱」——网络微隔离 C3 的 ROI 高达 0.0219,居所有控制之首(ΔCS=0.307、成本 14),远高于 WAF(0.0129)、补丁管理(0.0102)等。

进一步,我们采用熵权法 + TOPSIS 多目标评价,在 (CS、性价比 CS/成本、成熟度 M、保护率 P) 四个准则上对 598 个组合排序,得到准则权重 w=[0.271, 0.146, 0.205, 0.379](保护率 P 权重最高,呼应业务连续性关切),并推荐组合 C1,C10,C3,C4,C6,C8(成本 49、CS=0.785、M=0.600、P=0.843、A=0.839、R=0.800)。TOPSIS 前三贴近度分别为 0.778 / 0.769 / 0.767,彼此极接近,说明在预算刚性下「选哪几个」存在多个近似等优解,但「不选 C3」的方案明显掉队。本文给出从评估到投资的完整可复现链路:评估是尺子,优化是用法。

图1 投资优化框架

一、问题重述

第一篇把「网络强不强」变成了可计算、可分解的 CS 指数,但评估只告诉我们「现在有多弱」,没有告诉我们「怎么变强最划算」。赛题真正要求的是在资源受限下做最优配置——这恰是网络安全投资的日常困境:安全预算永远不够,而控制项清单却越来越长。决策者面对的不是「要不要做安全」,而是「十项控制里先买哪几项、钱花到哪一步收手」。本文要回答三个递进问题:① 在预算 B=50 内能凑出多少种防御组合,其中哪些在「成本—强健度」上无法被改进(帕累托最优)?② 单看「每多投一块钱能换多少 CS」,哪一笔性价比最高?③ 若同时兼顾 CS、性价比、成熟度、保护率四个目标,综合最优的组合是什么?把这三个问题串起来,评估框架才从「仪表盘」升级为「决策引擎」。安全投资最忌讳的就是「别人上什么我上什么」的清单式采购,本文的优化模型正是为打破这种惯性提供量化依据。

二、假设与符号

沿用第一篇的合成中型关键基础设施组织:资产集合 AA(10 类,关键性权重 cic_i 合计 1.0),威胁集合 TT(7 类,年概率 pkp_k、攻击面 Tk\mathcal{T}_k),控制集合 CC(10 项,对各威胁缓解效力 ecke_{ck}、成本 κc\kappa_c)。在位控制 SS,CS 四分量与综合指数定义同第一篇。新增决策变量与约束:

  • 决策:选择子集 S⊆CS\subseteq C,使综合 CS 最大化;
  • 预算约束:∑c∈Sκc≤B\sum_{c\in S}\kappa_c\le B,B=50B=50;
  • 可行组合:满足预算的全部子集;
  • 帕累托前沿:在 (成本, 最大可达 CS) 平面上,不存在另一组合在成本不增加的同时 CS 更高;
  • 性价比 ROI:控制 cc 相对基线的边际增益 ΔCSc=CS(S0∪{c})−CS(S0)\Delta\mathrm{CS}_c=\mathrm{CS}(S_0\cup\{c\})-\mathrm{CS}(S_0) 除以其成本 κc\kappa_c,其中 S0S_0 为基线 4 项;
  • 多目标准则:方案向量 Xi=(CS, CS/成本, M, P)X_i=(\mathrm{CS},\ \mathrm{CS}/成本,\ M,\ P),全部为效益型。

基线 S0={C1 MFA, C2 EDR, C8 备份灾备, C10 安全培训}S_0=\{\text{C1 MFA, C2 EDR, C8 备份灾备, C10 安全培训}\},CS=0.440;全控制 CS=0.970 作为上界参照。

三、模型:组合枚举—帕累托—ROI—熵权 TOPSIS

3.1 可行组合枚举与帕累托前沿

直接枚举全部 210=10242^{10}=1024 个子集,剔除成本超预算者,余下即为可行组合(图 2 灰点为全部可行解)。由于 CS 关于子集单调不减(加控制不降分),对每个成本档位取该档位的最高 CS,便得到帕累托前沿(图 2 红点、图 3 折线)。前沿点的数量与形态刻画了「钱能买到多少强健度」的上限曲线。

图2 可行组合成本—强健度散点

图3 帕累托前沿

3.2 单位成本边际增益(ROI)

ROI 把「该不该上某项控制」还原成最朴素的性价比问题:相对基线,加入控制 cc 能多换多少 CS、要花多少钱。图 4 按 ROI 降序排列,红柱为 ROI≥0.02 的高性价比控制。这里出现一个关键反直觉:基线已含的 4 项控制(C1/C2/C8/C10)其「相对基线的 ΔCS」为 0、ROI 为 0——因为它们早已在位,再算边际增益自然是零;真正决定性价比的是「尚未部署、且降压明显」的控制。

图4 各控制 ROI

3.3 熵权法 + TOPSIS 多目标排序

单一 ROI 只看「边际」,忽略了组合整体与各分量平衡。我们构造方案向量 Xi=(CS, CS/成本, M, P)X_i=(\mathrm{CS},\ \mathrm{CS}/成本,\ M,\ P),先用熵权法根据各准则在 598 个组合中的离散程度自动赋权(差异越大权重越高),得 w=[0.271, 0.146, 0.205, 0.379];再用 TOPSIS 计算各组合与正理想解、负理想解的相对贴近度(越大越优),给出综合排名。熵权法免去主观拍权重,使「该看重 CS 还是性价比」由数据自身说话——结果中 P 的权重最高(0.379),与业务连续性目标天然一致。

图5 四分量对比

四、结果与分析

4.1 预算 B=50 下的解空间

基线 CS=0.440,全控制上界 CS=0.970。在 B=50 内枚举得到 598 个可行组合,其上界帕累托前沿共 46 点。前沿的「膝点(knee)」位于 (成本=4, CS=0.134)——即仅用 4 单位成本(恰为最便宜的安全培训 C10)就能把 CS 从 0.440 抬到 0.574 的边际拐点;这提示预算极紧张时,先补最便宜的一两项往往增益最大。但膝点只是曲线几何拐点,并非综合最优,真正的最优需结合多目标评价。

图6 预算敏感度

4.2 ROI 揭示:网络微隔离是性价比之王

各控制 ROI 排序(图 4)清晰地给出「下一笔钱花哪」的贪心指引:C3 网络微隔离 ROI=0.0219(ΔCS=0.307、成本 14)居首;其后依次为 C5 WAF(0.0129,ΔCS=0.117、成本 9)、C6 补丁管理(0.0102,ΔCS=0.061、成本 6)、C7 SIEM(0.0085,ΔCS=0.093、成本 11)、C4 邮件网关(0.0084,ΔCS=0.042、成本 5);C9 零信任(0.0039)垫底。基线已含的 C1/C2/C8/C10 的 ROI 均为 0——它们的价值已沉淀在基线里,不是「增量」。这与第一篇「基线偏科、网络层与供应链侧薄弱」的诊断完全吻合:C3 微隔离正是补齐横向移动短板、把关键资产暴露率从 0.601 大幅压低的关键一招。

4.3 综合最优组合

熵权 TOPSIS 在四准则上平衡后得到推荐组合 C1,C10,C3,C4,C6,C8,成本 49、CS=0.785,四分量 M=0.600、P=0.843、A=0.839、R=0.800(图 5)。与基线(CS=0.440)相比,仅多投入约 15 单位成本(C3 微隔离 + C4 邮件网关 + C6 补丁管理三项增量),CS 即跃升 0.345——这正是「选对增量」的威力。图 5 可见推荐组合在 P(保护率)与 A(可用性)上已逼近全控制水平,说明钱花在了刀刃上。

图7 TOPSIS 前三贴近度

TOPSIS 前三贴近度分别为 0.778(C1,C10,C3,C4,C6,C8)、0.769(C10,C3,C4,C5,C6,C8)、0.767(C1,C10,C3,C4,C6,C7),彼此仅差 0.01 量级,说明在 B=50 刚性下存在多个近似等优解,但共同特征是必含 C3 微隔离。任何不含 C3 的组合贴近度明显掉队,从多目标角度再次确认了 ROI 的结论。图 7 直观对比了前三组合的贴近度。

4.4 贪心路径与预算敏感度

按 ROI 顺序逐个累加控制,得到贪心投资路径(图 8):CS 随累计成本单调上升,且在加入 C3 时出现最陡的一跳。预算敏感度(图 6)显示,给定更大预算时可达的最大 CS 沿上界曲线平滑抬升——B=50 时已能触及 0.785 量级的综合最优,再追加预算的边际增益递减,印证了第一篇「前三分之一投入产出比约为后三分之一四倍」的管理直觉。这条路径图可直接作为 CISO 的「分阶段投资路线图」:先用最便宜的几项打通拐点,再上微隔离完成质变,最后视余力补长尾。

图8 贪心投资路径

五、讨论

本模型将控制成本视为外生常数、未考虑采购的规模折扣或捆绑授权,也未建模控制间的协同溢出(如零信任同时降压多种横向移动,会使 C9 的真实 ROI 高于本文孤立测算)。枚举法在控制项增至数十项时会面临组合爆炸,需改用整数规划或遗传算法;但 10 项规模下 1024 子集暴力枚举既精确又可复现,是教学与决策原型的最优选择。熵权法对准则量纲敏感,本文四准则量纲差异不大(CS 与 P 为 0–1、性价比为 0–0.03、M 为 0–1),故未做归一化的稳健性已可接受;若引入更多量纲悬殊准则,应显式做向量归一。此外,本文未把「合规必须满足某项控制」作为硬约束,实际部署时应将其作为可行性过滤条件前置。

六、结论

  1. 在预算 B=50 内枚举得 598 个可行组合,帕累托前沿 46 点,膝点 (4, 0.134) 提示极紧预算下先补最便宜项增益最大。
  2. ROI 排序表明 C3 网络微隔离性价比最高(0.0219),基线已含的 4 项 ROI 为 0——增量价值来自「尚未部署且降压明显」的控制。
  3. 熵权法得准则权重 w=[0.271, 0.146, 0.205, 0.379](P 最高),TOPSIS 推荐组合 C1,C10,C3,C4,C6,C8(成本 49、CS=0.785、P=0.843),仅多投约 15 单位成本即把 CS 从 0.440 抬至 0.785。
  4. TOPSIS 前三贴近度 0.778/0.769/0.767 极接近且必含 C3,从多目标角度再次确认微隔离为关键增量;贪心路径与预算敏感度共同构成可落地的分阶段投资路线图。

参考文献

[1] ICM 2025 Problem F. Cyber Strong? COMAP, 2025.
[2] ISO/IEC 27001. Information Security Management. 2022.
[3] MITRE ATT&CK. Adversary Tactics and Techniques. https://attack.mitre.org.
[4] Hwang C. L., Yoon K. Multiple Attribute Decision Making: TOPSIS. 1981.
[5] Shannon C. E. A Mathematical Theory of Communication. 1948.(熵权法基础)
[6] 范文一:资产—威胁—防御网络 + Cyber Strong 评估(本系列)。
[7] 范文三:攻防博弈与威胁不确定性鲁棒策略(本系列,待续)。


附录:核心 Python 实现

下列代码复现本文关键结果:基线/全控制 CS、可行组合枚举、帕累托前沿与膝点、各控制 ROI、熵权 TOPSIS 推荐组合。运行需 tools/ 下的 gen_mcm2025f_data.py(共享引擎)。熵权法与 TOPSIS 函数内联以保证附录自洽、不依赖绘图模块。

import sys, os, math, itertools
_HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.abspath(os.path.join(_HERE, "..", "..", "..", "tools")))
import gen_mcm2025f_data as D

BUDGET = 50

def entropy_weight(X):
    n = len(X); m = len(X[0])
    colmax = [max(X[i][j] for i in range(n)) for j in range(m)]
    norm = [[(X[i][j] / colmax[j] if colmax[j] > 0 else 0.0) for j in range(m)]
            for i in range(n)]
    w = []
    for j in range(m):
        s = sum(norm[i][j] for i in range(n))
        if s <= 0:
            e = 1.0
        else:
            e = 0.0
            for i in range(n):
                if norm[i][j] > 0:
                    p = norm[i][j] / s
                    e -= p * math.log(p)
            e = e / math.log(n)
        w.append(1 - e)
    s = sum(w)
    return [x / s for x in w]

def topsis(X, w):
    n = len(X); m = len(X[0])
    sq = [math.sqrt(sum(X[i][j] ** 2 for i in range(n))) for j in range(m)]
    v = [[(X[i][j] / sq[j] if sq[j] > 0 else 0.0) for j in range(m)]
         for i in range(n)]
    vw = [[v[i][j] * w[j] for j in range(m)] for i in range(n)]
    best = [max(vw[i][j] for i in range(n)) for j in range(m)]
    worst = [min(vw[i][j] for i in range(n)) for j in range(m)]
    dpos = [math.sqrt(sum((vw[i][j] - best[j]) ** 2 for j in range(m)))
            for i in range(n)]
    dneg = [math.sqrt(sum((vw[i][j] - worst[j]) ** 2 for j in range(m)))
            for i in range(n)]
    return [dneg[i] / (dpos[i] + dneg[i]) for i in range(n)]

base_cs = D.cs_of(set(D.BASELINE))
full_cs = D.cs_of(set(D.CIDS))
print("基线 CS=%.3f  全控制 CS=%.3f  预算 B=%d" % (base_cs, full_cs, BUDGET))

feasible = D.enumerate_portfolios(max_cost=BUDGET)
print("可行组合数 = %d" % len(feasible))

fmap = {}
for s, cost, cs in feasible:
    fmap[cost] = max(fmap.get(cost, 0.0), cs)
frontier = sorted(fmap.items())
knee = max(frontier, key=lambda kv: kv[1] / kv[0])
print("帕累托前沿点数 = %d  膝点(成本,CS) = (%d, %.3f)"
      % (len(frontier), knee[0], knee[1]))

roi = []
for c in D.CIDS:
    marg = D.cs_of(set(D.BASELINE) | {c}) - base_cs
    roi.append((c, marg / D.C_BY_ID[c]["cost"], marg))
roi.sort(key=lambda x: -x[1])
print("ROI 排序(前3):")
for c, r, m in roi[:3]:
    print("  %s %s: ΔCS=%.3f 成本=%d ROI=%.4f"
          % (c, D.C_BY_ID[c]["name"], m, D.C_BY_ID[c]["cost"], r))

alts = feasible
X = []
for s, cost, cs in alts:
    comp = D.components(s)
    eff = cs / cost if cost > 0 else cs
    X.append([cs, eff, comp["M"], comp["P"]])
w = entropy_weight(X)
clo = topsis(X, w)
ranked = sorted(range(len(alts)), key=lambda i: -clo[i])
rec = alts[ranked[0]][0]
print("熵权 w = [%.3f, %.3f, %.3f, %.3f]" % (w[0], w[1], w[2], w[3]))
print("推荐组合: %s 成本=%d CS=%.3f"
      % (",".join(sorted(rec)), alts[ranked[0]][1], alts[ranked[0]][2]))
for i in ranked[:3]:
    print("  TOP%d %s 贴近度=%.3f" % (ranked.index(i) + 1,
          ",".join(sorted(alts[i][0])), clo[i]))