| name | implementing-network-segmentation-for-ot |
| description | 本技能涵盖使用VLAN、工业防火墙、数据二极管和软件定义网络在运营技术(OT)环境中实施网络分段。内容包括基于Purdue模型的分段策略、在不中断运营的情况下从扁平网络迁移到分段架构、为工业协议深度包检测配置OT感知防火墙,以及通过流量分析验证分段有效性。
|
| domain | cybersecurity |
| subdomain | ot-ics-security |
| tags | ["ot-security","ics","scada","industrial-control","iec62443","network-segmentation","vlan"] |
| version | 1.0.0 |
| author | mahipal |
| license | Apache-2.0 |
为OT实施网络分段
适用场景
- OT安全评估发现Purdue层级之间没有分段的扁平网络
- 在完成风险评估(IEC 62443-3-2)后实施IEC 62443区域/管道架构
- 作为IT/OT融合安全举措的一部分分离IT和OT网络
- 在企业IT和OT之间部署DMZ以保护工业系统免受IT来源威胁
- 将安全仪表系统(SIS)与基本过程控制系统(BPCS)分离
不适用于无OT组件的纯IT微分段(参见implementing-zero-trust-in-cloud),或在未进行先期流量分析的情况下进行初始区域设计(先参见performing-ot-network-security-assessment)。
前置条件
- 来自被动监控的完整流量基线(最少2-4周的采集数据)
- 所有OT设备带Purdue层级分类的资产清单
- 支持VLAN和端口安全的工业级网络交换机
- OT感知防火墙(Cisco ISA-3000、Fortinet FortiGate Rugged、带OT Security的Palo Alto)
- 网络变更的维护窗口计划
- 运营管理层批准的回滚计划
工作流程
步骤 1:基于流量基线设计分段架构
使用流量基线设计VLAN和防火墙架构,在隔离区域的同时保留所有合法通信路径。
"""OT网络分段设计工具。
分析流量基线数据,生成带VLAN分配、
防火墙规则和迁移计划的分段设计。
"""
import json
import sys
from collections import defaultdict
from dataclasses import dataclass, field, asdict
from ipaddress import ip_address, ip_network
@dataclass
class VLANDesign:
vlan_id: int
name: str
purdue_level: str
subnet: str
gateway: str
description: str
devices: list = field(default_factory=list)
@dataclass
class FirewallRule:
rule_id: int
source_zone: str
source_ip: str
dest_zone: str
dest_ip: str
protocol: str
port: int
action: str
dpi_profile: str = ""
comment: str = ""
class SegmentationDesigner:
"""根据流量基线生成分段设计。"""
def __init__(self, baseline_file):
with open(baseline_file) as f:
self.baseline = json.load(f)
self.vlans = []
.rules = []
.rule_counter =
():
.vlans = [
VLANDesign(, , ,
, ,
),
VLANDesign(, , ,
, ,
),
VLANDesign(, , ,
, ,
),
VLANDesign(, , ,
, ,
),
VLANDesign(, , ,
, ,
),
VLANDesign(, , ,
, ,
),
VLANDesign(, , ,
, ,
),
]
.vlans
():
.rules = []
zone_pairs = [
(, ),
(, ),
(, ),
(, ),
]
flow .baseline.get(, []):
.rules.append(FirewallRule(
rule_id=.rule_counter,
source_zone=flow[],
source_ip=flow[],
dest_zone=flow[],
dest_ip=flow[],
protocol=flow.get(, ),
port=flow.get(, ),
action=,
dpi_profile=._get_dpi_profile(flow.get(, )),
comment=,
))
.rule_counter +=
src_zone, dst_zone zone_pairs:
.rules.append(FirewallRule(
rule_id=.rule_counter,
source_zone=src_zone,
source_ip=,
dest_zone=dst_zone,
dest_ip=,
protocol=,
port=,
action=,
comment=,
))
.rule_counter +=
.rules
():
dpi_profiles = {
: ,
: ,
: ,
: ,
: ,
}
dpi_profiles.get(port, )
():
plan = {
: {
: ,
: ,
: [
,
,
,
,
,
,
],
: ,
},
: {
: ,
: ,
: [
,
,
,
,
,
,
],
: ,
},
: {
: ,
: ,
: [
,
,
,
,
,
],
: ,
},
: {
: ,
: ,
: [
,
,
,
,
,
],
: ,
},
}
plan
():
design = {
: [asdict(v) v .vlans],
: [asdict(r) r .rules],
: .generate_migration_plan(),
}
(output_file, ) f:
json.dump(design, f, indent=)
()
()
()
design
__name__ == :
(sys.argv) < :
()
sys.exit()
designer = SegmentationDesigner(sys.argv[])
designer.design_vlans()
designer.generate_firewall_rules_from_baseline()
output = sys.argv[] (sys.argv) >
designer.export_design(output)
步骤 2:配置工业交换机VLAN
对工业以太网交换机应用VLAN配置,包括端口安全和未使用端口加固。
vlan 10
name SIS-SAFETY-L1
vlan 20
name BPCS-FIELD-L01
vlan 30
name BPCS-SUPERVISORY-L2
vlan 40
name SITE-OPS-L3
vlan 50
name OT-DMZ-L35
vlan 999
name QUARANTINE
interface range GigabitEthernet1/0/1-12
description PLC Connections
switchport mode access
switchport access vlan 20
switchport port-security
switchport port-security maximum 1
switchport port-security mac-address sticky
switchport port-security violation shutdown
storm-control broadcast level 10
storm-control multicast level 10
spanning-tree portfast
spanning-tree bpduguard enable
no cdp enable
no lldp transmit
no lldp receive
interface range GigabitEthernet1/0/13-18
description HMI Stations
switchport mode access
switchport access vlan 30
switchport port-security
switchport port-security maximum 1
switchport port-security mac-address sticky
switchport port-security violation restrict
spanning-tree portfast
interface TenGigabitEthernet1/0/1
description Trunk to OT Zone Firewall
switchport mode trunk
switchport trunk allowed vlan 20,30,40,50
switchport trunk native vlan 999
switchport nonegotiate
interface range GigabitEthernet1/0/19-48
description UNUSED - Shutdown
switchport mode access
switchport access vlan 999
shutdown
步骤 3:验证分段有效性
实施后,验证分段正确阻断未授权的跨区流量,同时允许所有合法操作。
"""OT网络分段验证器。
运行自动化测试,在分段部署后验证区域隔离、
防火墙规则和协议执行情况。
"""
import json
import socket
import subprocess
import sys
import time
from dataclasses import dataclass, asdict
@dataclass
class ValidationTest:
test_id: str
description: str
source_zone: str
target_ip: str
target_port: int
expected_result: str
actual_result: str = ""
status: str = ""
class SegmentationValidator:
"""验证OT网络分段实施情况。"""
def __init__(self):
self.tests = []
self.results = []
def add_test(self, test):
self.tests.append(test)
def run_connectivity_test(self, target_ip, target_port, timeout=3):
"""测试到目标的TCP连通性。"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((target_ip, target_port))
sock.close()
return "reachable" if result ==
(socket.timeout, ConnectionRefusedError):
Exception:
():
( * )
()
( * )
passed =
failed =
test .tests:
actual = .run_connectivity_test(test.target_ip, test.target_port)
test.actual_result = actual
actual == test.expected_result:
test.status =
passed +=
:
test.status =
failed +=
icon = test.status ==
()
()
()
()
{: passed, : failed, : (.tests)}
__name__ == :
validator = SegmentationValidator()
validator.add_test(ValidationTest(
, ,
, , , ))
validator.add_test(ValidationTest(
, ,
, , , ))
validator.add_test(ValidationTest(
, ,
, , , ))
validator.add_test(ValidationTest(
, ,
, , , ))
validator.add_test(ValidationTest(
, ,
, , , ))
validator.add_test(ValidationTest(
, ,
, , , ))
validator.run_all_tests()
核心概念
| 术语 | 定义 |
|---|
| VLAN | 虚拟局域网(Virtual Local Area Network) - 第2层广播域隔离,用于在共享交换机基础设施上分离OT区域 |
| 工业防火墙(Industrial Firewall) | 具备工业协议(Modbus、DNP3、EtherNet/IP、OPC UA)深度包检测能力的防火墙 |
| 数据二极管(Data Diode) | 硬件强制单向网关,从物理上阻止反向数据流,用于OT运营区和DMZ之间 |
| 端口安全(Port Security) | 交换机功能,限制端口上的MAC地址数量并锁定分配,防止未授权设备连接 |
| 中继端口(Trunk Port) | 使用802.1Q标签承载多个VLAN的交换机端口,用于跨区域边界连接交换机和防火墙 |
| DMZ | 企业IT和OT之间的非军事化区 - 所有跨域流量在此终止并接受检测的缓冲区 |
工具和系统
- Cisco ISA-3000:工业安全设备,具备Modbus、DNP3和EtherNet/IP深度包检测能力,用于OT区域防火墙
- Fortinet FortiGate Rugged系列:加固型下一代防火墙,支持OT协议,具有工业环境认证
- Waterfall Security单向网关:硬件数据二极管,强制从OT到IT的单向数据流
- Cisco工业以太网交换机:支持VLAN、端口安全和工业协议的受管交换机
输出格式
OT网络分段报告
================================
实施日期: YYYY-MM-DD
VLAN架构:
VLAN [ID] - [名称] ([Purdue层级])
子网: [子网/掩码]
设备数量: [数量]
防火墙规则:
[区域A] -> [区域B]: [允许/拒绝数量]
验证结果:
通过的测试: [N]/[总数]
关键失败: [N]