| name | implementing-ics-firewall-with-tofino |
| description | 部署和配置Belden/Hirschmann的Tofino工业防火墙,利用深度包检测(DPI)保护SCADA系统和PLC,支持包括Modbus、EtherNet/IP、OPC和S7comm在内的OT协议,在ICS安全区域之间强制执行精细化访问控制。
|
| domain | cybersecurity |
| subdomain | ot-ics-security |
| tags | ["ot-security","ics","firewall","tofino","belden","deep-packet-inspection","network-security","scada"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
使用Tofino实现ICS防火墙
适用场景
- 在关键PLC或RTU前部署区域级防火墙保护
- 需要对工业协议(Modbus、EtherNet/IP、OPC、S7comm)进行深度包检测
- 实现具有协议感知执行的IEC 62443区域和管道边界
- 保护无法打补丁且需要补偿控制措施的遗留PLC
- 在不影响现有工业通信的情况下对控制网络区域进行分段
不适用于企业IT防火墙部署、IT与OT之间的周界防火墙(在DMZ处使用Palo Alto/Fortinet),或仅使用基于IP协议而无OT特定DPI需求的环境。
前置条件
- 带有适当许可证的Tofino Xenon设备或Tofino虚拟设备
- 用于集中策略管理的Tofino中央管理平台(CMP)
- 显示PLC/RTU位置和通信需求的网络拓扑图
- OT协议通信基线(Modbus功能码、EtherNet/IP CIP服务)
- 在网络区域之间内联部署的变更管理审批
工作流程
步骤 1:设计Tofino部署架构
deployment_zones:
zone_1_reactor_control:
tofino_appliance: "TOFINO-XN-001"
deployment_mode: "inline_bridge"
protected_assets:
- name: "PLC-REACTOR-01"
ip: "10.10.1.10"
vendor: "Siemens S7-1500"
protocols: ["S7comm/102", "Profinet"]
- name: "PLC-REACTOR-02"
ip: "10.10.1.11"
vendor: "Siemens S7-1500"
protocols: ["S7comm/102", "Profinet"]
authorized_communications:
- source: "10.10.2.50"
dest: "10.10.1.0/24"
protocols: ["S7comm"]
access_type: "engineering"
- source: "10.10.2.10"
dest: "10.10.1.0/24"
protocols: ["S7comm"]
access_type: "operational"
zone_2_packaging:
tofino_appliance:
[, ]
[]
[]
[]
[, , , ]
步骤 2:配置深度包检测规则
"""Tofino ICS防火墙规则生成器。
根据通信基线分析,生成带有工业协议
深度包检测的Tofino防火墙规则。
"""
import json
import sys
from datetime import datetime
from typing import Dict, List
class TofinoRuleGenerator:
"""生成Tofino ICS防火墙DPI规则。"""
def __init__(self):
self.rules = []
self.rule_id = 1000
def add_modbus_rule(self, src: str, dst: str, allowed_funcs: List[int],
allowed_registers: List[dict] = None, description: str = ""):
"""生成Modbus DPI规则。"""
func_names = {
1: "read_coils", 2: "read_discrete_inputs",
3: "read_holding_registers", 4: "read_input_registers",
5: "write_single_coil", 6: "write_single_register",
15: "write_multiple_coils", 16: "write_multiple_registers",
}
rule = {
"rule_id": .rule_id,
: ,
: ,
: src,
: dst,
: ,
: {
: [
{: fc, : func_names.get(fc, )}
fc allowed_funcs
],
: [
fc fc (, ) fc allowed_funcs
],
},
: description,
: ,
}
allowed_registers:
rule[][] = allowed_registers
.rules.append(rule)
.rule_id +=
rule
():
operation_map = {
: {: , : },
: {: , : },
: {: , : },
: {: , : },
: {: , : },
: {: , : },
: {: , : },
}
rule = {
: .rule_id,
: ,
: ,
: src,
: dst,
: ,
: {
: [
operation_map[op] op allowed_operations op operation_map
],
: allowed_operations,
: allowed_operations,
},
: description,
: ,
}
.rules.append(rule)
.rule_id +=
rule
():
rule = {
: .rule_id,
: ,
: ,
: src,
: dst,
: ,
: {
: allowed_services,
: ,
: allowed_services,
},
: description,
: ,
}
.rules.append(rule)
.rule_id +=
rule
():
.rules.append({
: ,
: ,
: ,
: ,
: ,
: ,
: ,
: ,
})
() -> :
config = {
: {
: datetime.now().isoformat(),
: ,
: ,
: ,
: ,
: .rules,
}
}
json.dumps(config, indent=)
():
()
()
()
()
()
rule .rules:
action_icon = rule[] ==
()
()
()
rule:
dpi = rule[]
dpi:
funcs = [f[] f dpi[]]
()
dpi:
ops = [o[] o dpi[]]
()
__name__ == :
gen = TofinoRuleGenerator()
gen.add_modbus_rule(
src=,
dst=,
allowed_funcs=[, , , ],
description=,
)
gen.add_s7comm_rule(
src=,
dst=,
allowed_operations=[, , , , ],
description=,
)
gen.add_s7comm_rule(
src=,
dst=,
allowed_operations=[, , ],
description=,
)
gen.add_ethernet_ip_rule(
src=,
dst=,
allowed_services=[, , ],
description=,
)
gen.add_default_deny()
gen.print_summary()
核心概念
| 术语 | 定义 |
|---|
| Tofino Xenon | Belden/Hirschmann工业防火墙设备,具备OT协议深度包检测能力 |
| 深度包检测(DPI) | 检查标头之外的报文载荷内容,对工业协议操作强制执行细粒度规则 |
| 内联桥接模式(Inline Bridge Mode) | 透明部署模式,防火墙位于网络段之间,无需更改IP地址 |
| 失败开放(Fail-Open) | 安全模式,设备故障时防火墙放行所有流量,维持过程可用性 |
| 可加载安全模块(LSM) | Tofino插件模块,为Modbus、EtherNet/IP、OPC或其他协议提供特定协议DPI |
| 中央管理平台(CMP) | Tofino集中管理服务器,用于跨多个Tofino设备部署和管理策略 |
输出格式
TOFINO部署报告
===========================
日期: YYYY-MM-DD
已部署设备数: [数量]
各设备摘要:
[设备ID]:
模式: 内联桥接
故障安全: 失败开放
受保护资产: [数量]
规则: [数量]
DPI协议: [列表]
规则摘要:
允许规则: [数量]
拒绝规则: [数量]
DPI强制规则: [数量]
监控:
阻止的数据包(24小时): [数量]
DPI违规(24小时): [数量]