# Implementing Iec 62443 Security Zones

> 本技能涵盖按照IEC 62443-3-2为工业自动化和控制系统（IACS）设计和实施安全区域与管道。内容包括基于风险评估的区域划分、分配安全级别目标（SL-T）、设计管道安全控制、通过工业防火墙实施微分段，以及针对Purdue参考模型通过流量分析和渗透测试验证区域架构。

- Skill: `killvxk/implementing-iec-62443-security-zones` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add killvxk/implementing-iec-62443-security-zones`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/implementing-iec-62443-security-zones/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Security
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/implementing-iec-62443-security-zones

---


# 实施IEC 62443安全区域

## 适用场景

- 为新工业设施设计全新OT网络架构
- 在评估发现问题后，将安全区域改造到现有扁平OT网络中
- 实施网络分段以符合IEC 62443-3-2认证要求
- 从基本VLAN分段升级到策略执行的区域/管道架构
- IT/OT融合项目需要定义企业网络与运营网络之间的安全边界

**不适用于**纯IT网络分段（参见implementing-network-microsegmentation）、云原生工作负载分段（参见securing-kubernetes-on-cloud），或没有网络安全组件的物理安全区域设计。

## 前置条件

- 完成OT网络安全评估，包含资产清单和流量分析
- 了解IEC 62443-3-2区域/管道设计流程和Purdue参考模型
- 具备OT协议深度包检测能力的工业防火墙（带OT Security的Palo Alto、Fortinet OT、Cisco ISA-3000）
- 支持VLAN、802.1Q中继和端口安全的网络交换机
- 运营管理层在维护窗口期间对网络架构变更的批准

## 工作流程

### 步骤 1：基于风险评估执行区域划分

根据功能要求、安全要求、关键性和攻陷后果将IACS划分为区域。每个区域包含具有共同安全要求的资产。

```yaml
# IEC 62443-3-2 区域定义文档
facility: "石化炼厂 - 3号装置"
assessment_date: "2026-02-23"
standard: "IEC 62443-3-2:2020"

zones:
  - zone_id: "Z1-SIS"
    name: "安全仪表系统"
    purdue_level: 1
    security_level_target: "SL 3"
    criticality: "安全关键"
    assets:
      - "Triconex 3008安全控制器 (SIS-01)"
      - "Triconex 3008安全控制器 (SIS-02)"
      - "SIS工程师工作站"
    security_requirements:
      - "与所有其他区域物理隔离（气隙）"
      - "专用工程师工作站，配有可移动介质控制"
      - "任何情况下不允许远程访问"
      - "变更管理需要双重授权"
    allowed_conduits: []  # 无网络管道 - 完全气隙隔离

  - zone_id: "Z2-BPCS"
    name: "基本过程控制系统"
    purdue_level: "1-2"
    security_level_target: "SL 2"
    criticality: "高"
    assets:
      - "Allen-Bradley ControlLogix PLC（PLC-01至PLC-12）"
      - "Rockwell FactoryTalk View HMI（HMI-01至HMI-06）"
      - "工程师工作站 (EWS-01)"
    security_requirements:
      - "区域边界配置带协议检测的工业防火墙"
      - "来自3级的只读数据采集访问"
      - "写入访问限制于工程师工作站子网"
      - "HMI的USB端口已禁用"
    allowed_conduits: ["C1-BPCS-OPS"]

  - zone_id: "Z3-OPS"
    name: "站点运营"
    purdue_level: 3
    security_level_target: "SL 2"
    criticality: "中"
    assets:
      - "OSIsoft PI历史数据库 (HIST-01)"
      - "OPC UA服务器 (OPC-01)"
      - "MES应用服务器 (MES-01)"
      - "报警管理服务器 (ALM-01)"
    security_requirements:
      - "运营区与控制区之间设防火墙"
      - "运营区与DMZ之间设防火墙"
      - "无直接互联网访问"
      - "使用OT批准签名的防病毒软件"
    allowed_conduits: ["C1-BPCS-OPS", "C2-OPS-DMZ"]

  - zone_id: "Z4-DMZ"
    name: "工业非军事化区"
    purdue_level: 3.5
    security_level_target: "SL 2"
    criticality: "中"
    assets:
      - "PI-to-PI接口 (DMZ-HIST-01)"
      - "补丁管理服务器 (DMZ-WSUS-01)"
      - "远程访问跳板服务器 (DMZ-JUMP-01)"
      - "数据二极管 - Waterfall Security (DMZ-DD-01)"
    security_requirements:
      - "两侧均配置双宿主防火墙"
      - "无直接流量穿越 - 所有连接终止于DMZ"
      - "用于单向历史数据库复制的数据二极管"
      - "带MFA的跳板服务器用于远程访问"
    allowed_conduits: ["C2-OPS-DMZ", "C3-DMZ-ENT"]

  - zone_id: "Z5-ENT"
    name: "企业网络"
    purdue_level: 4
    security_level_target: "SL 1"
    criticality: "低（从OT角度）"
    assets:
      - "访问OT数据的企业系统"
    security_requirements:
      - "企业与DMZ之间设防火墙"
      - "不允许直接访问DMZ以下的任何OT区域"
    allowed_conduits: ["C3-DMZ-ENT"]

