| name | implementing-purdue-model-network-segmentation |
| description | 基于Purdue企业参考架构(PERA)模型实施网络隔离,将工业控制系统网络划分为从0级物理过程到5级企业的层次化安全区域,在OT和IT域之间强制执行严格的流量控制。
|
| domain | cybersecurity |
| subdomain | ot-ics-security |
| tags | ["ot-security","ics","purdue-model","network-segmentation","iec62443","defense-in-depth","dmz","scada"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
实施Purdue模型网络隔离
适用场景
- 为ICS/SCADA环境设计或改造网络架构时
- 在棕地工厂中实施IEC 62443区域和通道要求时
- 创建IT/OT DMZ(3.5级)以控制企业网络和控制网络之间的数据流时
- 修复有关OT网络扁平化或IT到OT直接连接的审计发现时
- 在收购或合并后对融合的IT/OT网络进行隔离时
不适用于单个Purdue级别内的微隔离(参见implementing-zone-conduit-model-for-ics)、没有传统ICS网络的云原生环境,或纯IT环境中的网络隔离。
前置条件
- 包含每台设备Purdue级别分类的完整OT资产清单
- 显示当前拓扑、VLAN和防火墙位置的网络架构图
- 具备OT协议深度包检测(DPI)能力的工业防火墙(Palo Alto、Fortinet、Cisco)
- 了解Purdue级别之间所需的数据流(历史服务器复制、远程访问、补丁分发)
- 工厂运营部门对网络变更的变更管理审批
工作流程
步骤 1:将当前架构映射到Purdue级别
按照Purdue模型层次结构对所有网络资产和数据流进行分类。
"""Purdue模型网络隔离规划器。
将现有OT/IT网络资产映射到Purdue模型级别,并生成
包括防火墙规则和VLAN分配的隔离建议。
"""
import json
import csv
import sys
from collections import defaultdict
from datetime import datetime
from typing import Dict, List
PURDUE_LEVELS = {
0: {
"name": "物理过程",
"description": "传感器、执行器、现场仪器",
"typical_devices": ["传感器", "执行器", "驱动器", "电机启动器"],
"vlan_range": "100-109",
"allowed_protocols": ["HART", "Profibus", "Foundation Fieldbus", "IO-Link"],
},
1: {
"name": "基本控制",
"description": "PLC、RTU、安全控制器",
"typical_devices": ["PLC", "RTU", "安全控制器", "DCS控制器"],
"vlan_range": "110-119",
"allowed_protocols": ["EtherNet/IP", "Profinet", "Modbus/TCP", "S7comm", "OPC UA"],
},
2: {
"name": ,
: ,
: [, , , ],
: ,
: [, , , , ],
},
: {
: ,
: ,
: [, , , ],
: ,
: [, , , ],
},
: {
: ,
: ,
: [, , , , ],
: ,
: [, , , ],
},
: {
: ,
: ,
: [, , , ],
: ,
: [, , , ],
},
: {
: ,
: ,
: [, , ],
: ,
: [, ],
},
}
:
():
.assets = []
.data_flows = []
.firewall_rules = []
():
(filepath, ) f:
.assets = (csv.DictReader(f))
()
():
classification = defaultdict()
asset .assets:
level = asset.get(, )
:
level = (level)
(ValueError, TypeError):
level = ._infer_purdue_level(asset)
classification[level].append(asset)
asset[] = level
classification
() -> :
device_type = asset.get(, ).lower()
mapping = {
: , : , : ,
: , : , : , : ,
: , : , : ,
: , : , : ,
: , : , : ,
: , : , : ,
}
keyword, level mapping.items():
keyword device_type:
level
-
() -> :
vlan_plan = []
level, info PURDUE_LEVELS.items():
assets_at_level = classification.get(level, [])
vlan_plan.append({
: level,
: info[],
: info[],
: (assets_at_level),
: info[],
})
vlan_plan
() -> :
rules = [
{
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
},
{
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
},
{
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
},
{
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
},
{
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
},
{
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
},
{
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
},
{
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
},
{
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
},
]
.firewall_rules = rules
rules
():
()
()
()
()
vlan_plan = .generate_vlan_plan(classification)
()
v vlan_plan:
()
()
()
()
()
rules = .generate_firewall_rules()
rule rules:
action_symbol = rule[] ==
()
()
()
()
__name__ == :
planner = PurdueSegmentationPlanner()
(sys.argv) >= :
planner.load_asset_inventory(sys.argv[])
classification = planner.classify_assets()
planner.print_segmentation_plan(classification)
步骤 2:配置工业DMZ(3.5级)
DMZ是IT和OT之间的关键边界。所有数据交换必须通过它进行——不允许直接连接。
dmz_architecture:
zone_name: "IT_OT_DMZ"
purdue_level: 3.5
vlan: 150
components:
historian_replica:
purpose: "OT历史服务器数据的只读副本,供IT/业务访问"
direction: "OT将数据推送到DMZ(单向)"
ip: "10.10.150.10"
services:
- port: 1433
protocol: "SQL"
direction: "仅接受来自3级历史服务器的入站"
- port: 443
protocol: "HTTPS"
direction: "出站到4级供IT消费者访问"
jump_server:
purpose: "OT维护的受控远程访问点"
ip: "10.10.150.20"
services:
- port: 3389
protocol: "RDP"
direction: "接受来自4级并需要MFA的入站"
- port: 3389
protocol: "RDP"
direction: "仅出站到2级HMI"
security_controls:
核心概念
| 术语 | 定义 |
|---|
| Purdue模型(PERA) | 按功能和信任度将工业网络组织为0-5级的层次化参考架构 |
| 3.5级DMZ | IT(4级)和OT(3级)之间的隔离区,所有跨边界数据交换在此发生 |
| 纵深防御(Defense in Depth) | 分层安全方法,要求攻击者突破多个边界才能到达关键控制系统 |
| 数据二极管(Data Diode) | 硬件强制执行的单向通信设备,确保数据只能从OT流向IT,不能反向 |
| 区域(Zone) | 按IEC 62443定义的,共享相同安全要求的资产逻辑分组 |
| 通道(Conduit) | 区域之间具有定义安全策略的受控通信路径 |
常见场景
场景:扁平OT网络修复
背景:审计发现企业IT系统可以直接与控制网络上的PLC通信。IT和OT之间没有DMZ,也没有防火墙。
方法:
- 执行全面流量分析,识别所有跨越IT/OT边界的合法数据流
- 设计包含历史服务器副本、跳板服务器和补丁暂存的DMZ架构
- 在IT和DMZ之间部署工业防火墙(北向防火墙),在DMZ和OT之间部署防火墙(南向防火墙)
- 逐一迁移数据流:从通过DMZ的历史服务器复制开始
- 为远程访问实施跳板服务器,逐步废弃直接RDP访问OT系统
- 迁移所有流量通过DMZ后,在北向防火墙阻断直接IT到OT的流量
- 通过来自IT网络的渗透测试验证,确认没有直接到达1级控制器的路径
注意事项:不要一次性切换所有流量——逐个迁移数据流并制定回滚计划。旧版OT系统可能使用无法通过执行DPI的防火墙的协议;先在实验室彻底测试。在活跃生产环境中部署DMZ时,必须在商定的维护窗口内进行。
输出格式
PURDUE模型隔离报告
====================================
评估日期: YYYY-MM-DD
设施: [工厂名称]
当前状态:
网络类型: [扁平/部分隔离/完全隔离]
IT-OT边界: [无/防火墙/双防火墙DMZ]
直接IT到PLC路径: [数量]
推荐架构:
0-1级: VLAN 110(控制网络)
2级: VLAN 120(监控网络)
3级: VLAN 130(运营网络)
3.5级: VLAN 150(IT/OT DMZ)
4-5级: VLAN 200+(企业)
DMZ组件:
- 历史服务器副本
- 跳板服务器(启用MFA)
- 补丁暂存服务器
- AV中继服务器
防火墙规则: 已生成 [数量] 条规则
迁移步骤: 已规划 [数量] 个阶段