前阵子去一家工厂做自动化改造方案对方技术负责人倒了半小时苦水说最近连续被安全扫描公司“通报”说厂里的PLC、DCS存在“严重漏洞”要求限期整改。他问我这些控制器又不是电脑装了杀毒软件就能跑吗怎么补我跟他解释了半天回来路上一直在想其实像他这样一头雾水的工程师不在少数。工控网络安全这几年从冷门话题直接变成了刚需话题但很多在一线摸PLC、调DCS的人对“工业神经”到底该怎么自保心里是没底的。这篇文章我就从一个常年在现场做自动化项目和工控安全整改的工程师视角把PLC、DCS这些控制系统为什么容易成为靶子、攻击者通常从哪条路进来、以及我们怎么在不停产、不折腾人的前提下把防护补上这些问题掰开揉碎讲清楚。不管你是刚入门学PLC编程的新手还是在工厂里管DCS运维的老手这篇文章里都有你能直接用的东西。安全问题这东西等出了事再补代价往往是停产和事故真不是重启一下就能解决的。1. 警报为什么现在拉响从“信息孤岛”到“裸奔联网”1.1 先搞清楚“工业神经”是什么PLC与DCS的分工我在和一些刚入行的朋友聊天时发现很多人对PLC、DCS、SCADA这些概念是模糊的。这很正常因为现在很多中小型项目里边界本来就越画越模糊。但理解它们的分工是理解工控安全的前提。通俗点说PLC是可编程逻辑控制器最擅长的是高速离散控制比如流水线上一个气缸的伸出缩回、一个伺服电机的启停定位、一台变频器的多段速切换。它像人体某个器官的神经末梢反应快、动作直接。而DCS是分散控制系统强调的是大规模连续过程的集中监控和协调控制比如化工装置里的温度、压力、流量、液位这些模拟量的闭环调节还有各种联锁逻辑。它更像神经网络的中枢讲究整体协同。至于SCADA、HMI这些上位机监控软件可以理解成“大脑皮层”负责把现场数据展示给人看也接受人的操作指令。在这个体系里现场仪表、IO模块是“感知末梢”PLC/DCS控制器是“决策神经”操作站、工程师站是“指挥中枢”。一个典型的工控网络就是把这些节点用工业以太网、现场总线串起来。过去这套网络是封闭的、专用的外人连不上自然也谈不上什么网络安全。但现在情况完全变了。1.2 攻击面为什么会急剧扩张近几年只要参加技术交流会十次有八次话题都会绕到工控安全上。原因很简单工业网络早就不是“信息孤岛”了。生产管理层要数据MES/ERP要数据远程运维要数据预测性维护平台要数据于是OT网络和IT网络之间就开了大口子。这个口子一旦开攻击路径就打通了。我在现场做风险评估时见过太多让人后背发凉的场景。车间里一台无线路由器办公室的网线和工控网网线同时插在上面信号还覆盖了厂区停车场公用U盘在办公电脑和DCS操作站之间来回插第三方设备厂家的调试笔记本今天在这个项目下载程序明天去那个项目做售后组态软件开了远程访问接口账号密码还是默认的。这些入口每一个都可能被利用。更要命的是现在很多厂商在卖设备时预置了远程维护通道或者PLC程序里藏着定时锁机逻辑。我在一个项目里就碰到过某进口设备程序里有一段“时间炸弹”到时间就封锁关键输出必须找原厂解密码才能继续生产。这种由供应商植入的逻辑比外部攻击还要隐蔽、还要难防。1.3 工控安全和IT安全是两套逻辑很多人拿办公网的安全思路套工控网这是最大的误区。IT安全讲的是CIA三元组机密性优先数据不能泄密工控安全讲的是AIC可用性排第一生产不能停。你不可能对着一套连续生产的化工装置说“我们要打补丁停机两小时。”运行中的DCS控制器和PLC很多时候连重启都不允许补丁验证周期长、风险大一个Windows补丁打上去组态软件起不来这种事故在行业里屡见不鲜。另外工控安全攻击的后果是会变成物理事故的。办公网被攻破顶多数据泄露工控网被攻破攻击者可以把压力值改成超高、把温度连锁旁路掉、把电机速度调到极限轻则设备损坏重则人员伤亡。正因为后果严重防护思路必须完全不一样不是“发现病毒再查杀”的思路而是“未知流量一律不容忍”的思路。2. PLC、DCS那些“带病运行”的老底子2.1 通信协议没有“门锁”明文传输很普遍我在给客户讲工控安全时经常用一个比喻很多工业通信协议就像一扇没有锁的门门把手是好的谁路过都能拧开就进根本不需要钥匙。大家熟知的Modbus/TCP、S7comm、EtherNet/IP、CC-Link IE等协议绝大多数是明文传输既没有加密也没有认证更谈不上完整性校验。具体到什么程度在Modbus/TCP里只要知道从站地址和寄存器地址映射随便一个能发包的工具就能远程把设备的设定值改掉S7comm协议更“厉害”如果PLC没有启用访问保护一个懂点协议的人可以直接上载程序、下载程序相当于把控制器的“大脑”整个换掉。我做测试时经常用一台笔记本做端口扫描发现车间里十几台PLC的102端口、502端口全部裸奔在网络上谁都能连。老一代PLC尤其严重因为当年设计时根本没考虑过会被恶意访问。西门子S7-1200/1500等新型控制器已经支持TLS加密通信和访问保护等级但现场存量最大的一批老设备、老程序并没有把这些能力用起来。2.2 老设备、老软件不是不想补是不敢动工控现场有个很有意思的现象明明设备已经老旧到厂商都停止支持了但它依然在产线上稳定跑了十年。这就要求维护人员“能不动就不动”。我在一个项目里见过一台DCS上位机操作系统还停留在Windows XP时代组态软件版本也很旧历史趋势库常年没人清理。你问工程师为什么不升级他反问你升级坏了谁负责这条线停一个小时损失就够买好几台新电脑了。事实确实如此。工控系统的补丁问题从来不是技术问题而是风险收益问题。所以工控安全的思路不能是“按IT标准打补丁”而要在不打补丁的前提下通过边界防护、白名单、访问控制等手段把风险隔离在外面。也就是说如果系统本身已经千疮百孔那就别再让人能轻易碰到这个系统把“坏系统”藏到“好围栏”后面。2.3 工程站、编程软件成了最大“后门”如果让我说工控网络里最薄弱的环节我一定会说工程师手里的笔记本电脑。很多人觉得黑客攻击PLC很高端实际上最常用的路径就是攻破一台工程站或调试笔记本。技术人员的电脑上往往存着十几个项目的工程文件TIA Portal、GX Works、博途、欧姆龙CX-One、汇川AutoShop等软件一应俱全软件里还保存着各种PLC的访问密码、项目密码。更夸张的把远程桌面开着用户名是administrator密码是123456。这台电脑如果中了木马被远控攻击者等于拿到了控制室的钥匙接下来只需要打开组态软件连接PLC下载程序。整个过程和工程师平时做维护一模一样在监控系统里很难被察觉。这里特别要提醒一句很多PLC的程序下载保护其实是可以被绕过的。比如S7-200 SMART、部分三菱老型号密码就存在PLC存储区里有专门工具能读出来。所以不要以为设了密码就万事大吉。真正有效的做法是不让无关人员物理上接触到工程网同时对工程电脑本身做严格管控。2.4 DCS联锁逻辑和SIS逻辑是最后的保命符在化工、电力这些流程行业DCS里的联锁逻辑是保命的。比如反应釜温度超限联锁自动切断加热锅炉汽包液位过低联锁停炉。这些逻辑一旦被篡改后果不堪设想。我做过一个横河DCS项目逻辑图联锁非常复杂密密麻麻的LC64块、旁路开关、延时定时器。平时工程师在线修改组态、强制信号、旁路联锁是常有的事改完也不一定写审计记录。在网络安全语境下这就是天大的隐患。攻击者如果控制了工程师站直接把联锁输出强制为“通过”或者把旁路开关全部置位那么现场真正发生超温超压时保护动作根本不会触发。这还不光是防黑客的问题。行业里因为维护时误强制、漏恢复联锁导致的事故比黑客攻击多得多。所以联锁逻辑本身要防操作联锁的行为也要防。权限分区、双人复核、操作审计在DCS和SIS系统上不是形式主义是真的能救命的管理手段。3. 工业神经的“自我防护”在不停产前提下能做的几件事3.1 网络分区是第一道墙也是性价比最高的墙工控安全防护我向来主张“先划边界再谈其他”。哪怕你的PLC一个补丁都打不了只要把该挡的人挡在外面风险就降了一大半。具体来说把网络划分成几个区域办公区、生产管理区DMZ区、过程控制区有条件的话再把安全仪表系统单独隔离。区域之间部署工业防火墙或网闸基于白名单做访问控制。交换机上也可以通过VLAN把不同车间、不同工段的控制器分开。举一个我在测试环境常用的白名单规则示例当你在调整防火墙策略时逻辑上就是这样几条# 只允许工程师站 192.168.1.10 访问 PLC 的 102 端口S7通信 iptables -A INPUT -p tcp --dport 102 -s 192.168.1.10 -j ACCEPT iptables -A INPUT -p tcp --dport 102 -j DROP # 透明桥接模式下只允许上位机访问指定控制器的 502 端口Modbus/TCP iptables -A FORWARD -p tcp --dport 502 -s 192.168.2.10 -d 192.168.3.20 -j ACCEPT iptables -A FORWARD -p tcp --dport 502 -j DROP生产环境建议用专门的工业防火墙产品但逻辑是一样的按IP、端口、工业协议功能码来做白名单。相比传统防火墙工业防火墙更懂Modbus、S7comm、PROFINET这些协议的深层内容可以精确到“只允许上位机读寄存器不允许写寄存器”这种颗粒度。这里有个实操心得做规则之前先用一段时间的流量审计摸清业务规律。我见过太多项目规则建得太严直接把正常通信干断了半夜三更被电话叫醒去现场调策略。白名单一定要基于真实业务流来开放宁可在初期宽松一点稳定运行后再逐步收紧也不要一上来就“一刀切”。3.2 PLC/DCS自身的“内功修炼”密码、固件、程序保护边界防护是挡外面的PLC和DCS自己的安全配置也不能落下这属于“内功”。很多设备出厂设置都是默认状态密码为空或极其简单端口全开服务全启。这些东西不改等于围墙修得再高大门却敞着。第一件事修改所有默认口令。包括工程师站操作系统、组态软件、数据库、路由器、交换机、防火墙的管理密码。我甚至见过一些现场HMI触摸屏的下载密码还是出厂默认的随便来个内部人员都能把画面程序拖走。第二件事启用控制器的访问保护。西门子S7-1200/1500在TIA Portal里可以设置访问等级从“完全访问”到“只读”到“完全保护”还能绑定PN接口的访问IP白名单。S7-300/400在STEP 7里可以对块设置KNOW_HOW_PROTECT防止别人上载查看逻辑。三菱GX Works有工程密码汇川、欧姆龙、松下也都有类似机制。这些功能平时很少人用但用起来成本很低效果却很明显。第三件事在条件允许时升级固件和软件版本。这一步要在停机窗口做先在实验室搭一套一样的硬件环境验证程序、通信、功能都正常后再上线。我自己的经验是升级前一定把当前固件版本、程序组态、模块参数全部备份升级失败时能快速回滚。提示程序备份不能只存一份。至少要做“本地一份离线异机一份定期刻盘/磁带归档”的三重备份。备份不光要能存还要定期做恢复演练。别等到设备坏了才发现备份文件是坏的或者备份里少了最新版本的程序。3.3 行为基线监控给网络装一个长期“体检仪”网络分区解决的是“谁能进来”行为监控解决的是“进来之后干了什么”。工控网络流量相对办公网简单很多设备就那么几类通信模式非常固定。这反而成了优点很容易建立“正常行为基线”一旦出现偏离基线的流量就能快速发现。具体做法是把核心交换机的镜像口接一台工控审计系统或者用一个轻量级的流量探针持续学习网络中的通信行为。正常情况是上位机在白天周期性读取PLC数据工程师站在检修时段下载程序DCS操作站和控制器之间有规律的心跳和报警消息。当我看到凌晨三点有办公网IP发起向PLC的写寄存器请求、或者某个陌生设备扫描全网的502端口、或者连续多次登录失败这些就是明显的异常信号。我在一次审计里就通过流量探针发现一台服务器每隔五分钟向所有PLC发送Modbus写命令一查是某个“数据采集优化”项目偷偷部署的后台程序压根没有经过生产部门审批。如果没有行为基线这种“自己人干的事”根本不会被发现。行为监控不需要一步到位上很贵的大平台。一开始可以简单点把交换机的syslog日志、PLC的诊断缓冲区事件抓出来每周人工过一遍也比两眼一抹黑强得多。3.4 纵深防御与应急响应别把宝压在单一措施上真正的工控安全没有银弹必须靠纵深防御。哪怕边界防火墙被突破了、PLC密码被绕过了只要还有最后一道物理防线就能兜住底。这道防线就是独立于DCS/PLC控制系统的安全仪表系统SIS、安全继电器以及最朴素的——物理急停按钮。我自己做项目时凡是涉及安全功能的回路比如急停、光栅、安全门绝对不放在普通PLC的普通DO点上而是单独走安全PLC或安全继电器。原因很简单普通PLC的程序可以被在线修改而安全回路的设计目标是“即使控制逻辑出问题硬件也能靠硬接线把设备停下来”。这是功能安全和信息安全交叉的地方也是很多程序员思维的人容易忽略的光有软件上的安全判断是不够的硬件上必须有独立保护。应急响应预案也很重要。很多工厂的应急预案就一句话“发现异常立即报修。”这远远不够。我建议每个项目都书面写清楚谁有权限在紧急情况下拔掉工程师站的网线、谁负责接管现场手动操作、备份程序放在哪里、回装程序的标准步骤是什么。并且每年至少做一次断网演练和备份恢复演练。注意任何安全措施都不能影响正常生产的可用性。如果一项安全策略会导致控制器重启或通信中断那就不是保护而是破坏。安全产品的部署策略一定要和控制系统的供应商、现场运维人员共同评审。4. 从项目实战看防护落地一次工控安全整改的全过程4.1 风险排查先搞清楚自家网络里有什么我在普能电控带过好几次工控安全整改项目每次第一步都一样摸家底。别笑绝大多数工厂根本说不清自己网里有多少台PLC、多少个HMI、哪些端口是开的、谁有权限连接控制器。以某汽车零部件厂的项目为例。产线有十几台西门子S7系列PLC、几台三菱FX5U、十几台ABB变频器上位机是C#自研的监控程序。我们做风险评估时梳理出以下问题管理网和工控网共用一个无线路由器工程笔记本同时装着多个客户的项目程序且曾中过木马PLC没有启用任何访问保护Modbus/TCP和S7comm全部明文传输上位机远程桌面开着弱口令系统没有离线备份。做完排查我写了一页纸的风险清单并按严重程度排序然后和厂方讨论整改方案。这里有个很关键的沟通技巧不要拿一堆黑客攻击故事吓客户要算经济账。每个风险对应哪种事故场景、一旦发生停产一天的损失是多少、整改投入多少这样客户才会真正重视。4.2 整改落地边界、终端、PLC三层一起动这个项目的整改分三个阶段前后用了一个多月全程没有影响正常生产。第一阶段做边界防护在管理网和工控网之间部署工业防火墙按照之前梳理的业务流配置白名单规则只放行OPC服务器、数据采集网关和经过审批的远程维护通道到DMZ区不允许办公网直接访问PLC。第二阶段做终端和PLC加固给所有工程师站和操作站清了系统、装了白名单软件、改了强密码、启用了屏幕锁定。PLC方面挨个在TIA Portal里设置了访问保护等级把程序上传下载权限收拢到工程站三菱FX5U启用了工程密码和CPU密码并关闭了未使用的以太网端口。同时把每个控制器的组态、程序、注释、配方参数全部离线备份由专人保管。第三阶段做的事很多人想不到把车间里那台“万能U盘”收走改成经过审批的U盘专用工具插入任何工控设备前必须经过杀毒和安全检查。再加上一个流量审计探针把所有PLC和上位机的通信记录留存备查。做完这三步这个工厂的安全状况比大部分同行已经好了一个量级。4.3 调试现场高频疑问VMware、PLC与通信的那些坑很多朋友在自己的笔记本电脑上用虚拟机跑TIA Portal、GX Works等编程软件然后和实体PLC通信经常会遇到连不上的问题。这里就涉及热词里那个经典的疑问用VMware连PLC该用哪种网络连接模式答案很明确首选桥接模式。桥接模式下虚拟机就像一台独立的主机直接插在了宿主机所在的局域网里IP由局域网内的DHCP分配或手动固定PLC访问虚拟机、虚拟机访问PLC都很直接。NAT模式下虚拟机是藏在一个私有子网里的出去访问PLC问题不大但PLC如果想主动访问虚拟机里的HMI或服务器端口映射会很麻烦。仅主机模式只能在宿主机和虚拟机之间通信基本不能用来连实体PLC。具体操作是在VMware里把网络适配器改成“桥接模式”然后在虚拟机里手动设置一个和PLC同一网段的固定IP比如PLC是192.168.0.10虚拟机就设192.168.0.50子网掩码255.255.255.0然后一条ping命令就能验证通不通。这里必须多说一句安全提醒桥接模式让虚拟机完全暴露在局域网里如果你调试完忘了断开这个“裸奔”的虚拟机就会成为别人进入工控网的跳板。所以调试完成后一定要把虚拟机关机或者把网络适配器断开。另外西门子S7-1200与变频器组PROFINET通信时经常有人遇到错误代码8180。这个错误本质上就是组态不一致你在TIA Portal里配置的设备名称、IP地址、GSD版本和实际设备对不上或者硬件组态没有下载到PLC。排查思路就三步第一步核对设备名PROFINET通信靠设备名识别不靠IP第二步核对IP地址第三步重新下载硬件组态必要时断电重启从站和PLC。三菱FX5U通过CC-Link IE Basic控制伺服时常见的坑在站号设置和循环数据映射。CC-Link IE Basic靠IP和站号配合工作站号重复会导致通信闪断。而且循环数据的大小一旦变化会影响网络负载和刷新周期在项目调试阶段要规划好中途频繁修改很容易出稀奇古怪的报错。ABB变频器和西门子PLC通信则要看接口协议。老项目里ABB变频器多是Modbus RTU或Profibus DPModbus RTU要特别注意从站地址、波特率、校验方式偶校验还是无校验必须一致还要检查终端电阻Profibus DP则要核对GSD文件和DP从站地址。C#和西门子PLC通信也是热门问题。用S7.net这类开源库可以很方便地读写S7-1200/1500的数据块但要注意S7-1200的连接资源有限一个PLC通常只允许少数几个HMI/上位机同时连接超过限制会有异常。从安全角度讲上位机访问PLC的IP一定要做白名单S7.net库本身不支持加密明文流量在网络上是可以被抓包的。LabVIEW和松下PLC串口通信的关键在于帧格式解析。松下PLC的计算机链接协议是固定格式的报文帧头、站号、命令码、BCC校验一个字节都不能错。而且串口通信天生没有认证机制任何人只要物理接入串口服务器就能读写PLC数据所以千万不要把串口服务器直接暴露到办公网。4.4 联锁逻辑与输出控制的安全细节回到DCS和PLC控制本身热词里有不少关于联锁、输出控制的搜索这些也值得展开讲。横河DCS的逻辑图联锁如果出现误动作我排查时最喜欢先用“排除法”定位先看联锁条件里的输入信号是不是真实触发再看有没有强制/旁路没有复位最后检查逻辑本身是不是被在线修改过。实际项目中变送器断线、信号干扰、接线松动导致联锁误动的比例远高于逻辑写错所以排查别一上来就改程序先从信号源头查起。PLC数字量输出点控制变频器很多人不清楚“开关量控制”和“通信控制”的区别。数字量输出点本质上就是控制变频器的启停端子、方向端子或者多段速端子用的是干接点信号安全性取决于PLC输出回路的可靠性和变频器端子功能设置的对应关系。这里要注意晶体管输出有PNP和NPN之分选错型号、接错线就会导致输出不动作或误动作。带感性负载时一定要加续流二极管或RC吸收电路不然PLC输出点很容易烧掉。还有朋友搜“PLC怎么让绿灯闪烁3秒”这个用定时器就能实现一个TON加一个比较器或者用系统时钟位都可以。但我想强调一点程序上实现闪烁很简单关键是如果你用这个输出去驱动蜂鸣器或警示灯要考虑输出点容量和负载匹配。更重要的如果这个闪烁信号和安全相关比如设备故障报警你一定要想清楚故障安全状态是“灯亮”还是“灯灭”。正常状态用常开触点故障安全要用常闭触点这个逻辑方向错了后果很严重。关于PLC编程状态机写法这是个好习惯。把一个设备的运行流程拆成空闲、准备、运行、故障、复位等状态不同状态只允许特定的转移条件能有效避免程序里的逻辑混乱和非法状态误动作。从安全角度看状态机还能帮你做“异常状态检测”——设备出现在一个不该出现的状态组合里时程序可以直接触发报警或停机。写状态机时有两个坑一是状态变量要防止重复触发二是没有默认状态处理未知状态码会导致程序卡死。热词里还有“PLC定期锁机程序”这个我前面提过它就是一种供应链级的恶意代码。设备供应商在PLC程序里加了时间判断到点就锁住关键输出然后找你要钱解锁。从工控安全角度看这种“厂商后门”非常难防因为它混在正常的业务逻辑里。应对手段只能靠程序审计项目验收时把PLC程序完整上载出来让第三方或懂行的工程师逐段核查特别留意那些和工艺逻辑无关的定时器、计数器、比较指令和隐藏数据块。验收时千万不能只看设备能转就签字程序里的猫腻有时比设备机械故障更麻烦。4.5 排查技巧速查表把上面这些经验整理成一张速查表方便大家平时参考。这些问题都是我在现场真正碰到过的。现象可能原因快速排查与建议上位机/虚拟机无法连接PLC虚拟机网络模式不对或IP不在同一网段改桥接模式固定IP到同一网段先ping再连S7-1200与变频器PROFINET通信报8180组态和实际设备不一致设备名或IP错误核对设备名、IP、GSD版本重新下载硬件组态三菱FX5U和伺服CC-Link IE Basic通信闪断站号重复、IP冲突、循环数据映射错误检查站号和IP用网络诊断监视刷新周期ABB变频器和西门子PLC连不上通信协议、站地址、波特率或校验不一致核对Modbus RTU参数或Profibus DP站地址检查终端电阻C#上位机偶尔读不到S7-1200数据连接资源超限或通信被防火墙拦截检查PLC连接数和上位机IP是否在白名单内DCS联锁误动作变送器断线、信号干扰、强制/旁路未复位先查信号源头再查强置状态最后查逻辑修改记录PLC输出点烧毁负载电流超限或感性负载没有吸收电路加中间继电器隔离感性负载加RC吸收或续流二极管PLC程序无法上载访问保护密码、读保护设置规范密码管理保留完整工程备份设备到时间突然锁死无法运行程序里存在定时锁机逻辑验收时做程序审计重点排查与工艺无关的定时器和数据块5. 最后再分享一个我自己的习惯做自动化项目这么多年安全整改前前后后也经历了不少我有一个几乎不变的习惯每到一个新现场不管对方有没有提要求我做的第一件事永远是备份。把PLC程序上载出来把DCS组态导出把逻辑图截图留档把所有密码收进密码保险箱。这几件事看起来不酷但真出事的时候救命的恰恰是这些琐碎的准备。有些朋友觉得工控网络安全是安全厂商的事是IT部门的事和自己调PLC的没关系。我的体会恰恰相反最懂现场工艺、最懂程序逻辑、最清楚哪里能停机哪里不能停机的人就是我们这帮搞自动化的。安全方案要落地离不开懂控制的人。所以别再觉得这是“别人的事”了下次做项目时顺手把密码改一改、把备份留一份、把网络拓扑画清楚你的PLC和DCS就已经比大多数系统安全了一大截。等警报真的拉响再动手就真的晚了。