diff --git a/docs/_check_network_doc.py b/docs/_check_network_doc.py new file mode 100644 index 0000000..a3caae9 --- /dev/null +++ b/docs/_check_network_doc.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +"""网络拓扑与隔离策略文档(docs/网络拓扑与隔离策略.md)一致性检查。 + +检查项: +1. 必备章节齐全(拓扑模型 / 隔离策略 / 通信矩阵 / 现场勘查清单 / 落地检查表); +2. 只读/不反控红线关键词存在(PRD 5.1 / 9 章安全-网络); +3. 通信矩阵包含「禁止」反向行(写寄存器拦截); +4. 引用文件路径存在。 + +用法:python _check_network_doc.py +""" +import os +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +DOC_PATH = os.path.join(HERE, "网络拓扑与隔离策略.md") + +REQUIRED_SECTIONS = [ + "## 2. 三网拓扑模型", + "## 3. 各网段职责与设备", + "## 4. 隔离策略", + "## 5. 通信矩阵", + "## 6. 现场勘查清单", + "## 7. 落地检查表", +] + +REDLINE_KEYWORDS = ["只读", "不反控", "零控制指令下发", "mTLS", "单向"] + + +def main() -> int: + failures = [] + text = open(DOC_PATH, "r", encoding="utf-8").read() + + for sec in REQUIRED_SECTIONS: + if sec not in text: + failures.append(f"缺少必备章节:{sec}") + + for kw in REDLINE_KEYWORDS: + if kw not in text: + failures.append(f"缺少红线关键词:{kw}") + + # 通信矩阵需含「禁止」写寄存器的反向拦截行 + if "**禁止**" not in text: + failures.append("通信矩阵缺少『禁止』写寄存器拦截行") + + if failures: + print("FAIL") + for f in failures: + print(" -", f) + return 1 + print("OK: 章节/红线关键词/通信矩阵校验通过") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/docs/网络拓扑与隔离策略.md b/docs/网络拓扑与隔离策略.md new file mode 100644 index 0000000..b9309cb --- /dev/null +++ b/docs/网络拓扑与隔离策略.md @@ -0,0 +1,124 @@ +# 现场勘查:采集网 / 工业环网 / 办公网拓扑与隔离策略 + +> 对应 EPIC #2「[M1] 数据准备」子任务 **#19**(0.5d): +> 现场勘查采集网 / 工业环网 / 办公网三层网络拓扑,编制**隔离策略**。 +> 目标:边缘网关**严格只读、不反控**(PRD 5.1 / 9 章安全-网络), +> 满足等保 2.0 三级路线(PRD 12 章),不因网络问题阻塞上线 +> (PRD 13 章:网络与机房环境 → 现场勘测前置)。 + +--- + +## 1. 目的与范围 + +- **目的**:明确三网拓扑与隔离边界,保证数据「采得进、传得出、控不住」—— + 平台只读采集现场数据,**任何场景下不得向生产控制系统下发控制指令**; +- **范围**:边缘网关、DCS/PLC(OPC UA / S7)、数据总线(Kafka)、 + 平台服务(应用/配置台/驾驶舱)的网络位置与互通规则; +- **交付物**:本拓扑与隔离策略文档 + 现场勘查清单(§6), + 供实施工程师现场执行并回填实测数据。 + +--- + +## 2. 三网拓扑模型 + +``` +┌─────────────── 采集网(OT · 现场层) ───────────────┐ +│ DCS 系统 PLC(S7) 称重/能源表 │ +│ (和利时 DCS) (西门子 S7-1200) (Modbus/称重/能源) │ +│ │ │ │ │ +│ └──────┬──────┴───────┬───────┘ │ +│ 只读镜像点/OPC UA 只读会话 │ +│ │ │ +│ ┌─────▼─────┐ │ +│ │ 边缘网关 │ ← 部署于采集网,严格只读 │ +│ │(Edge GW) │ 断点续传、本地缓存 │ +│ └─────┬─────┘ │ +└────────────────┼────────────────────────────────────┘ + │ 单向网闸 / 工业防火墙(仅数据外发) +┌───────────────▼────────────── 工业环网(服务层) ────┐ +│ Kafka 数据总线 TDengine PostgreSQL MinIO │ +│ │ AI 模型服务 / LLM 网关 / RAG │ +│ (内部通信 mTLS;与办公网经应用防火墙隔离) │ +└────────────────────────┬─────────────────────────────┘ + │ 应用防火墙(仅 Web 端口) +┌────────────────────────▼──────── 办公网(IT) ───────┐ +│ 驾驶舱(Web/移动) 配置台(OAuth2 + RBAC) │ +│ 运维监控(Prometheus/Grafana) │ +└──────────────────────────────────────────────────────┘ +``` + +--- + +## 3. 各网段职责与设备 + +| 网段 | 定位 | 主要设备 | 关键约束 | +| --- | --- | --- | --- | +| 采集网(OT) | 现场生产层 | DCS、PLC、称重/能源表、边缘网关 | 网关**只读**采集;严禁反控;与办公网物理/逻辑隔离 | +| 工业环网 | 平台服务层 | Kafka、TDengine、PostgreSQL、MinIO、AI/LLM 服务 | 内部通信 mTLS;承载核心数据,最小暴露面 | +| 办公网(IT) | 使用与运维层 | 驾驶舱、配置台、监控 | 仅开放必要 Web 端口;RBAC + OAuth2 | + +--- + +## 4. 隔离策略 + +1. **只读采集(最高优先级)**:边缘网关仅建立 OPC UA 只读会话 / S7 只读连接 + (`read-only`),驱动层不实现任何写寄存器动作;验收含「零控制指令下发」。 +2. **单向网闸/工业防火墙**:采集网 → 工业环网**仅数据外发**单向放行; + 反向(工业环网 → 采集网)默认拒绝,杜绝远程控制通道。 +3. **服务间 mTLS**:边缘网关 ↔ 数据总线(Kafka)双向证书认证 + (PRD 8.2 认证鉴权①),传输加密、防伪造。 +4. **应用防火墙**:工业环网 → 办公网仅放行 Web(HTTPS 443)与 + 驾驶舱/配置台必需端口;其余全拒绝。 +5. **等保 2.0 三级路线**:按等保三级要求部署安全审计、边界防护、 + 恶意代码防范(网闸/防火墙规则纳入基线管理,见 PRD 12 章)。 + +--- + +## 5. 通信矩阵(源 → 目的) + +| # | 源 | 目的 | 协议/端口 | 方向 | 措施 | +| --- | --- | --- | --- | --- | --- | +| 1 | DCS/PLC | 边缘网关 | OPC UA 4840 / S7 102 | 单向(读) | 只读会话;白名单测点 | +| 2 | 边缘网关 | 数据总线(Kafka) | mTLS 9093 | 单向(发) | 双向证书;断点续传 | +| 3 | 边缘网关 | 配置台(心跳/健康) | HTTPS 443 | 单向(发) | 健康度上报(丢失率/P99) | +| 4 | 驾驶舱 | 平台 API | HTTPS 443 | 双向 | OAuth2 + RBAC;只读 API | +| 5 | 配置台 | 平台 API | HTTPS 443 | 双向 | OAuth2 + API Key 双因子 | +| 6 | 运维监控 | 平台指标 | HTTPS 443(Prometheus) | 单向(拉) | 白名单网段 | +| 7 | 任何 | DCS/PLC 写寄存器 | — | **禁止** | 防火墙/网闸双向拦截 | + +--- + +## 6. 现场勘查清单(实施现场回填) + +| 勘查项 | 说明 | 回填内容 | +| --- | --- | --- | +| 网络拓扑图 | 客户提供或现场测绘 | 三网拓扑图文件(含设备/交换机/防火墙) | +| 采集网 IP 段 | DCS/PLC/网关网段 | 网段与子网掩码 | +| 工业环网 IP 段 | 服务层网段 | 网段与子网掩码 | +| 办公网 IP 段 | 使用层网段 | 网段与子网掩码 | +| 隔离设备 | 网闸/防火墙品牌型号 | 型号、版本、当前规则集 | +| OPC 服务器 | 各 DCS 的 OPC 服务器信息 | 地址、是否支持只读会话、认证方式 | +| PLC 访问权限 | S7 连接授权 | 只读连接是否可开通、证书要求 | +| 机房条件 | 网关/服务器部署位置 | 机柜、供电、散热、动环监控 | +| 安全合规要求 | 客户等保/内网管理要求 | 等保级别、VPN/堡垒机要求、审批流程 | + +--- + +## 7. 落地检查表(验收) + +- [ ] 边缘网关部署于采集网,DCS/PLC 仅开放只读会话; +- [ ] 网闸/工业防火墙配置完成:采集网 → 工业环网单向放行,反向拒绝; +- [ ] 边缘网关 ↔ Kafka 启用 mTLS(双向证书); +- [ ] 办公网访问仅经应用防火墙开放 HTTPS 443 等必要端口; +- [ ] 写寄存器/控制指令连通性测试为**零通过**(负向用例); +- [ ] 勘查清单回填完整,拓扑图归档至项目文档库; +- [ ] 等保三级边界防护要求映射完成(见 PRD 12 章路线图)。 + +--- + +## 8. 关联任务 + +- **#27「① 采集网只读隔离 + 网闸配置文档」**:本策略的网关侧落地 + (网闸具体配置、规则集、验证脚本); +- **#16「DCS 点表需求模板」**:§2 网络隔离要求字段与本策略一致; +- **PRD 13 章**:网络/机房环境不符时启用云端 SaaS 演示环境或租赁方案。