一段真实抓包就能让管道 SCADA 的加密短板现形:Modbus TCP 报文里的压力值、温度、流量,全是明文躺在网络里。顺着调度网往里发一条伪造的开阀指令,RTU 照单全收——加密和完整性保护,等于没有。
# 现场复现:抓 Modbus TCP(502 端口)看监控数据是否明文
# Modbus TCP 帧结构:事务ID(2) + 协议ID(2) + 长度(2) + 单元ID(1) + 功能码(1) + 数据(N)
tcpdump -i eth0 -n -X 'tcp port 502' -c 5
# 0x0064 0x0000 0x0005 0x01 0x03 0x02 0x2710
# ↑ 事务=100 协议=Modbus/TCP 长度=5(单元+功能码+字节数+数据)
# 单元01 功能码0x03(读保持寄存器) 字节数0x02 数据0x2710=10000
# → 压力值 10.00 MPa 明文可见,改一个字节重发系统照单全收
化工管道 SCADA 的监测数据(压力、温度、流量、液位、泄漏负压波)既是生产安全的"眼睛",也是危化品监管数据安全的"账本"。数据一旦被看(明文泄露)、被改(防篡改失效)、被仿(假数据注入),轻则工况误判,重则虚假告警掩盖真实泄漏。这篇把管道 SCADA 的监测数据按链路走一遍——采集、传输、存储、展示、指令下发五个环节,每个环节给出加密落地方案和可验证命令,最后落到化工 DCS 等保三级合规怎么过。
一、管道 SCADA 监测数据链路全景:数据在哪五个环节流动
| 环节 | 数据形态 | 典型设备 | 风险点 |
|---|---|---|---|
| 01 采集 | 模拟量/数字量报文 | 压力变送器、温度计、RTU/PLC | 假数据注入、被仿冒接入 |
| 02 传输 | Modbus/104/OPC UA 报文 | 工业交换机、光纤环网、4G/5G | 明文窃听、中间人篡改 |
| 03 存储 | 历史库/实时库 | 实时数据库、关系库 | 拖库泄露、记录被改 |
| 04 展示 | 画面/报表/Web | HMI、调度大屏、Web发布 | 越权查看、画面被伪造 |
| 05 指令下发 | 开阀/关阀/调压指令 | 上位机→RTU→执行机构 | 伪造指令、误动作 |
这五个环节是等保测评和密评逐项检查的落点。下面逐个拆:每个环节「威胁长什么样 → 怎么加密 → 用什么命令验证 → 注意什么」。
二、环节1·采集层:防假数据注入和防仿冒接入
威胁场景:攻击者接入网络,伪装成压力变送器向 RTU 周期性发假数据——或者更直接,往 RTU 下发假参数,让真实的压力报警被覆盖。
加密方案:
- 设备身份鉴别:变送器/RTU 与上位机之间做双向身份鉴别,用 SM2 证书证明"我是真的变送器,你是真的 RTU",拒绝无证书设备接入
- 采集数据完整性:每条采集报文带 SM3 摘要,RTU 侧验签,防止数据被替换后转发
验证命令:
# 1) 看采集链路是否启用设备证书(以 OPC UA 安全策略为例,路径以实际部署为准)
grep -ri "SecurityPolicy\|SecurityMode" /etc/opcua/ 2>/dev/null
# → 若只有 "None" / "no security" → 采集链路无身份鉴别
# 2) 验证签名验签(SM2 签名一份采集数据;密钥文件路径以实际部署为准)
openssl dgst -sm3 -sign /etc/scada/keys/sm2_sign.key -out sample.dat.sig sample.dat
openssl dgst -sm3 -verify /etc/scada/keys/sm2_verify.pub -signature sample.dat.sig sample.dat
# → Verified OK → 完整性校验链路通
# (OpenSSL 3.x 默认已支持 SM2/SM3;若报错,先确认 openssl version 是否为 3.x)
注意点:仪表层很多是老设备,不支持证书。别强改设备,在采集前端加安全采集终端/前置机统一做身份鉴别和签名——设备不动,安全补上。这正是安当 ASP(统一身份认证)+ KSP(密钥管理)在采集层的落点:设备证书由 KSP 统一签发管理,前置机做验签服务。
三、环节2·传输层:Modbus/OPC UA 明文改加密通道
威胁场景:调度网段与生产网段共用一台交换机,抓包即得全明文;或通过 4G/5G 专线传输时被中间人改写。
加密方案:传输通道加密,主流三条路:
- OPC UA 安全通道:OPC UA 自带 SecurityPolicy,TLS 双向认证 + 消息签名/加密
- 工业协议隧道:Modbus TCP / 104 报文走 IPSec / SM4 加密隧道
- 5G 专网切片:走运营商 5G 专网,承载层隔离 + 业务层加密
验证命令:
# 1) OPC UA 会话是否加密(用 opcua-client 或 Wireshark 看握手)
# → SecurityPolicy 应显示 Basic256Sha256 / SM4-GCM,不是 None
# 2) 抓包验证 Modbus 是否已进加密隧道
tcpdump -i eth0 -n 'tcp port 502' -c 10
# → 无输出 / 无明文 Modbus 帧 → 数据已走加密通道 ✓
# 3) 4G/5G 专线场景,用 IPsec 策略确认加密
ipsec status | grep -i "encap\|esp"
# → 显示 ESP 封装 + 加密算法(SM4 或 AES-GCM)
注意点:化工管道跨园区传输常走运营商 4G/5G 或租用专线,网络侧隔离只是第一层——业务数据仍要自己加密。别把"运营商网络隔离"当成"数据加密"来答等保测评,测评员会现场抓包验证。
四、环节3·存储层:历史库/实时库透明加密
威胁场景:历史数据库被拖库,几年管道运行数据(压力曲线、泄漏记录、报警清单)全部明文流出;或 DBA 能直接改历史记录,把一次真实超压事故改成"正常"。
加密方案:数据库透明加密(TDE),落库即密文,应用无感知;关键报警记录额外做防篡改(SM3 摘要 + 时间戳链)。密钥由密码设备管理,不放数据库服务器上。
验证命令:
# 1) 确认表空间已启用加密(以 MySQL 8.0 为例,查加密标志)
SELECT TABLESPACE_NAME, ENCRYPTION FROM information_schema.innodb_tablespaces
WHERE TABLESPACE_NAME IN ('hist','realtime');
# → ENCRYPTION = 'Y' → 落盘已加密 ✓
# → ENCRYPTION = 'N' → TDE 未启用,测评直接不符合
# 2) 直接查磁盘上的数据文件,确认业务明文没有散落在页里
strings /var/lib/mysql/hist/hist.ibd | grep -c "10.00\|超压\|泄漏"
# → 返回 0 → 数据文件内无明文业务串 ✓
# → 返回 >0 → 数据文件仍可读到明文,加密未真正覆盖
注意点:TDE 有两个"配套必答":一是加密密钥必须由 KSP 密钥管理系统统一生成、轮换、审计,不能自己生成一把放在配置里;二是备份文件同样加密,很多库 TDE 生效了但备份没加密,拖走备份一样泄露。安当 TDE(透明加密)+ KSP(密钥管理)+ DSI(数据加密集成服务)在存储层的组合,正是对着这两条答的:库内透明加密 + 备份文件加密 + 密钥统一管理。
五、环节4·展示/应用层:越权查看与画面伪造
威胁场景:调度大屏、Web 发布端只靠密码登录,弱口令就能看全园区管道数据;攻击者篡改 HMI 画面文件,让值班员看到"正常"的假画面,掩盖真实异常。
加密方案:
- 访问控制:调度员登录做双因素认证(口令 + UKEY 国密 USB Key),不同岗位看不同分区数据(工艺区/安全区/管理区隔离)
- 画面/报表防篡改:HMI 画面文件、Web 发布数据加载前做完整性校验(签名验签),校验失败拒绝加载
验证命令:
# 1) 登录审计:确认高权限账号无明文口令传输
grep -i "login\|tls\|password" /var/log/scada/auth.log | tail -5
# → 登录链路应走加密通道,日志不应出现明文口令
# 2) HMI 画面文件完整性校验是否生效(路径以实际部署为准)
find /opt/scada/hmi -name "*.pkg" -o -name "*.dwg" | while read f; do
[ "$(sha256sum "$f" | cut -d' ' -f1)" = "$(cat "$f.sha256")" ] || echo "校验失败: $f"
done
# → 无"校验失败"输出 → 画面文件未被篡改 ✓
注意点:UKEY 认证不是"多个令牌",是"每个操作员一把、私钥不进电脑、SM2 证书做身份"的国密双因素。化工防爆区还有防爆手持终端的 UKEY 适配问题——防爆手持设备选 UKEY 要支持 USB 延长线/防爆扩展口,认证服务器走 ASP 统一管理,避免每套系统各建一套认证。
六、环节5·指令下发层:控制指令签名防篡改(最关键)
威胁场景:伪造开阀/关阀/调压指令下发到 RTU,执行机构误动作。这是全链路里后果最严重的环节——一条假指令可能让泄压阀误开、进料阀误关,物理事故。
加密方案:指令全生命周期签名验签:
- 上位机下发指令前用 SM2 私钥签名(私钥锁 HSM,操作员用 UKEY 授权)
- RTU/执行机构加载前验签,验签失败拒绝执行(fail-closed,不能只记日志)
- 指令带序号/时间戳,防重放
验证命令:
# 1) 下发指令是否带签名(抓上位机→RTU 通道,看帧尾是否有签名扩展)
tcpdump -i eth0 -n -X -l 'tcp port 502' -c 20
# → 正常 Modbus 帧到功能码+数据就结束
# → 若帧尾多出一段 0x30 开头的 ASN.1 结构 → 是签名载荷,指令受保护 ✓
# → 若只有纯指令无任何扩展 → 伪造指令可直接执行
# 2) 验签拒绝逻辑测试:修改一条正常指令重发
# 用原始指令签名,改动数据后重发,RTU 应拒绝执行并告警
# → 应返回"验签失败/指令拒绝",不是照常执行
注意点:指令防篡改的验收关键是改一条指令重发看 RTU 反不反应——不是看有没有签名功能,是看验签失败后执行端到底拒没拒绝。很多项目签名"有",但验签失败只记日志不阻断,等于没做。验签服务由 HSM 签名验签服务器承载,签名密钥由 KSP 统一管理、按需轮换。
七、五个环节对比总表 + 密钥管理答案
| 环节 | 核心风险 | 加密/防篡改手段 | 安当落地点 |
|---|---|---|---|
| 01 采集 | 假数据注入 | 设备双向鉴别 + SM3 摘要 | ASP 身份 + KSP 证书 |
| 02 传输 | 明文窃听/篡改 | OPC UA 安全通道 / SM4 隧道 | HSM 密钥 + TDE 传输加密 |
| 03 存储 | 拖库泄露 | TDE 透明加密 + 备份加密 | TDE + KSP + DSI |
| 04 展示 | 越权/画面伪造 | UKEY 双因素 + 文件验签 | ASP + UKEY |
| 05 指令下发 | 伪造指令误动作 | SM2 签名 + 验签拒绝执行 | HSM 签名验签 + KSP |
密钥管理答案(密评必问,一句话答全):
- 密钥存哪?主密钥锁在 HSM 密码机内,永不出硬件;业务密钥以密文形态由 KSP 统一存储分发
- 谁管?KSP 密钥管理系统统一生成、签发、轮换、审计,双人授权才能动用主密钥
- 多久轮换?采集/传输密钥按 1 年轮换,指令签名密钥按 6 个月或策略轮换,轮换留痕可审计
- 怎么接?应用通过统一密码服务接口(PKCS#11/SDF)调用加解密和签名验签,不各自实现密码算法
八、化工 DCS 等保三级合规:测评员会查什么
化工管道 SCADA/DCS 系统按等保三级定级(GB/T 22239-2019),等保三级合规覆盖全链路五环节,同时受 GB/T 39786-2021 密评约束。测评员进现场查的,正是上面五个环节的落地证据:
| 测评项 | 对应环节 | 检查方式 | 不达标的常见原因 |
|---|---|---|---|
| 设备身份鉴别 | 采集 | 查证书/验签配置 | 老设备不支持,未补前置机 |
| 数据传输加密 | 传输 | 现场抓包 | 抓包就是明文 |
| 数据存储加密 | 存储 | 直查数据库 | TDE 未启用,或备份没加密 |
| 访问控制 | 展示 | 登录审计 | 只有密码,无双因素 |
| 指令完整性 | 指令下发 | 改指令重发测试 | 验签失败不阻断 |
| 密钥管理 | 全程 | 查密钥存储/审计 | 密钥明文放服务器 |
一条硬话:密评五类要求(物理环境、网络通信、设备和计算、应用和数据、密钥管理)里,管道 SCADA 最容易挂的是"应用和数据安全"里的数据完整性和密钥管理——前者对应指令签名、存储防篡改,后者对应"密钥到底谁管、存哪、怎么轮换"。答清楚这两条,密评就过了一半。
同属危化品监管数据安全体系的延伸:化工管道的监测加密方案,可平滑复用到危化品运输追踪数据加密(罐车定位、罐内温度/压力追踪数据)——追踪数据的采集、传输、存储、防篡改四环与管道监测完全同构,追踪终端密钥注入走 KDPS 批量灌装、密钥由 KSP 统一管理,即构成完整的危化品运输追踪数据加密方案。
九、踩坑记录
坑1:只加密了传输,存储明文照样被拖库
做了 Modbus 加密隧道,以为数据安全了。结果数据库没加密,渗透测试直接拖走历史库。加密是全程的,链路任何一环明文就是全链路泄露。
坑2:指令签名"有",验签失败"不阻断"
部署了签名验签,但验签失败只记日志不拒绝执行——伪造指令照样生效。验签失败必须拒绝执行(fail-closed),这是指令链路的生死线。
坑3:TDE 密钥放数据库服务器
数据库透明加密了,但加密密钥文件就躺在库服务器目录里。攻击者连上库服务器就能拿到密钥解密。TDE 密钥必须进密码机/密钥管理系统,不能和应用服务器同机。
坑4:老设备不支持证书,就跳过采集层
变送器是老型号不支持 SM2 证书,项目方"图省事"跳过采集层防仿冒。假数据注入直接打到 RTU。设备不支持就在前端加安全采集终端/前置机,别跳过这一层。
十、验收清单:逐项验证做对了
| # | 验收项 | 验证方法 | 达标判定 |
|---|---|---|---|
| 1 | 采集设备双向鉴别 | 无证书设备尝试接入采集链路 | 被拒绝,链路告警 |
| 2 | 采集数据完整性 | openssl dgst -sm3 -verify 验签采集数据 | Verified OK |
| 3 | 传输通道加密 | tcpdump 'tcp port 502' 抓包 | 无明文 Modbus 帧 |
| 4 | 存储透明加密 | 查 innodb_tablespaces 加密标志 + strings 数据文件 | ENCRYPTION='Y',数据文件无明文串 |
| 5 | 备份文件加密 | 检查备份存储 | 备份为密文,密钥不在库服务器 |
| 6 | 调度员双因素 | 无 UKEY 尝试登录调度台 | 登录被拒绝 |
| 7 | 指令签名验签 | 改动一条正常指令重发 | RTU 拒绝执行并告警 |
| 8 | 密钥统一管理 | 查 KSP 审计日志 | 密钥生成/签发/轮换全程留痕 |
| 9 | 密评数据完整性 | 按 GB/T 39786 复查应用和数据安全 | SM2/SM3 覆盖,无明文漏洞 |
按这份清单对你园区的管道 SCADA 做一次自查,三件事就够了:tcpdump 抓一次传输、strings 看一眼数据文件、改一条指令重发看执行端拒不拒绝。五个环节里,你最容易裸奔的是哪一环?评论区聊聊你现场踩到的明文坑,一起排雷。
文章作者:安当加密技术负责人


被折叠的 条评论
为什么被折叠?



