资讯详情

ICS/SCADA 异常检测实战:基于多维基线与机器学习的 OT 网络入侵发现

📅 2026/9/12 2:29:16 | 华诺云谱 👁 阅读
ICS/SCADA 异常检测实战:基于多维基线与机器学习的 OT 网络入侵发现
ICS/SCADA 异常检测实战基于多维基线与机器学习的 OT 网络入侵发现【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills导读本文基于 Anthropic-Cybersecurity-Skills 仓库中的detecting-anomalies-in-industrial-control-systems技能系统讲解如何在工业控制系统ICS/SCADA环境中部署行为驱动的异常检测从确定性通信基线建模、Isolation Forest 机器学习模型训练到 Modbus/DNP3/OPC UA 协议层面的拓扑、时序与功能码异常判别并给出可运行的 Python 实现与上报格式。读完本文你将掌握一套完整的 OT 网络连续监控与深度告警调查方案可配合 Nozomi Guardian、Dragos Platform 等平台的告警做二次分析。适用范围与前提本技能面向以下典型场景为缺乏入侵检测能力的 OT 环境部署连续监控在 OT 网络中构建行为检测作为签名检测signature-based IDS的补充为确定性的 SCADA 通信建立基线并检测偏差将机器学习异常检测与 OT 安全监控平台集成调查来自 Nozomi Guardian 或 Dragos Platform 的告警需要更深的协议层分析。不适用场景对已知漏洞的签名检测参见 detecting-attacks-on-scada-systems不包含 OT 协议的一般 IT 网络异常检测以及作为工艺安全系统SIS的替代品——异常检测是监测手段绝不能替代物理层面的安全联锁。部署前需满足的前提条件OT 网络 SPAN/TAP 端口上的被动网络监控传感器至少 2-4 周正常运行期间的基线流量采集Python 3.9并安装 scikit-learn、numpy、pandas 用于 ML 模型训练访问过程历史数据库historian用于物理过程关联分析对正常运行模式的理解包括换班shift changes、批处理batch processes和维护窗口maintenance windows。为什么 ICS 特别适合基于基线的异常检测工业控制网络与传统 IT 网络最大的区别在于通信的高度确定性同一台主站master如 SCADA 服务器会以固定的间隔轮询同一批从站slave如 PLC、RTU读取相同的寄存器使用相同的功能码。这种机器对机器的刻板节奏正是行为基线方法的理想土壤——任何偏离新增通信对、轮询间隔漂移、未出现过的功能码都可能是攻击或设备故障的信号。从源码结构看仓库为该技能提供了三层检测模型SKILL.md 中的ICSAnomalyDetector类负责基线建模与多维检测scripts/agent.py 提供可直接运行的协议级审计工具Modbus 扫描、分段检查、historian 关联references/api-reference.md 则沉淀了功能码风险分级、常见 ICS 端口与检测阈值等速查表。核心概念速览术语定义Deterministic Traffic确定性流量ICS 网络表现出高度可预测的通信模式同一主站以固定间隔轮询同一从站使用相同的功能码Isolation Forest隔离森林无监督机器学习算法通过随机划分特征空间来隔离异常点对异常率极低的 OT 流量非常有效Polling Interval轮询间隔SCADA 主站对从站的连续两次请求之间的时间通常固定且可配置典型 100ms 到 10sFunction Code Allowlist功能码白名单每个通信对所允许的工业协议操作集合由异常检测规则强制约束Topology Baseline拓扑基线OT 网络中所有已授权设备间通信路径的完整映射Physics-Based Detection物理模型检测利用物理过程模型热力学、流体力学检测那些在伪造传感器数据的同时操纵过程的攻击工作流构建多维度基线并检测异常核心工作流分为三步构建多维度基线 → 训练机器学习模型 → 实时逐流分析。仓库给出的完整实现见 SKILL.mdICSAnomalyDetector类下面按模块拆解。Step 1构建多维度基线模型首先对解析后的 pcap 流记录每个 flow 需含src、dst、port、可选function_code与timestamp_epoch进行建模覆盖三个维度时序轮询间隔均值/标准差、每分钟包数、协议行为功能码分布、网络拓扑授权通信对集合。dataclass class CommunicationProfile: Profile for a single master-slave communication pair. src_ip: str dst_ip: str protocol: str port: int avg_interval_ms: float 0.0 std_interval_ms: float 0.0 avg_payload_size: float 0.0 function_codes: dict field(default_factorydict) packets_per_minute: float 0.0 first_seen: str last_seen: str def build_baseline_from_pcap(self, pcap_data): for flow in pcap_data: key f{flow[src]}-{flow[dst]}:{flow[port]} if key not in self.profiles: self.profiles[key] CommunicationProfile( src_ipflow[src], dst_ipflow[dst], protocolflow.get(protocol, TCP), portflow[port], first_seenflow.get(timestamp, )) profile self.profiles[key] profile.last_seen flow.get(timestamp, ) fc flow.get(function_code) if fc is not None: profile.function_codes[fc] profile.function_codes.get(fc, 0) 1 self.topology_baseline.add((flow[src], flow[dst], flow[port])) self._calculate_timing_stats(pcap_data)时序统计_calculate_timing_stats对每个通信对的相邻包时间戳求差并换算为毫秒计算间隔的均值与标准差再按观测时长折算每分钟包数——这为后续轮询间隔漂移检测提供了 z-score 依据intervals [(ts_sorted[i1] - ts_sorted[i]) * 1000 for i in range(len(ts_sorted) - 1)] profile.avg_interval_ms np.mean(intervals) profile.std_interval_ms np.std(intervals) duration_min (ts_sorted[-1] - ts_sorted[0]) / 60 if duration_min 0: profile.packets_per_minute len(ts_list) / duration_minStep 2用 Isolation Forest 训练异常模型对基线流量的特征向量训练无监督模型特征列包括interval_ms轮询间隔、payload_size载荷大小、packets_per_window窗口内包数、unique_func_codes功能码种类数、new_connection_flag新连接标志。特征先经StandardScaler标准化再送入隔离森林self.isolation_forest IsolationForest( n_estimators200, contamination0.01, # 基线中预期的异常率约为 1% random_state42, n_jobs-1, ) self.isolation_forest.fit(X_scaled) scores self.isolation_forest.decision_function(X_scaled) print(f Threshold: {np.percentile(scores, 1):.4f})这里contamination0.01表示训练数据中约 1% 的样本可视为异常随机种子固定为 42 保证可复现n_jobs-1使用全部 CPU 核以加速训练。训练完成后以 1% 分位数作为告警阈值即可用于在线评分。Step 3三类在线检测analyze_flow()对每条实时流记录依次执行三类检测并将结果追加到self.anomalies拓扑异常detect_topology_anomaly——检测未出现在基线中的新通信对判为 high 级告警提示可能是新授权设备或配置变更if (src_ip, dst_ip, port) not in self.topology_baseline: return {type: NEW_COMMUNICATION_PAIR, severity: high, detail: fNew connection: {src_ip} - {dst_ip}:{port} not in baseline, recommendation: Verify if this is an authorized new device or configuration change}时序异常detect_timing_anomaly——对轮询间隔计算 z-score超过 4.0 判为 medium 级异常提示网络拥塞、设备故障或中间人攻击z_score abs(interval_ms - profile.avg_interval_ms) / profile.std_interval_ms if z_score 4.0: return {type: TIMING_ANOMALY, severity: medium, detail: fInterval {interval_ms:.1f}ms deviates from baseline f{profile.avg_interval_ms:.1f}ms (z-score: {z_score:.1f}), recommendation: Check for network congestion, device malfunction, or MITM attack}功能码异常detect_function_code_anomaly——检测通信对基线中未出现过的 Modbus/DNP3 功能码。写操作类功能码5、6、15、16以及诊断码 8 判为critical其余判为 highif profile and func_code not in profile.function_codes: severity critical if func_code in {5, 6, 15, 16, 8} else high return {type: UNAUTHORIZED_FUNCTION_CODE, severity: severity, detail: fFunction code {func_code} from {src_ip} to {dst_ip}:{port} fnot in baseline. Allowed: {list(profile.function_codes.keys())}, recommendation: Investigate source - possible command injection attack}generate_report()最后汇总告警按 critical / high / medium / low 分级统计并输出前 20 条异常详情。协议级速查Modbus 功能码与常见 ICS 端口仓库的 api-reference.md 提供了协议层的关键速查数据是规则编写与告警研判的基础。Modbus 功能码风险分级功能码名称风险1Read Coils读线圈低3Read Holding Registers读保持寄存器低5Write Single Coil写单线圈中6Write Single Register写单寄存器中15Write Multiple Coils写多线圈高16Write Multiple Registers写多寄存器高43Read Device Identification读设备标识侦察常见 ICS 端口端口协议说明502Modbus TCPPLC 通信102S7comm西门子 S7 PLC44818EtherNet/IPAllen-Bradley / Rockwell20000DNP3分布式网络协议4840OPC-UAOPC 统一架构47808BACnet楼宇自动化异常检测阈值指标阈值严重级别非常规功能码FC 8、17、43、90HIGH写频率 100 次/分钟突发写操作CRITICAL异常响应任意异常码MEDIUM新源 IP 访问 PLC未授权访问CRITICAL可运行的检测 Agentscripts/agent.py除 SKILL.md 中的训练/检测框架外仓库还提供了可直接执行的审计脚本 scripts/agent.py179 行它把上述阈值逻辑落为代码包含四类功能。Modbus 设备扫描与异常规则脚本内置功能码字典与异常功能码集合与阈值表完全对应MODBUS_FUNCTION_CODES { 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, 43: Read Device Identification, } ANOMALOUS_FUNCTION_CODES {8, 17, 43, 90, 100}scan_modbus_device(host, port502, unit_id1)使用 pymodbus 连接 PLC读取保持寄存器0-9与设备标识from pymodbus.client import ModbusTcpClient client ModbusTcpClient(host, portport, timeout10) client.connect() rr client.read_holding_registers(0, count10, slaveunit_id) rr2 client.read_device_information(slaveunit_id)analyze_modbus_traffic(pcap_summary)对解析后的流量逐条命中三类规则命中异常功能码集合判 HIGH提示可能的侦察行为、写计数超过 100 判 CRITICAL、存在异常码判 MEDIUM设备错误if entry.get(write_count, 0) 100: findings.append({issue: fHigh write frequency ({entry[write_count]} writes) — possible attack, severity: CRITICAL}) if entry.get(exception_code): findings.append({issue: fModbus exception code {entry[exception_code]} — device error, severity: MEDIUM})网络分段检查check_ics_network_segmentation(host, ics_portsNone)从 IT 侧测试常见 ICS 端口默认 502/102/44818/20000/4840的可达性若 IT 网络可直连 OT 端口即判 CRITICAL——这正是 IEC 62443 分区隔离理念的直接落地检查open_status sock.connect_ex((host, port)) 0 if open_status: result[finding] f{port_names.get(port, )} port accessible from IT network result[severity] CRITICAL过程历史数据关联query_historian_anomalies(historian_url, api_key, tag_name, hours24)通过 REST API 拉取过程 tag 的最近 24 小时读数用 3σ 准则找出异常传感器读数——对应概念表中的物理模型检测思路当网络流量看似正常但过程数据出现统计学偏差时往往是攻击者在伪造传感器数据。命令行使用python3 scripts/agent.py --modbus-host 192.168.1.10 --modbus-port 502 python3 scripts/agent.py --scan-host 10.0.0.5 python3 scripts/agent.py --modbus-host 192.168.1.10 --output report.json支持参数--modbus-host要扫描的 Modbus 设备 IP、--modbus-port默认 502、--scan-host分段检查目标、--historian-url与--historian-key历史库 API 凭证、--output保存 JSON 报告。运行结果输出 ICS ANOMALY DETECTION AUDIT 报告包含设备寄存器、设备标识与各端口可达性状态。工具与平台生态工具用途Nozomi Networks Guardian基于 AI 的基线学习与工业协议分析的 OT 异常检测Dragos Platform面向 ICS 环境的行为分析与威胁情报检测Scikit-learnIsolation Forest、One-Class SVM、Local Outlier Factor 等异常检测算法Zeek OT 插件提供 Modbus、DNP3、BACnet 协议分析器的网络监控用于基线构建依赖安装pip install pymodbus requestspymodbus 提供 Modbus TCP/RTU 客户端能力requests 用于 historian 与 SIEM 的 API 访问。输出与上报格式检测结果按统一格式输出便于 SIEM 摄取与人工研判ICS Anomaly Detection Report Detection Period: YYYY-MM-DD to YYYY-MM-DD Baseline Size: [N] communication profiles ANOMALIES DETECTED: [N] Critical: [N] High: [N] Medium: [N] Low: [N] [SEVERITY] ANOMALY_TYPE Source: [IP] - Target: [IP]:[Port] Detail: [Description of deviation from baseline] Baseline: [Expected behavior] Observed: [Actual behavior]每条告警同时给出基线预期行为与实际观测行为方便 SOC 分析师直接对照排查。框架映射与定位该技能在仓库的能力矩阵中对应 MITRE ATTCK 的 ICS 侧技术如 T0836 操纵/篡改、T0831 拒绝服务等同时映射 NIST CSF 2.0 的检测DE.CM-01与资产管理ID.AM-05等职能。仓库根目录的 ATTACK_COVERAGE.md 汇总了各技能的 ATTCK 覆盖mappings/mitre-attack/与 mappings/README.md 提供了可视化导航层文件可将该技能的能力与 ATTCK 矩阵对照识别检测盲区。实战要点总结基线质量决定检测质量至少 2-4 周正常流量必须覆盖换班、批处理与维护窗口避免把正常操作误报为异常。先拓扑后时序新增通信对拓扑异常往往是最早、最可靠的入侵信号时序 z-score 阈值 4.0 可按现场抖动情况调参。功能码白名单从严对写操作类功能码5/6/15/16与诊断码 8 采用 critical 级别写频率突增超过 100 次/分钟应触发立即响应。网络层与过程层交叉验证将流量异常与 historian 的 3σ 统计结合研判可识别流量正常但过程被操纵的隐蔽攻击。明确边界该方案是行为检测的补充层不能替代签名检测、更不能替代 SIS 工艺安全系统。【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。