Modbus-Sicherheitsprotokoll: TLS-Verschlüsselung, X.509 - Zertifikat-Authentifizierung und industrielle Netzwerksicherheit
Schlüsselwörter:Modbus-Sicherheitsprotokoll, Modbus-Sicherheit, TLS-Verschlüsselung Modbus, Port 802, X.509 - Zertifikat, industrielle Netzwerksicherheit
Das Modbus-Protokoll wurde 1979 entstanden. In der damaligen Zeit, in denen industrielle Steuerungssysteme in geschlossenen, privaten Netzwerken betrieben wurden, war die Sicherheit nicht eine Design-Bewertung. Heute, mehr als vierzig Jahre später, wenn diese Systeme über Ethernet und das Internet miteinander verbunden sind, ist der Mangel an Sicherheitsmechanismen die tödlichste Mängel des Modbus-Protokolls.
Im Jahr 2018 hat die Modbus-Organisation offiziell die Spezifikation des Modbus-Sicherheitsprotokolls veröffentlicht, das durch die Einführung von Transport Layer Security (TLS) - Verschlüsselung und X.509v3 - Zertifikat-Authentifizierung in der Transportschicht einen dreifachen Schutz für die Modbus-Kommunikation bietet: Authentifizierung, Datenverschlüsselung und Nachrichtenintegrität. In diesem Artikel wird diese kritische Sicherheitserweiterung vom Prinzip bis zum Kampf umfassend interpretiert.
Warum braucht Modbus Sicherheit?
1.1 Sicherheitslücken in traditionellen Modbus
Die Standardmodbus RTU und Modbus TCP-Protokolle sind in Bezug auf Sicherheit nahezu „unsicher":
| Sicherheitsattribute | Modbus RTU | Modbus TCP | Risiken |
|---|---|---|---|
| Authentifizierung | Kein | Kein | Jedes Gerät kann sich als legitime Master-Station |
| Verschlüsselung von Daten | Keine | Keine | Die Nachrichten können abgehört und verändert werden. |
| Integrität der Nachricht | und️ Nur CRC - 16 | 👌️ Nur TCP-Checksumme | kann bösartige Manipulationen nicht verhindern |
| Wiedergabe-Angriffsschutz | Keine | Keine | Rechtmäßige Nachrichten können aufgenommen und wiedergegeben werden |
| Zugriffssteuerung | Keine | Keine | Geräte, die Zugriff auf den Bus haben, können jedes Register lesen und schreiben |
1.2 Echte industrielle Sicherheitsvorfälle
Bei einem Angriff auf das ukrainische Stromnetz im Jahr 2015 schickten Angreifer durch die Entführung von SCADA-Systemen unbefugte Steuerbefehle an die Umspannstation, was zu einem Stromuntergang für 225.000 Menschen führte. Wenn das Modbus-Sicherheitsprotokoll (oder ein ähnliches Authentifizierungs-Verschlüsselungsmechanismus) zu diesem Zeitpunkt verwendet wurde, wäre dieser Angriff schwer zu implementieren.
Bei einem Angriff auf eine Wasseraufbereitungsanlage in Florida im Jahr 2021 änderten Angreifer die Natriumhydroxid-Dosierungseinstellungen in Modbus-Registern über eine gehackte TeamViewer-Fernverbindung direkt und beinahe verursachten einen großangelegten Sicherheitsunfall.
Modbus Sicherheitsprotokoll
2.1 - Stapel-Vergleich
标准 Modbus TCP Modbus 安全协议
┌─────────────┐ ┌─────────────┐
│ Modbus PDU │ │ Modbus PDU │
├─────────────┤ ├─────────────┤
│ MBAP 报头 │ │ MBAP 报头 │
├─────────────┤ ├─────────────┤
│ TCP │ │ TLS 1.2+ │
├─────────────┤ ├─────────────┤
│ IP │ │ TCP │
├─────────────┤ ├─────────────┤
│ 以太网 │ │ IP │
└─────────────┘ ├─────────────┤
端口: 502 │ 以太网 │
└─────────────┘
端口: 802Hauptunterschiede:
- Transport-Schicht - Verschlüsselung mit TLS 1.2 oder höher
- Zwei-Wege - Authentifizierung mit X.509v3 - digitalen Zertifikaten
- Port 802 (statt Standard 502) verwendet
- Die PDU - und MBAP-Headerformate bleiben unverändert und sind vollständig abwärtskompatibel
2.2 Secure Handshake Prozess
Die Verbindungseinrichtung des Modbus-Sicherheitsprotokolls ist in zwei Phasen unterteilt:
- TLS-Handshake:Der Client führt einen standardmäßigen TLS-Handshake mit dem Server durch, verhandelt die Kryptographie-Suite, tauscht Zertifikate aus, erstellt einen Kryptographie-Kanal
- Zertifikate-Authentifikation:Beide Parteien überprüfen die Gültigkeit des Zertifikats des anderen (Signaturkette, Gültigkeitsdauer, Widerrufsstatus)
- Rollenverhandlung:Über das erweiterte Feld im X.509v3 - Zertifikat (Extended Key Usage) Ermittlung der Geräte-Rolle (Client / Server)
- Modbus-Kommunikation:Standardmodbus-PDU - Austausch innerhalb eines TLS-Verschlüsselungskanals
Modbus 安全协议握手流程(简化):
Client Server
│ │
│──── TCP SYN (端口 802) ──────────────────────→│
│←─── TCP SYN-ACK ──────────────────────────────│
│──── TCP ACK ─────────────────────────────────→│
│ │
│──── ClientHello (支持的加密套件) ──────────────→│
│←─── ServerHello + 服务器证书 ──────────────────│
│←─── CertificateRequest (请求客户端证书) ───────│
│──── ClientCertificate + ClientKeyExchange ────→│
│──── CertificateVerify ────────────────────────→│
│──── ChangeCipherSpec + Finished ──────────────→│
│←─── ChangeCipherSpec + Finished ──────────────│
│ │
│◄═════ TLS 加密通道已建立 ═════════════════════►│
│ │
│──── Modbus PDU (加密) ────────────────────────→│
│←─── Modbus PDU (加密) ────────────────────────│
│ │Verwendung von X.509v3 - Zertifikaten im Modbus-Sicherheitsprotokoll
3.1 Rollendefinition im Zertifikat
Das Modbus-Sicherheitsprotokoll definiert Geräterollen über die Extended Key Usage (EKU) - Erweiterung des X.509v3 - Zertifikats:
| Rollen | EKU OID | Beschreibung |
|---|---|---|
| Modbus-Client | 1.3.6.1.4.1.50316.802.1 | Anforderer (Master) |
| Modbus-Server | 1.3.6.1.4.1.50316.802.2 | Anforderer (Slave) |
Nach Abschluss des TLS-Handshakes überprüfen beide Parteien die EKU-Erweiterung im Zertifikat des anderen, um sicherzustellen, dass die Rolle übereinstimmt. Wenn beispielsweise das Serverzertifikat eine Client-EKU enthält oder das Client-Zertifikat eine Server-EKU enthält, wird die Verbindung abgelehnt.
3.2 Zertifikatslebenszyklusmanagement
Das Zertifikatsmanagement steht in industrieller Automatisierung vor einzigartigen Herausforderungen:
- Lange GerätelebensdauerIndustriegeräte können 10 ~ 20 Jahre laufen, Zertifikate müssen im Voraus geplant werden Gültigkeitsdauer
- Offline-Umgebung:Viele Industrie-Netzwerke haben keinen Zugriff auf das Internet, können nicht öffentliche Zertifikate ausgestellt verwenden
- Massive Geräte:Eine Fabrik kann Tausende von Modbus-Knoten haben, Zertifikate zu verwalten ist nicht realistisch
Empfohlene Szenarien:Erstellen einer lokalen PKI (Public Key Infrastructure) und Ausstellen von Zertifikaten mit privaten Zertifikaten:
# 使用 OpenSSL 搭建工业级私有 CA
# 步骤 1: 创建根 CA 密钥和证书
openssl genrsa -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key
-sha256 -days 7300 -out rootCA.crt
-subj "/C=CN/ST=Guangdong/L=Shenzhen/O=FactoryName/CN=Factory Root CA"
# 步骤 2: 创建 Modbus 服务器证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
-subj "/C=CN/ST=Guangdong/L=Shenzhen/O=FactoryName/CN=PLC-001"
# 步骤 3: 添加 EKU 扩展(Modbus 服务器角色)
cat > server_eku.cnf <<EOF
[ext]
extendedKeyUsage = 1.3.6.1.4.1.50316.802.2
keyUsage = digitalSignature, keyEncipherment
EOF
# 步骤 4: 使用 CA 签发证书
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key
-CAcreateserial -out server.crt -days 3650 -sha256
-extfile server_eku.cnf -extensions extIV. Auswahl der Verschlüsselungspaket
Nicht alle TLS-Verschlüsselungspaket eignen sich für industrielle Umgebungen. Sicherheits - und Leistungsausgleich erforderlich:
4.1 Empfohlene Verschlüsselungs-Suite
| Verschlüsselungs-Suite | Sicherheitsebene | Leistungsauswirkungen | Empfohlene Stufe |
|---|---|---|---|
| TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | 高 | 低 | ★ ★ ★ ★ |
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | 高 | 中 | ★ ★ ★ ☆ |
| TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | Sehr hoch | 中 | ★ ★ ★ ☆ |
| TLS_AES_128_GCM_SHA256 (TLS 1.3) | 高 | 低 | ★ ★ ★ ★ |
Empfehlung:AES - 128 - GCM unterstützt Hardwarebeschleunigung auf den meisten Embedded-Chips der ARM Cortex-M - Klasse mit minimalen Leistungsverlusten. Für ressourcenintensive Embedded-Geräte ist AES - 128 - GCM die beste Wahl.
4.2 TLS-Leistung auf eingebetteten Geräten
Der Rechenüberschuss für TLS-Handshakes konzentriert sich hauptsächlich auf asymmetrische Verschlüsselungsvorgänge (Zertifikat-Signaturüberprüfung, Schlüsselaustausch). Hier sind die TLS 1.2 Handshake-Zeit - Testdaten auf verschiedenen Plattformen:
| Plattform | CPU | Frequenz | TLS Handshake-Zeit |
|---|---|---|---|
| Raspberry Pi 4 | Cortex-A72 | 1,5 GHz | ~ 15 ms |
| STM32H7 | Cortex-M7 | 480 MHz | ~ 350 ms |
| ESP32 | Xtensa LX6 | 240 MHz | ~ 800 ms |
| STM32F4 (Software ECC) | Cortex-M4 | 168 MHz | ~ 3 ~ 5 Sekunden |
Wichtig:Auf Geräten mit sehr geringen Ressourcen (z. B. STM32F4) wird ECDSA-Zertifikate anstelle von RSA empfohlen, da ECDSA-Signaturüberprüfungen viel schneller sind als RSA. Oder erwägen Sie die Verwendung des PSK-Modus (Pre-Shared Key), um asymmetrische Verschlüsselungsschritte zu vermeiden.
Interoperabilität mit dem Standard Modbus TCP
Das Modbus-Sicherheitsprotokoll ist abwärtskompatibel. Das gleiche Gerät kann sowohl das Standard-Modbus TCP (Port 502) als auch das Modbus-Sicherheitsprotokoll (Port 802) unterstützen, aber dies stellt ein entscheidendes Sicherheitsproblem dar:
Wenn ein Gerät sowohl die Ports 502 als auch 802 offen hat, kann ein Angreifer den Port 502 verwenden, um alle Sicherheitsmechanismen zu umgehen!
Sicherheitsempfehlungen für Bereitstellung:
- Schließen Sie den Port 502 in einer Produktionsumgebung und öffnen Sie nur den Port 802
- Wenn Sie den Port 502 beibehalten müssen (z. B. mit älteren Systemen kompatibel), verwenden Sie eine Firewall, um den Zugriff auf den Port 502 auf eine bestimmte IP / Subnetz zu beschränken
- Durchsetzen von Lese-nur - Einschränkungen auf der Anwendungsschicht für den Port 502 (sofern das Gerät unterstützt)
Modbus-Sicherheitsprotokoll
Hier ist ein vollständiges Beispiel für die Implementierung eines Modbus-Sicherheitsprotokoll - Clients mit Python:
#!/usr/bin/env python3
"""
Modbus 安全协议客户端示例
使用 TLS 加密连接到 Modbus Security 服务器(端口 802)
"""
import ssl
import socket
import struct
class ModbusSecurityClient:
def __init__(self, host, port=802):
self.host = host
self.port = port
# 创建 TLS 上下文
self.ssl_context = ssl.create_default_context(
purpose=ssl.Purpose.SERVER_AUTH
)
# 加载客户端证书和密钥
self.ssl_context.load_cert_chain(
certfile='client.crt',
keyfile='client.key'
)
# 加载 CA 证书(用于验证服务器证书)
self.ssl_context.load_verify_locations(
cafile='rootCA.crt'
)
# 强制要求验证服务器证书
self.ssl_context.verify_mode = ssl.CERT_REQUIRED
# 设置最低 TLS 版本
self.ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2
self.sock = None
self.transaction_id = 0
def connect(self):
"""建立 TLS 安全连接"""
raw_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
raw_sock.settimeout(5.0)
# 将普通 socket 包装为 TLS socket
self.sock = self.ssl_context.wrap_socket(
raw_sock,
server_hostname=self.host
)
self.sock.connect((self.host, self.port))
# 获取并验证服务器证书
server_cert = self.sock.getpeercert()
print(f"已连接到 {server_cert['subject']}")
print(f"TLS 版本: {self.sock.version()}")
print(f"加密套件: {self.sock.cipher()}")
def read_holding_registers(self, unit_id, start_addr, count):
"""功能码 0x03 - 读保持寄存器"""
self.transaction_id += 1
# 构造 MBAP 报头 + PDU
mbap = struct.pack('>HHHB',
self.transaction_id, # 事务标识符
0x0000, # 协议标识符
0x0006, # 长度(unit_id + func + data)
unit_id # 单元标识符
)
pdu = struct.pack('>BHH',
0x03, # 功能码:读保持寄存器
start_addr, # 起始地址
count # 寄存器数量
)
request = mbap + pdu
# 通过 TLS 加密通道发送
self.sock.sendall(request)
# 接收响应
response = self.sock.recv(1024)
# 解析 MBAP 报头
tid, pid, length, uid = struct.unpack('>HHHB', response[:7])
if tid != self.transaction_id:
raise Exception("事务 ID 不匹配!")
# 解析 PDU
func = response[7]
if func & 0x80:
raise Exception(f"异常码: 0x{response[8]:02X}")
byte_count = response[8]
data = response[9:9+byte_count]
return data
def close(self):
if self.sock:
self.sock.close()
# 使用示例
if __name__ == '__main__':
client = ModbusSecurityClient('192.168.1.100', 802)
try:
client.connect()
data = client.read_holding_registers(1, 0x0000, 10)
print(f"读取到数据: {data.hex()}")
finally:
client.close()VII. Best Practices für die sichere Bereitstellung
| # | Checkliste | Prioritäten |
|---|---|---|
| 1 | Verwenden des Modbus-Sicherheitsprotokolls (Port 802) als Ersatz für den Standard Modbus TCP (Port 502) | 🔴 Hoch |
| 2 | Bereitstellung einer privaten PKI mit ECDSA-Zertifikat (vorrangig gegenüber RSA) | 🔴 Hoch |
| 3 | Deaktivieren von TLS 1.0 / 1.1 mit TLS 1.2 und höher | 🔴 Hohe |
| 4 | EKU-Erweiterungen im Zertifikat ordnungsgemäß eingestellt, Client / Server-Rollen zu unterscheiden | 🟡 |
| 5 | Wenn 502 und 802 gleichzeitig geöffnet sind, beschränken Sie den Zugriff von 502 mit einer Firewall | 🔴 Hohe |
| 6 | Einrichtung eines Zertifikatslebenszyklus-Managementsystems (Rotation, Widerrufsliste) | 🟡 im |
| 7 | Implementierung von Zugriffssteuerung auf Anwendungsschicht für kritische Register (Lese-nur - / Lese-Schreibtrennung) | 🟡 |
| 8 | Bereitstellung eines Netzwerk-Eintrusion - Erkennungssystems (NIDS) zur Überwachung ungewöhnlicher Modbus-Kommunikationsverhaltens | 🟢 Low |
| 9 | Alle Modbus-Schreibvorgänge protokollieren und überprüfen (wer, wann, was geschrieben wurde) | 🟡 |
VIII. Häufig gestellte Fragen
F1: Erhöht das Modbus-Sicherheitsprotokoll die Kommunikationsverzögerung erheblich?
Die TLS-Handshake - Phase hat eine einmalige Verzögerung (Hunderte von Millisekunden bis wenige Sekunden, abhängig von der Geräteleistung), aber nach Abschluss des Handshakes beträgt die Verzögerung bei symmetrischer Verschlüsselung (AES-GCM) nur Mikrosekunden. Für die meisten Modbus-Kommunikationsszenarien (Abfragefrequenz 100ms ~ 1s) ist die Latenzwirkung der TLS-Verschlüsselung vernachlässigbar. Es wird empfohlen, lange Verbindungen (Keep-Alive) zu verwenden, um häufige Handschütteln zu vermeiden.
F2: Kann ein bestehendes Modbus TCP-Gerät auf das Modbus-Sicherheitsprotokoll aktualisiert werden?
Wenn das Gerät eine reine Hardware-Implementierung von Modbus TCP ist (Firmware kann nicht aktualisiert werden), kann das Upgrade nicht durchgeführt werden. Wenn auf einem Gerät ein eingebettetes Betriebssystem ausgeführt wird und die Ressourcen ausreichend sind, kann die TLS-Unterstützung über ein Firmware-Update hinzugefügt werden. Ein weiteres Szenario ist die Bereitstellung eines Proxy-Gateways, das das Modbus-Sicherheitsprotokoll unterstützt, am Frontend des Geräts.
Q3: Sind private, selbstsignierte Zertifikate in industrieller Umgebung sicher?
In einer Intranet-Umgebung ist die Verwendung von Zertifikaten, die von einer privaten Zertifizierung ausgestellt werden (statt von selbstsignierten Zertifikaten), vollständig sicher, vorausgesetzt: der private Zertifizierungsschlüssel wird ordnungsgemäß aufbewahrt, die Zertifizierungsdomain / IP-Bindung ist korrekt und der Widerrufmechanismus funktioniert. Selbstsignierte Zertifikate (nicht von einer Zertifizierungsstelle ausgestellt) sollten vermieden werden, da sie keine wirksame Vertrauensketten-Authentifizierung ermöglichen.
IX. Zukunftsperspektiven
Mit der weltweiten Durchsetzung von IEC 62443 (Standard für die Sicherheit von industriellen Automatisierungs - und Steuerungssystemen) wird das Modbus-Sicherheitsprotokoll von „optional" zu „optional". Immer mehr Anbieter von Industriegeräten integrieren die Modbus-Sicherheitsprotokollunterstützung in ihre Flaggschiff-Produkte. Für Neubauprojekte ist die Einführung des Modbus-Sicherheitsprotokolls von Anfang an die zukunftsweisendste Architekturentscheidung.
Relative Lesung:Best Practices für die Bereitstellung von Modbus TCP / IP-Netzwerken| Modbus RTU im Vergleich zu TCP| Modbus-Anwendungen im industriellen Internet of Things
Antwort veröffentlichen