conduits:
  - conduit_id: "C1-BPCS-OPS"
    name: "控制到运营管道"
    connects: ["Z2-BPCS", "Z3-OPS"]
    security_level: "SL 2"
    protocols_allowed:
      - protocol: "OPC UA"
        port: 4840
        direction: "Z2 -> Z3（只读）"
        security_mode: "SignAndEncrypt"
      - protocol: "Modbus/TCP"
        port: 502
        direction: "Z3 -> Z2（只读，仅FC 3/4）"
        security_mode: "防火墙强制功能码过滤"
    controls:
      - "带OT协议DPI的工业防火墙"
      - "源/目标IP对白名单"
      - "功能码过滤（阻止来自L3的所有写入操作）"
      - "连接速率限制"

  - conduit_id: "C2-OPS-DMZ"
    name: "运营到DMZ管道"
    connects: ["Z3-OPS", "Z4-DMZ"]
    security_level: "SL 2"
    protocols_allowed:
      - protocol: "PI-to-PI"
        port: 5450
        direction: "Z3 -> Z4（通过数据二极管单向传输）"
      - protocol: "HTTPS"
        port: 443
        direction: "Z4 -> Z3（仅补丁下载）"
    controls:
      - "用于历史数据库复制的数据二极管（Waterfall Security）"
      - "带应用层检测的防火墙"
      - "补丁服务器仅从批准的厂商存储库拉取"

  - conduit_id: "C3-DMZ-ENT"
    name: "DMZ到企业管道"
    connects: ["Z4-DMZ", "Z5-ENT"]
    security_level: "SL 1"
    protocols_allowed:
      - protocol: "HTTPS"
        port: 443
        direction: "Z5 -> Z4（历史数据库读取、远程访问门户）"
      - protocol: "RDP"
        port: 3389
        direction: "Z5 -> Z4（带MFA的跳板服务器）"
    controls:
      - "带SSL检测的下一代防火墙"
      - "所有远程访问会话需要MFA"
      - "跳板服务器上的会话录制"
```

### 步骤 2：为区域边界配置工业防火墙

在每个区域边界部署和配置带OT协议感知深度包检测的工业级防火墙。

```bash
# Cisco ISA-3000工业防火墙配置
# 管道C1：BPCS（区域2）<-> 运营（区域3）

# 定义区域接口
interface GigabitEthernet1/1
  nameif zone-bpcs
  security-level 90
  ip address 10.20.1.1 255.255.0.0

interface GigabitEthernet1/2
  nameif zone-ops
  security-level 70
  ip address 10.30.1.1 255.255.0.0

# 从BPCS到运营的OPC UA（只读数据流）
access-list BPCS-to-OPS extended permit tcp 10.20.0.0 255.255.0.0 host 10.30.1.50 eq 4840
# 从运营历史服务器到PLC的Modbus读取（仅FC 3,4）
access-list OPS-to-BPCS extended permit tcp host 10.30.1.50 10.20.0.0 255.255.0.0 eq 502

# 拒绝区域间的所有其他流量
access-list BPCS-to-OPS extended deny ip any any log
access-list OPS-to-BPCS extended deny ip any any log

# 应用访问列表
access-group BPCS-to-OPS in interface zone-bpcs
access-group OPS-to-BPCS in interface zone-ops

# 启用带功能码过滤的Modbus协议检测
policy-map type inspect modbus MODBUS-INSPECT
  parameters
    # 仅允许来自运营区的读取操作
    match func-code read-coils
    match func-code read-discrete-inputs
    match func-code read-holding-registers
    match func-code read-input-registers
    # 阻止所有写入功能码
    match func-code force-single-coil  action drop log
    match func-code preset-single-register  action drop log
    match func-code force-multiple-coils  action drop log
    match func-code preset-multiple-registers  action drop log

# 应用到服务策略
policy-map global_policy
  class inspection_default
    inspect modbus MODBUS-INSPECT

# 记录到OT SIEM
logging host zone-ops 10.30.1.60
logging trap informational
logging enable
```

### 步骤 3：在交换机层面实施VLAN分段

配置网络交换机在第2层强制执行区域边界，防止Purdue层级之间的广播域重叠。

```bash
# Cisco工业以太网交换机配置
# 基于区域的VLAN分配

