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é

Boucle d’audit planifiée pour ce TP Boucle d’audit planifiée pour ce TP 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 à 6h

Rendu attendu

  • compliance/checks.yaml, compliance/audit.py, versionnés.
  • Un exemple de rapport_conformite.md gé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.