简介:网络安全风险评估量化模型是信息安全领域的重要研究内容。这份来自《湖北工业大学学报》2014年的论文PDF,面向网络安全研究者、工程技术人员及高校学生,可作为风险评估方向的参考文献和专业指导;资源为单个PDF文件,大小154KB,已有358人学习参考。论文系统梳理了《信息安全评估指南》中的基本模型以及PDCA、P2DR等量化模型,指出其抽象宏观、缺乏具体计算方法的不足,进而提出基于模糊数学的改进模型,通过建立风险因素集、评语集、权重集和模糊关系矩阵,结合模糊综合评估算法,可计算出风险发生概率、损失及风险综合值,并以“深圳神州通OA系统”为例进行了仿真验证。读者可据此掌握从风险识别、量化计算到结果评估的完整流程,对开展风险评估、安全加固或相关课题研究均有实用价值。
1. 网络安全风险评估量化模型:为什么说漏洞定级不能拍脑袋
做安全评估的人大概都经历过这样的场景:扫描器报了一个高危漏洞,但业务方问"这个漏洞到底会对我们系统造成多大损失",你只能给出"比较严重"这种模糊回答。这篇《网络安全风险评估量化模型的研究》给出的思路,是把威胁频率、脆弱程度、资产价值这类没法直接量化的要素,通过模糊综合评价算法转成可计算的数值,最后落成一个风险综合值。论文篇幅不长,但把评估流程拆得很清楚:先定风险因素集和评语集,再建权重和判断矩阵,最后用合成算子算出风险值。对做渗透测试、等保测评、安全运营的人来说,这是一套可以落地到脚本里的计算框架,不是停留在概念层的理论描述。
2. 模糊综合评价算法:五步流程与矩阵计算的完整拆解
2.1 为什么风险评估要用模糊数学而不是简单打分
风险评估里大量指标都是"高、中、低"这种语义化描述。比如"SQL注入漏洞的利用难度",你很难说它精确等于3.2分还是3.5分,更合理的表达是"利用难度低"的隶属度是0.3,"利用难度中"的隶属度是0.6。这正是模糊数学的适用场景——处理边界模糊、不易定量计算的描述性信息。
常见的安全评分卡做法是给每项打1到5分再加权求和,但这个方法有个硬伤:打分的人对"4分"和"5分"的界限没有统一认知,不同人打出来的分数方差极大。模糊综合评价把"打分"换成了"隶属度分布",比如某个因素的评估结果是"低0.1、中低0.25、中0.45、高0.2",这比单点分数承载了更多信息,也更容易让多方评估者达成一致。
2.2 五步流程拆解:论域、评语集、权重、判断矩阵、合成算子
论文里把模糊综合评价算法拆成了五个步骤,每个步骤都有明确的数学定义。
第一步是选定两个集合:风险因素集U和风险评语集V。风险因素集就是你要评估哪些维度,比如威胁发生频率、脆弱性严重程度、资产价值、安全措施有效性。风险评语集就是评估结果的粒度,比如"低、中低、中、高"或"很低、低、中、高、很高"。评语集的粒度直接决定最终输出精度,建议用四级或五级,太少区分度不够,太多打分难度剧增。
第二步是建立权重集W,记为W={w1, w2, ..., wn},要求每个wi都大于等于0,且所有wi之和等于1。这一步是整个算法里最容易被质疑的地方,因为权重本质上来自评估者的主观判断。实际操作中通常用层次分析法或多人背靠背打分取均值来确定,而不是某一个人说了算。
第三步是构建判断矩阵R。把U中每个因素单独拿出来,根据它对各个评语的隶属程度建立模糊关系,得到一个m行n列的矩阵R=(rij)。其中rij表示第i个因素属于第j个评语的程度。这一行的数据来源可以是历史统计、扫描结果或专家经验,后面落地时我会重点说这块。
第四步是模糊合成运算。用权重向量W与判断矩阵R做合成,得到评价向量B=W∘R。这里的"∘"表示模糊合成算子,常见有四类:主因素决定型M(∧,∨)、主因素突出型M(·,∨)、加权平均型M(·,+)。风险评估场景我推荐用加权平均型,也就是普通的矩阵乘法,这样每个因素都会对最终结果产生贡献。
第五步是结果判读。得到归一化后的评价向量B'后,有两种判断原则:最大隶属度原则是取值最大的评语作为最终结论,优点是直观;加权平均原则是按各评语的分值做加权平均,得到一个连续的风险值。论文原文里给出了公式P=∑b'*z,其中z是待定系数,值为1或2。实际应用中我会直接给评语集赋分,比如四级评语集赋值1、2、3、4,算出的风险值就是1到4之间的连续数。
2.3 最小可运行实现:Python版模糊综合评价
import numpy as np # 评语集 V,用离散分数表示,便于后续计算 levels = np.array([1, 2, 3, 4]) labels = ["低", "中低", "中", "高"] # 风险因素集 U 对应的权重集 W,四项之和必须为 1 W = np.array([0.25, 0.30, 0.30, 0.15]) # 判断矩阵 R:每行是一个因素,每列是一个评语 # 行必须归一化,即每行之和为 1 R = np.array([ [0.10, 0.25, 0.45, 0.20], # 威胁发生频率 [0.05, 0.20, 0.40, 0.35], # 脆弱性严重程度 [0.00, 0.10, 0.30, 0.60], # 资产价值 [0.20, 0.35, 0.35, 0.10], # 安全措施有效性 ]) # 加权平均型合成算子 M(·,+) B = W @ R B_norm = B / B.sum() # 最大隶属度原则 max_idx = np.argmax(B_norm) print(f"最大隶属度判定: {labels[max_idx]}") # 加权平均原则,得到连续风险值 risk_score = np.dot(B_norm, levels) print(f"风险综合值: {risk_score:.2f}")这段代码完整复现了论文里的五步流程。W是权重集,要求所有元素非负且和为1;R是判断矩阵,每一行代表一个评估因素在不同评语上的隶属度分布,每一行加起来应该等于1;W @ R就是模糊合成运算,得到初始评价向量,再归一化得到B'。最后两个输出分别对应论文里的两种判断原则:最大隶属度给出离散等级,加权平均给出连续分值。
实际使用时需要注意,这段代码里的W和R都是拍脑袋写的示例值。权重集W应该通过层次分析法或多人打分确定,判断矩阵R的每一行要有数据支撑,这两点在第五章会专门展开。
3. 从PDCA/P2DR到改进模型:风险值参数的逐层拆解
3.1 传统量化模型的通病:要素抽象、没有具体算法
论文里点名的传统量化模型主要是PDCA量化模型和P2DR量化模型。PDCA强调的是Plan-Do-Check-Act循环,适合做安全管理流程,但对风险值怎么算没有给出算法级描述。P2DR是Policy-Protection-Detection-Response的缩写,更关注安全策略、保护、检测和响应四个环节的闭环,同样停留在模型框架层面。
这两个模型的共性是:都画得出架构图,但落到"风险到底多少分"这个问题上,都没有给出可操作的数学计算过程。《信息安全评估指南》给出了基础量化模型,但论文指出这个模型"比较宏观、停留在抽象理论层面",没说明如何计算风险发生可能性、如何衡量风险影响值。这就是改进模型的切入点。
3.2 风险值公式怎么读:可能性与损失分离计算
论文给出的风险计算范式是:
风险值 = R(A, T, V) = R(L(T, V), F(Ia, Va))
拆开看,R是安全风险计算函数,A是资产,T是威胁,V是脆弱性,Ia是资产价值,Va是脆弱性严重程度。L(T, V)表示安全事件发生的可能性,由威胁和脆弱性共同决定;F(Ia, Va)表示安全事件发生后的损失,由资产价值和脆弱性严重程度共同决定。最终的风险值是这两个中间结果的函数。
这个公式的价值在于把风险拆成了两个独立的计算路径。可能性是攻击侧的评估,看威胁能力加脆弱性是否容易被利用;损失是资产侧的评估,看业务重要性加脆弱性会造成多大影响。两者相乘或组合得到最终风险值。如果只评估可能性不评估损失,就会把无关紧要的系统的漏洞打得过高;只评估损失不评估可能性,又容易忽略那些攻击路径顺畅的隐患。
3.3 改进模型的细化维度:威胁频率、脆弱程度、影响等级系数
论文提出的改进模型把这个基础范式再次细化。图2给出的总体框架包含这几个关键要素:重要信息识别、威胁行为分析、威胁发生频率、脆弱程度、风险影响分析、影响等级系数、安全措施、风险发生值、风险综合值。
相比基础模型,改进的地方在于把"安全事件的可能性"细化为"威胁发生频率"和"脆弱程度"两个可量化维度;把"安全事件损失"细化为"影响等级系数"和"资产价值"。"安全措施"作为一个独立要素参与计算,意味着已有的防护手段会直接降低风险值,这比传统模型更符合实际——同样一个漏洞,在有WAF和没有WAF的系统上,风险显然不同。
下面是改进模型各要素的说明表:
| 要素 | 计算路径 | 数据来源示例 | 对风险值的影响方向 |
|---|---|---|---|
| 威胁发生频率 | 进入风险发生值 | 安全设备告警日志、威胁情报 | 频率越高,风险值越大 |
| 脆弱程度 | 进入风险发生值 | 漏洞扫描、渗透测试报告 | 程度越严重,风险值越大 |
| 资产价值 | 进入风险影响分析 | 业务分级、数据敏感度 | 价值越高,损失越大 |
| 影响等级系数 | 调节风险影响值 | 事件对业务影响评估 | 系数越大,风险值越大 |
| 安全措施 | 降低综合风险值 | 安全设备有效性、基线核查 | 措施越有效,风险值越小 |
这套细化逻辑的实际意义是让每个参数都能找到具体的证据来源。告警日志能支撑威胁频率,扫描报告能支撑脆弱程度,业务访谈能支撑资产价值。每个参数都不是评估者空想出来的,这是它比早期抽象模型更适合落地的根本原因。
4. 完整复现:用Python算出OA系统的风险综合值
4.1 评估目标与数据准备
论文最后一章以深圳神州通OA系统为例进行了仿真验证,证明模型具备可操作性和实用性。这里我用一个代表性场景完整复现计算过程:某企业OA系统,承载审批流程、公文管理和人事信息,属于核心业务系统。评估目标是算出该系统的风险综合值,产出风险等级结论。
数据准备阶段,需要先确定风险因素集U和评语集V。评语集沿用四级:"低、中低、中、高",赋值1到4分。风险因素集U取四个维度:威胁发生频率、脆弱性严重程度、资产价值、安全措施有效性。权重集W通过管理层、安全工程师、系统运维三方背靠背打分取均值,最终确定威胁频率权重0.25、脆弱性权重0.30、资产价值权重0.30、安全措施权重0.15。判断矩阵R来自多方数据融合:
| 因素 | 权重 | 隶属度分布(低/中低/中/高) | 数据依据 |
|---|---|---|---|
| 威胁发生频率 | 0.25 | [0.10, 0.25, 0.45, 0.20] | 近3个月IDS告警与威胁情报 |
| 脆弱性严重程度 | 0.30 | [0.05, 0.20, 0.40, 0.35] | 漏洞扫描存在中危漏洞 |
| 资产价值 | 0.30 | [0.00, 0.10, 0.30, 0.60] | 核心业务,影响面覆盖全员 |
| 安全措施有效性 | 0.15 | [0.20, 0.35, 0.35, 0.10] | 有WAF但规则未完整覆盖 |
4.2 代码实现:权重、隶属度与合成计算
import numpy as np # 一、定义评语集赋值与标签 levels = np.array([1.0, 2.0, 3.0, 4.0]) labels = ["低", "中低", "中", "高"] # 二、权重集 W:来自三方打分均值,四项之和为 1 W = np.array([0.25, 0.30, 0.30, 0.15]) # 三、判断矩阵 R:每行为一个因素在各评语上的隶属度 # 每行之和必须约等于 1,否则后续合成结果会失真 R = np.array([ [0.10, 0.25, 0.45, 0.20], # 威胁发生频率 [0.05, 0.20, 0.40, 0.35], # 脆弱性严重程度 [0.00, 0.10, 0.30, 0.60], # 资产价值 [0.20, 0.35, 0.35, 0.10], # 安全措施有效性 ]) # 四、模糊合成,加权平均型算子 B = W @ R # 归一化,确保评价向量之和为 1 B_norm = B / np.sum(B) print("归一化评价向量:", np.round(B_norm, 4)) # 五、两种判读方式 # 最大隶属度原则:取最大分量的评语作为结论 max_level = labels[np.argmax(B_norm)] print("最大隶属度判定结果:", max_level) # 加权平均原则:得到连续风险综合值 risk_value = float(np.dot(B_norm, levels)) print("风险综合值: {:.2f}".format(risk_value))这段代码把论文里的五步计算完整跑了一遍。权重集W的三项约束——非负、和为1、来源可追溯,是权重设计的关键。判断矩阵R的每一行都对应一个因素的证据链,比如威胁频率这一行偏向"中"和"高",是因为IDS近三个月确实捕获了多起扫描和探测行为。归一化评价向量B_norm表示最终评估结果在各风险等级上的分布比例,而风险综合值1到4之间的连续数则方便横向对比不同系统。
4.3 结果解读与参数敏感性分析
在给定数据下,归一化评价向量约为[0.073, 0.198, 0.378, 0.351],最大隶属度落在"中",但"高"的隶属度也达到了0.351,说明风险等级处于中高危边缘。加权平均原则算出的风险综合值约为3.01分,对应"中高"偏上的水平。这个结果对管理层的表述是:OA系统整体风险处于中高水平,主要贡献来自资产价值高和脆弱性偏严重。
这里能体现模型价值的一个操作是参数敏感性分析。如果安全团队部署了Web应用防火墙并完善了访问控制策略,威胁频率的隶属度可能从[0.10, 0.25, 0.45, 0.20]改善为[0.25, 0.35, 0.30, 0.10],安全措施有效性从[0.20, 0.35, 0.35, 0.10]改善为[0.35, 0.40, 0.20, 0.05]。重新运行计算,风险综合值会下降到2.5分左右。这意味着模型可以直接用来评估安全投入的效果,而不是等事件发生后才事后复盘。
5. 落地避坑:隶属度、归一化与数据来源的五个典型问题
5.1 判断矩阵行没归一化,评价向量直接失真
现象:算出来的评价向量各项之和明显偏离1,最大隶属度指向的等级和加权平均分对不上。
原因:判断矩阵R中某些行的隶属度是多人打分后直接拼接的,没有按行做归一化。比如某专家给出了"中0.5、高0.5",另一专家给出了"低0.3、中低0.2、中0.4、高0.1",直接取平均后该行总和变成了1.05或0.95。
解决:任何判断矩阵在参与计算前都要执行R = R / R.sum(axis=1, keepdims=True),并且把归一化结果纳入评审环节。我一般会在代码里加一个断言,assert np.allclose(R.sum(axis=1), 1.0),不满足就直接报错,避免带病数据进入下一步。
5.2 权重集不满足和为1,风险值上下界漂移
现象:同一个评估对象换了权重组合后,风险综合值从2.2跳到3.8,结论从"中低"变成"高"。
原因:权重集W的设定没走正规流程,某个人直接给了[0.3, 0.4, 0.4, 0.2]这类未归一化的数值,总和不是1。在矩阵乘法中,权重向量若没有归一化,合成结果会被整体放大或缩小,导致风险值超出评语集的赋值范围。
解决:权重必须满足每个wi都大于等于0且求和等于1。更严格的做法是在确定权重时就做一致性校验,比如用层次分析法计算一致性比率CR,CR小于0.1才接受这组权重。对已有数据,补救手段是执行W = W / W.sum(),但更建议重新走权重评审。
5.3 评语集粒度不统一,不同系统间无法横向对比
现象:A系统用"很低、低、中、高、很高"五级评语集,B系统用"低、中、高"三级评语集,最终风险值一个是3.8分制一个是2.2分制,没法放进同一张对比表。
原因:评估人员各自按习惯定义评语集,没有在评估项目启动前统一标准。
解决:在评估范围确定时就固定评语集,建议统一采用四级或五级,并且给每个等级写定性描述。比如"高"的定义是"造成核心业务中断、直接经济损失或严重数据泄露",这样不同评估人员做判断时有共同参照。
5.4 隶属度完全靠专家拍脑袋,评估结果不可复现
现象:两份由不同评估团队做的报告,对同一系统的风险评估值差异巨大,公司管理层质疑评估结论的客观性。
原因:隶属度数据没有来源支撑。有的团队对"威胁频率"给出[0.2, 0.3, 0.3, 0.2],有的给出[0.0, 0.1, 0.4, 0.5],差异来自评估者个人经验而非客观证据。
解决:优先用环境证据替代主观打分。威胁频率看IDS/IPS告警统计、Web访问日志中的扫描探测行为;脆弱性看漏洞扫描器的CVSS分值和可利用性;资产价值看业务分级文档和数据敏感度标签。没有日志或扫描数据支撑的隶属度,一律标注"待确认"并单独列出。
5.5 合成算子选错,多因素评估变成单因素决定
现象:用主因素决定型算子M(∧,∨)计算时,风险评价结果只反映权重最大或隶属度最突出的那个因素,其他因素完全不起作用。
原因:论文公式里的"∘"符号没有说明具体算子类型,部分实现者用了取小取大逻辑。比如某个系统资产价值极高但威胁频率很低,主因素决定型会直接得出"高"风险,忽略了低威胁频率的实际情况。
解决:风险评估场景一律采用加权平均型算子M(·,+),也就是普通矩阵乘法。每个评估因素都按其权重对结果做贡献,权重越小影响越小但不会被彻底忽略。这是模糊综合评价在风险评估中使用最广泛的做法,其他算子更适合做模式识别。
6. 进阶:把量化模型接到漏洞定级与流量检测场景
6.1 与SRC漏洞定级的衔接:CVSS评分与模糊评价融合
现在很多从业者在SRC漏洞挖洞平台提交漏洞时,会纠结危害定级怎么支撑。CVSS v3给的是0到10的基础分,但它衡量的是漏洞本身的属性,没有把资产环境放进去。这里可以把量化模型和CVSS打通:把CVSS的利用复杂度、攻击向量作为"脆弱性严重程度"的隶属度参考,把目标系统的资产价值、是否核心业务、是否有安全措施作为独立维度,最后算出环境风险值。比如同一个RCE漏洞,在公网核心业务系统上算出来风险值可能是3.6,在隔离的内网测试机上可能只有1.8,提交漏洞报告时用这个数值说话,比单纯贴CVSS分数有说服力得多。
6.2 与恶意流量检测的衔接:把模型输出概率翻译成风险值
现在有damo-yolo这类目标检测模型在恶意流量可视化检测里的应用,输出的是流量截图中的目标类别和置信度。但置信度回答的是"目标存在吗",业务方真正关心的是"这个异常对核心业务风险有多大"。我一般会把检测模型的置信度当作"威胁发生可能性"的隶属度输入,再结合资产价值和脆弱性,用这套量化模型算出统一风险值。这样安全运营看板上的数据就是业务方和管理层都能理解的0到4分风险值,而不是一堆模型阈值和置信度分数。从那以后,我每次接到评估任务都会强制走一遍这个流程:先确立评语集和权重,再收集支撑数据,每行归一化,最后做敏感性分析。这套框架救我很多次,希望帮到你。
本文还有配套的精品资源,点击获取