# 与区域对齐的VLAN定义
vlan 10
  name Z1-SIS-Safety
vlan 20
  name Z2-BPCS-Control
vlan 30
  name Z3-OPS-Operations
vlan 35
  name Z4-DMZ
vlan 40
  name Z5-Enterprise

# PLC端口 - 区域2 BPCS
interface range GigabitEthernet1/0/1-12
  description PLC connections - Zone 2
  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
  spanning-tree portfast
  spanning-tree bpduguard enable
  no cdp enable
  no lldp transmit

# HMI端口 - 区域2 BPCS
interface range GigabitEthernet1/0/13-18
  description HMI connections - Zone 2
  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 restrict
  spanning-tree portfast

# 到工业防火墙的中继
interface GigabitEthernet1/0/24
  description Trunk to ISA-3000 Firewall
  switchport mode trunk
  switchport trunk allowed vlan 20,30,35
  switchport trunk native vlan 999

# 禁用未使用端口
interface range GigabitEthernet1/0/19-23
  shutdown
  switchport access vlan 999
```

### 步骤 4：部署数据二极管实现单向历史数据库复制

在运营区和DMZ之间安装硬件强制的数据二极管（Data Diode），确保数据从OT单向流向IT。数据二极管从物理上防止任何数据回流到OT网络。

```python
#!/usr/bin/env python3
"""数据二极管配置验证器。

验证跨数据二极管的历史数据库复制
（Waterfall Security、Owl Cyber Defense或Siemens）
是否正常运行并执行单向通信。
"""

import socket
import struct
import time
import json
from datetime import datetime


class DataDiodeValidator:
    """验证数据二极管的单向执行。"""

    def __init__(self, diode_tx_ip, diode_rx_ip, historian_port=5450):
        self.tx_ip = diode_tx_ip  # OT侧（发送）
        self.rx_ip = diode_rx_ip  # IT/DMZ侧（接收）
        self.port = historian_port
        self.results = []

    def test_forward_flow(self):
        """验证数据从OT（TX）通过数据二极管流向DMZ（RX）。"""
        test_payload = f"DIODE_TEST_{datetime.now().isoformat()}"

        try:
            # 向TX接口发送测试数据
            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            sock.settimeout(5)
            sock.sendto(test_payload.encode(), (self.tx_ip, self.port))
            sock.close()

            self.results.append({
                "test": "forward_flow",
                "status": "PASS",
                "detail": f"数据已发送到TX接口 {self.tx_ip}:{self.port}",
            })
        except Exception as e:
            self.results.append({
                "test": "forward_flow",
                "status": "FAIL",
                "detail": f"无法到达TX接口: {e}",
            })

    def test_reverse_flow_blocked(self):
        """验证反向流（DMZ到OT）被数据二极管物理阻断。"""
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(3)
            result = sock.connect_ex((self.tx_ip, self.port))
            sock.close()

            if result != 0:
                self.results.append({
                    "test": "reverse_flow_blocked",
                    "status": "PASS",
                    "detail": "到OT侧的反向连接被正确拒绝",
                })
            else:
                self.results.append({
                    "test": "reverse_flow_blocked",
                    "status": "CRITICAL_FAIL",
                    "detail": "反向流可能存在 - 检测到数据二极管绕过！",
                })
        except (socket.timeout, ConnectionRefusedError):
            self.results.append({
                "test": "reverse_flow_blocked",
                "status": "PASS",
                "detail": "反向连接超时（硬件数据二极管预期行为）",
            })

    def test_historian_replication_latency(self):
        """测量跨数据二极管的复制延迟。"""
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(10)
            start = time.time()
            sock.connect((self.rx_ip, self.port))
            latency = (time.time() - start) * 1000
            sock.close()

            status = "PASS" if latency < 1000 else "WARN"
            self.results.append({
                "test": "replication_latency",
                "status": status,
                "detail": f"复制端点延迟: {latency:.1f}ms",
            })
        except Exception as e:
            self.results.append({
                "test": "replication_latency",
                "status": "FAIL",
                "detail": f"无法到达RX历史服务器: {e}",
            })

    def run_all_tests(self):
        """运行完整的数据二极管验证套件。"""
        print("=" * 60)
        print("数据二极管验证报告")
        print("=" * 60)

        self.test_forward_flow()
        self.test_reverse_flow_blocked()
        self.test_historian_replication_latency()

        for r in self.results:
            status_icon = "+" if r["status"] == "PASS" else "-"
            print(f"  [{status_icon}] {r['test']}: {r['status']}")
            print(f"      {r['detail']}")

        return self.results


if __name__ == "__main__":
    validator = DataDiodeValidator(
        diode_tx_ip="10.30.1.100",   # 运营区TX
        diode_rx_ip="172.16.1.100",  # DMZ区RX
    )
    validator.run_all_tests()
