| name | ot-security |
| description | Cybersécurité OT et résilience selon l'ISA/IEC 62443. |
| version | 1.2.0 |
| author | EVA |
| license | Privée EVA St-Étienne |
| platforms | ["linux","macos","windows"] |
| metadata | {"EVA":{"tags":["security","ot-security",62443,"secrets","resilience","network","industrial-automation"],"related_skills":["simplify-code","plan"]}} |
Cybersécurité OT & Résilience Logicielle (ISA/IEC 62443)
Vue d'ensemble
Le réseau de production (OT) a des priorités distinctes du réseau informatique (IT). En OT, la priorité absolue est la Disponibilité et la Sécurité des personnes et équipements (Safety), suivies par l'Intégrité et la Confidentialité. Lors du développement d'applications ou de scripts d'interface avec des automates ou des supervisions, il est crucial d'appliquer les principes fondamentaux de la norme ISA/IEC 62443 au niveau du code.
Cette compétence guide l'agent EVA pour écrire des scripts d'informatique industrielle hautement résilients aux pannes réseaux, et sécurisés contre les vulnérabilités courantes du monde OT.
Le script d'assistance associé à cette compétence est disponible sous ot_security_scanner.py.
Quand l'utiliser
À utiliser lorsque l'utilisateur demande de :
- Gérer la connexion à des bases de données SQL ou des APIs industrielles nécessitant des mots de passe.
- Écrire des scripts de passerelle ou de synchronisation de données OT/IT.
- Implémenter des scripts d'écriture de variables critiques (consignes machine, seuils de vitesse, vannes).
- Assurer la tolérance aux pannes réseaux (reconnexion automatique de scripts d'acquisition).
- Réaliser un inventaire non destructif ou un audit de ports industriels sur le réseau OT.
1. Directives de Développement Sécurisé en OT
A. Gestion Sécurisée des Mots de Passe & Identifiants (Secrets)
Ne jamais insérer des mots de passe de bases de données, de serveurs OPC-UA ou de brokers MQTT en dur dans les scripts.
- Utilisation de variables d'environnement (.env) : Stocker les informations sensibles dans un fichier
.env non partagé sur les dépôts de code (ex: git).
- Lecture des secrets en Python :
import os
from dotenv import load_dotenv
load_dotenv()
db_user = os.getenv("DB_USER")
db_password = os.getenv("DB_PASS")
B. Validation des Écritures Automate (Garde-fous / Range Checks)
Puisque les scripts Python peuvent écrire directement dans la mémoire des automates (via Modbus, Snap7, ou PyLogix), toute écriture de consigne doit être précédée d'un contrôle de cohérence des plages de valeurs (Range Check) au niveau applicatif pour éviter des dysfonctionnements physiques sur la machine.
def safe_write_speed_limit(client_plc, speed_setpoint: float):
MIN_SPEED = 0.0
MAX_SPEED = 1500.0
if speed_setpoint < MIN_SPEED or speed_setpoint > MAX_SPEED:
raise ValueError("Consigne de vitesse %.2f hors limites de sécurité [%.1f, %.1f]"
% (speed_setpoint, MIN_SPEED, MAX_SPEED))
C. Résilience Réseau & Reconnaissance de Déconnexion
Les coupures réseau de quelques secondes ou minutes sont courantes en atelier. Les scripts ne doivent pas planter à la première déconnexion mais tenter des reconnexions périodiques tout en alertant les superviseurs.
import time
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("EVA_OT_Monitor")
def communication_loop(plc_client):
reconnect_delay = 5.0
while True:
try:
if not plc_client.is_connected():
logger.warning("Connexion perdue. Tentative de reconnexion...")
plc_client.connect()
time.sleep(1)
continue
data = plc_client.read_all_tags()
logger.info("Données récupérées avec succès.")
time.sleep(2.0)
except Exception as e:
logger.error("Erreur de communication : %s. Nouvelle tentative dans %s secondes."
% (str(e), reconnect_delay))
time.sleep(reconnect_delay)
2. Utilisation du Script d'Assistance (Scan de Ports OT)
Pour exécuter le scanner de ports industriels de manière non-intrusive sur une plage réseau, utilisez l'outil d'exécution de code (execute_code) avec le script suivant :
import subprocess
targets = "127.0.0.1,192.168.1.0/24"
cmd = [
".venv/Scripts/python.exe",
"skills/industrial/standards-security/ot-security/scripts/ot_security_scanner.py",
"--targets", targets,
"--ports", "102,502,4840,44818",
"--timeout", "0.5"
]
print(f"Lancement de l'audit de sécurité réseau sur : {targets}...")
result = subprocess.run(cmd, capture_output=True, text=True)
print(result.stdout)
if result.stderr:
print("Erreurs :", result.stderr)
Pièges Courants (Common Pitfalls)
-
Commit de fichiers de configuration contenant des mots de passe :
- Erreur : Commiter un fichier de configuration contenant des identifiants administrateur de la base SQL de production sur le dépôt Git.
- Correction : Ajouter les fichiers
.env ou de configuration locale contenant des mots de passe au fichier .gitignore et distribuer un fichier modèle vide (ex: .env.example).
-
Écritures aveugles en boucle infinie (surcharges PLC) :
- Erreur : Écrire en permanence (chaque 10ms) la même valeur de consigne dans l'automate. Cela peut user prématurément la mémoire Flash de l'automate ou surcharger son processeur de communication.
- Correction : Écrire uniquement sur changement de valeur (Write on Change) ou réguler la boucle d'écriture.
-
Scans de ports agressifs (type Nmap) en production :
- Erreur : Lancer un scan réseau avec des requêtes de type SYN agressives ou des payloads mal formés sur d'anciens automates (ex. Siemens S7-300 ou anciens coupleurs Modbus Schneider). Cela peut bloquer le module de communication (CP) et provoquer l'arrêt de la CPU (Stop).
- Correction : Utiliser exclusivement des connexions asynchrones douces (comme celle implémentée dans le script d'assistance) avec un délai suffisant (semaphores) et sans envoi de payloads non documentés.
Liste de vérification (Checklist)