TP 19 : Compliance-as-Code (Audit Réseau Continu)
Module : 5 – NetSecDevOps et Sécurité Automatisée
Durée indicative : 2h
Prérequis : les VM MikroTik (TP 5) et Cisco IOS-XE (TP 9) accessibles, Python 3, pip install requests netmiko pyyaml
Objectifs
- Définir un référentiel de contrôles de sécurité au format déclaratif.
- Développer un scanner d’audit interrogeant plusieurs équipements.
- Générer un rapport de conformité automatisé et exploitable.
Contexte
Plutôt qu’un audit manuel ponctuel, vous construisez un contrôle continu qui vérifie régulièrement que les équipements du parc respectent des règles de sécurité minimales.
Étape 1 – Référentiel de contrôles
compliance/checks.yaml :
checks:
- id: no-telnet-exposed
description: "Le service Telnet ne doit pas être actif"
severity: high
- id: strong-admin-password-set
description: "Un utilisateur admin dédié (autre que le compte par défaut) doit exister"
severity: medium
- id: ipsec-tunnels-up
description: "Les tunnels IPsec configurés doivent être à l'état 'established'"
severity: high
- id: no-services-exposed-to-wan
description: "Aucun service d'administration ne doit être accessible depuis l'interface WAN"
severity: criticalÉtape 2 – Contrôle sur MikroTik
import requests
def check_no_telnet(base_url, auth):
resp = requests.get(f"{base_url}/ip/service", auth=auth, verify=False)
resp.raise_for_status()
services = resp.json()
telnet = next((s for s in services if s["name"] == "telnet"), None)
return telnet is not None and telnet.get("disabled") == "true"Étape 3 – Contrôle sur Cisco (via Netmiko, lien avec le Module 4)
from netmiko import ConnectHandler
def check_no_services_exposed_to_wan(device):
with ConnectHandler(**device) as conn:
output = conn.send_command("show running-config | include ip http|ip ssh|line vty", use_textfsm=False)
# Analyse simplifiée : vérifie l'absence d'ACL manquante sur les lignes vty exposées au WAN
return "access-class" in outputÉtape 4 – Scanner d’audit consolidé
Le cron déclenche
audit.py, qui croise inventaire et contrôles, dispatch par plateforme, puis génère le rapport trié par sévérité.
compliance/audit.py : pour chaque équipement de l’inventaire (réutilisez inventory/hosts.yaml du TP 14), exécute les contrôles pertinents et construit un résultat structuré :
results = []
for host, info in inventory.items():
for check in checks:
passed = run_check(check["id"], host, info) # dispatch selon la plateforme
results.append({
"host": host,
"check": check["id"],
"severity": check["severity"],
"passed": passed
})Étape 5 – Génération du rapport
Générez un rapport rapport_conformite.md (ou .html) listant, par équipement : le nombre de contrôles passés/échoués, le détail des non-conformités triées par criticité (critical en premier).
def generate_report(results, path="rapport_conformite.md"):
with open(path, "w") as f:
f.write("# Rapport de conformité réseau\n\n")
for host in sorted(set(r["host"] for r in results)):
f.write(f"## {host}\n")
for r in sorted([x for x in results if x["host"] == host],
key=lambda x: x["severity"]):
status = "✅" if r["passed"] else "❌"
f.write(f"- {status} [{r['severity']}] {r['check']}\n")Étape 6 – Automatisation planifiée (lien avec le Module 1)
Ajoutez un déclenchement planifié du script audit.py via un pipeline CI/CD (cron GitHub Actions, schedule:), de façon à obtenir un audit continu plutôt que ponctuel.
on:
schedule:
- cron: "0 6 * * *" # tous les jours à 6hRendu attendu
compliance/checks.yaml,compliance/audit.py, versionnés.- Un exemple de
rapport_conformite.mdgénéré avec au moins une non-conformité détectée volontairement. - Le workflow CI planifié.
Points de vérification
- Le scanner s’exécute sur au moins deux plateformes différentes (MikroTik, Cisco).
- Le rapport trie correctement les non-conformités par criticité.
- Une non-conformité introduite volontairement (ex. Telnet activé) est bien détectée.