```

### 步骤 5：验证区域架构

实施后，通过验证只有授权的管道流量能在区域间通过、所有禁止的跨区路径都被阻断来验证区域架构。

```bash
# 来自企业区的验证测试 - 应被阻止无法到达BPCS
nmap -sT -p 502,44818,102,4840 10.20.0.0/16 --reason
# 预期：所有端口过滤/关闭

# 来自运营区的验证测试 - 只读Modbus应可正常工作
python3 -c "
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient('10.20.1.10', port=502)
client.connect()
# 读取应成功
result = client.read_holding_registers(0, 10, slave=1)
print(f'读取测试: {\"PASS\" if not result.isError() else \"FAIL\"}')
# 写入应被防火墙阻止
result = client.write_register(0, 100, slave=1)
print(f'写入被阻止: {\"PASS\" if result.isError() else \"FAIL - 写入被允许！\"}')
client.close()
"

# 验证数据二极管阻止反向流量
ping -c 3 10.30.1.100  # 从DMZ到OT - 应超时
# 预期：100%丢包（硬件数据二极管阻止ICMP）
```

## 核心概念

| 术语 | 定义 |
|------|------|
| 安全区域（Security Zone） | 按照IEC 62443-3-2定义的具有共同安全要求的逻辑或物理资产分组 |
| 管道（Conduit） | 连接两个或多个区域的通信信道逻辑分组，受共同安全策略约束 |
| 安全级别目标（SL-T） | 区域的目标安全级别，从SL 1（偶然违规）到SL 4（国家级攻击） |
| 数据二极管（Data Diode） | 硬件强制单向网络网关，从物理上阻止数据反向流动 |
| 微分段（Microsegmentation） | 设备级别的精细网络分段，基于角色和功能逐设备管理通信 |
| 深度包检测（DPI） | 防火墙能力，可检查第4层以上的工业协议载荷（Modbus功能码、OPC UA服务调用） |
| 纵深防御（Defense in Depth） | 多层安全方法，在架构不同层次通过多种安全控制保护资产 |

## 工具和系统

- **Cisco ISA-3000**：工业安全设备，提供OT感知防火墙、IPS和VPN能力，支持Modbus、DNP3和EtherNet/IP检测
- **Fortinet FortiGate Rugged**：加固型下一代防火墙，支持工业环境的OT协议
- **Palo Alto IoT/OT Security**：云交付OT安全订阅，提供设备识别和协议感知策略执行
- **Waterfall Security Solutions**：硬件强制单向安全网关（数据二极管），用于OT到IT数据传输
- **Tofino Xenon**：工业安全设备，为Modbus、OPC和EtherNet/IP协议提供深度包检测

## 常见场景

### 场景：将扁平OT网络迁移到区域架构

**背景**：某制造工厂所有OT设备运行在单一VLAN（10.10.0.0/16）上，PLC、HMI、历史服务器和企业网络之间无任何分段。IEC 62443差距评估将此识别为需要实施区域的关键发现。

**处理方法**：
1. 使用被动监控捕获4周完整流量基线，识别所有合法通信流
2. 将所有资产分类到Purdue层级，并根据功能和安全要求分组到逻辑区域
3. 设计每区域一个VLAN的架构，基于观察到的合法流量制定区域间防火墙规则
4. 在区域边界以"仅监控"模式（记录但不阻断）部署工业防火墙
5. 分析防火墙日志2周，识别任何将被阻断的合法流量
6. 在计划的维护窗口期间将防火墙切换到执行模式
7. 验证所有过程控制通信在分段后正常运行
8. 在运营区与DMZ之间部署数据二极管用于历史数据库复制

**注意事项**：在没有完整流量基线的情况下实施区域防火墙会中断未知但合法的通信路径。在生产期间而非维护窗口期间进行区域切换有导致过程中断的风险。将SIS控制器与BPCS放在同一区域违反IEC 62443安全系统隔离要求。

## 输出格式

```
IEC 62443区域实施报告
=====================================
设施: [名称]
实施日期: YYYY-MM-DD
标准: IEC 62443-3-2/3-3

区域架构:
  区域 [ID]: [名称] (SL-T: [1-4])
    资产: [数量]
    管道: [列表]
    控制: [防火墙类型、数据二极管等]

管道配置:
  管道 [ID]: [区域A] <-> [区域B]
    协议: [允许的协议及方向]
    防火墙规则: [允许数量 / 拒绝数量]
    DPI已启用: 是/否

验证结果:
  跨区域测试: [通过/失败数量]
  禁止路径测试: [全部阻断 / 例外]
  协议执行: [功能码过滤已验证]
```

