R2. 贝叶斯风险评估决策¶
案例来源: decision-security + pgmpy
决策类型: 风险优先级排序
方法论: 贝叶斯网络 + 因果推断
预计阅读时间: 13 分钟
1. 决策背景¶
业务场景¶
某企业面临复杂安全风险: - 风险类型:网络/数据/物理/合规 - 风险因素:20+ 相互关联 - 传统方法:风险矩阵 (静态/主观) - 问题:无法量化风险传播
决策目标¶
- 量化风险概率
- 识别关键风险路径
- 动态风险评估
- 优化缓解措施投资
2. 方法论:贝叶斯网络¶
网络结构¶
贝叶斯优势¶
- ✅ 处理不确定性
- ✅ 建模因果关系
- ✅ 更新后验概率
- ✅ 反事实推理
3. 模型实现¶
pgmpy 实现¶
from pgmpy.models import BayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
# 1. 定义网络结构
model = BayesianNetwork([
('Threat', 'Attack'),
('Vulnerability', 'Attack'),
('Attack', 'Breach'),
('Control', 'Breach'),
('Breach', 'Loss')
])
# 2. 定义条件概率分布 (CPD)
cpd_threat = TabularCPD(
variable='Threat',
variable_card=2,
values=[[0.7], [0.3]] # 低/高威胁概率
)
cpd_vulnerability = TabularCPD(
variable='Vulnerability',
variable_card=3,
values=[[0.2], [0.5], [0.3]] # 低/中/高
)
cpd_attack = TabularCPD(
variable='Attack',
variable_card=2,
values=[
[0.9, 0.7, 0.5, 0.3, 0.2, 0.1], # P(Attack|Threat,Vulnerability)
[0.1, 0.3, 0.5, 0.7, 0.8, 0.9]
],
evidence=['Threat', 'Vulnerability'],
evidence_card=[2, 3]
)
# 3. 添加 CPD 到模型
model.add_cpds(cpd_threat, cpd_vulnerability, cpd_attack)
# 4. 推理
inference = VariableElimination(model)
# 查询先验概率
prob_attack = inference.query(variables=['Attack'])
print(f"P(Attack) = {prob_attack.values[1]:.2%}")
# 查询后验概率 (观察到高威胁)
prob_attack_given_threat = inference.query(
variables=['Attack'],
evidence={'Threat': 1} # 高威胁
)
print(f"P(Attack|High Threat) = {prob_attack_given_threat.values[1]:.2%}")
风险传播模拟¶
def risk_propagation(threat_level, control_effectiveness):
"""
模拟风险传播
"""
# 更新证据
result = inference.query(
variables=['Loss'],
evidence={
'Threat': threat_level,
'Control': control_effectiveness
}
)
expected_loss = sum(
loss_value * prob
for loss_value, prob in zip(loss_outcomes, result.values)
)
return expected_loss
# 场景分析
scenarios = [
{'name': '基线', 'threat': 1, 'control': 1},
{'name': '威胁升级', 'threat': 2, 'control': 1},
{'name': '控制加强', 'threat': 1, 'control': 2},
{'name': '最坏情况', 'threat': 2, 'control': 0}
]
for scenario in scenarios:
loss = risk_propagation(
scenario['threat'],
scenario['control']
)
print(f"{scenario['name']}: 预期损失 = ¥{loss:,.0f}")
4. 决策结果¶
风险评估结果¶
| 风险路径 | 概率 | 影响 | 风险值 | 优先级 |
|---|---|---|---|---|
| 钓鱼→凭证泄露→数据泄露 | 15% | ¥50M | ¥7.5M | P0 |
| 漏洞→勒索软件→业务中断 | 8% | ¥100M | ¥8M | P0 |
| 内部威胁→数据窃取 | 5% | ¥30M | ¥1.5M | P1 |
| DDoS→服务中断 | 20% | ¥10M | ¥2M | P1 |
控制措施效果¶
| 控制措施 | 成本 | 风险减少 | ROI |
|---|---|---|---|
| 安全意识培训 | ¥0.5M | ¥3M | 500% |
| 多因素认证 | ¥1M | ¥5M | 400% |
| 漏洞管理 | ¥1.5M | ¥6M | 300% |
| 应急响应 | ¥2M | ¥4M | 100% |
业务影响¶
| 指标 | 实施前 | 实施后 | 改善 |
|---|---|---|---|
| 风险识别率 | 60% | 90% | +50% |
| 风险评估准确度 | ±40% | ±15% | -62% |
| 风险缓解 ROI | 150% | 320% | +113% |
| 风险事件数 | 25/年 | 10/年 | -60% |
5. 关键洞察¶
风险放大效应¶
最优投资策略¶
案例版本: v1.0 | 最后更新: 2026-06-03