Audit de sécurité et certification
De la sécurité ad hoc à la conformité certifiable
Les lecons précédentes vous ont donné les outils techniques pour sécuriser un système IA. Mais la sécurité ponctuelle ne suffit pas : les clients, les régulateurs et les partenaires exigent des preuves formelles. L’audit de sécurité et la certification transforment vos pratiques en un cadre vérifiable et continu.
Cadres de référence pour l’audit IA
Les standards applicables
| Standard | Portée | Pertinence IA |
|---|---|---|
| ISO 27001 | Sécurité de l'information | Base pour tout système traitant des données |
| ISO 42001 | Management de l'IA | Spécifique IA : gouvernance, risques, cycle de vie |
| AI Act (UE) | Réglementation européenne | Obligatoire pour les systèmes à haut risque en UE |
| SOC 2 Type II | Contrôles de sécurité SaaS | Requis par les clients entreprise |
| OWASP LLM Top 10 | Bonnes pratiques sécurité LLM | Checklist de référence pour l'audit technique |
Construire un programme d’audit
Checklist d’audit sécurité IA
from dataclasses import dataclass, field
from datetime import datetime
@dataclass
class PointControle:
id: str
categorie: str
description: str
criticite: str # obligatoire, recommande, optionnel
conforme: bool | None = None
preuve: str = ""
commentaire: str = ""
def creer_checklist_audit() -> list[PointControle]:
"""Crée une checklist complète d'audit sécurité IA."""
return [
# Gouvernance
PointControle("GOV-01", "Gouvernance",
"Politique de sécurité IA documentée et approuvée", "obligatoire"),
PointControle("GOV-02", "Gouvernance",
"Responsable sécurité IA désigné (CISO/DPO)", "obligatoire"),
PointControle("GOV-03", "Gouvernance",
"Registre des traitements IA à jour", "obligatoire"),
# Données
PointControle("DAT-01", "Données",
"Inventaire des données envoyées aux APIs LLM", "obligatoire"),
PointControle("DAT-02", "Données",
"Anonymisation/pseudonymisation des données personnelles", "obligatoire"),
PointControle("DAT-03", "Données",
"DPA signé avec chaque fournisseur d'API IA", "obligatoire"),
PointControle("DAT-04", "Données",
"Politique de rétention des conversations définie", "obligatoire"),
# Sécurité technique
PointControle("SEC-01", "Sécurité",
"Prompt injection : défenses en profondeur implémentées", "obligatoire"),
PointControle("SEC-02", "Sécurité",
"Filtrage de contenu (entrées et sorties)", "obligatoire"),
PointControle("SEC-03", "Sécurité",
"Rate limiting et détection d'abus", "obligatoire"),
PointControle("SEC-04", "Sécurité",
"Clés API stockées dans un vault (pas en dur)", "obligatoire"),
PointControle("SEC-05", "Sécurité",
"Sandboxing pour l'exécution de code généré", "recommande"),
PointControle("SEC-06", "Sécurité",
"Monitoring et alertes sur les anomalies", "recommande"),
# Red teaming
PointControle("RED-01", "Red teaming",
"Tests de sécurité avant chaque mise en production", "obligatoire"),
PointControle("RED-02", "Red teaming",
"Red teaming régulier (trimestriel minimum)", "recommande"),
PointControle("RED-03", "Red teaming",
"Rapport de red teaming avec suivi des remédiations", "obligatoire"),
# Conformité
PointControle("CONF-01", "Conformité",
"AIPD réalisée pour les traitements IA", "obligatoire"),
PointControle("CONF-02", "Conformité",
"Droits des personnes implémentés (accès, effacement)", "obligatoire"),
PointControle("CONF-03", "Conformité",
"Information transparente aux utilisateurs sur l'usage de l'IA", "obligatoire"),
PointControle("CONF-04", "Conformité",
"Classification du risque selon l'AI Act", "recommande"),
]
Exécution de l’audit
class AuditSecuriteIA:
"""Exécute et documente un audit de sécurité IA."""
def __init__(self, nom_systeme: str, auditeur: str):
self.nom_systeme = nom_systeme
self.auditeur = auditeur
self.date = datetime.now().strftime("%Y-%m-%d")
self.checklist = creer_checklist_audit()
def evaluer(self, point_id: str, conforme: bool, preuve: str, commentaire: str = ""):
"""Évalue un point de contrôle."""
for point in self.checklist:
if point.id == point_id:
point.conforme = conforme
point.preuve = preuve
point.commentaire = commentaire
return
raise ValueError(f"Point de contrôle inconnu : {point_id}")
def rapport(self) -> dict:
"""Génère le rapport d'audit."""
evalues = [p for p in self.checklist if p.conforme is not None]
conformes = [p for p in evalues if p.conforme]
non_conformes = [p for p in evalues if not p.conforme]
non_evalues = [p for p in self.checklist if p.conforme is None]
# Non-conformités obligatoires = bloquantes
bloquantes = [
p for p in non_conformes if p.criticite == "obligatoire"
]
return {
"systeme": self.nom_systeme,
"auditeur": self.auditeur,
"date": self.date,
"total_controles": len(self.checklist),
"evalues": len(evalues),
"conformes": len(conformes),
"non_conformes": len(non_conformes),
"non_evalues": len(non_evalues),
"bloquantes": len(bloquantes),
"taux_conformite": f"{len(conformes) / max(len(evalues), 1) * 100:.0f}%",
"decision": "NON CONFORME" if bloquantes else "CONFORME",
"non_conformites_bloquantes": [
{"id": p.id, "description": p.description, "commentaire": p.commentaire}
for p in bloquantes
],
}
# Exemple d'utilisation
audit = AuditSecuriteIA("Chatbot Service Client v2.3", "analyste_securite")
audit.evaluer("GOV-01", True, "Document POL-SEC-IA-2026 approuvé le 15/01/2026")
audit.evaluer("SEC-01", True, "Guardrails multi-couche implémentés (voir architecture)")
audit.evaluer("SEC-04", False, "Clé API OpenAI en variable d'environnement .env",
"Migrer vers un vault (HashiCorp Vault ou AWS Secrets Manager)")
resultat = audit.rapport()
print(f"Décision : {resultat['decision']}")
print(f"Taux de conformité : {resultat['taux_conformite']}")
Audit continu et automatisé
class AuditContinu:
"""Vérifie automatiquement les contrôles de sécurité en continu."""
def __init__(self):
self.verifications = {}
def ajouter_verification(self, nom: str, fonction_check):
"""Ajoute une vérification automatisée."""
self.verifications[nom] = fonction_check
def executer(self) -> dict:
"""Exécute toutes les vérifications."""
resultats = {}
for nom, check in self.verifications.items():
try:
ok, detail = check()
resultats[nom] = {"statut": "OK" if ok else "ECHEC", "detail": detail}
except Exception as e:
resultats[nom] = {"statut": "ERREUR", "detail": str(e)}
return resultats
# Vérifications automatisées
audit_continu = AuditContinu()
def check_cles_api():
"""Vérifie qu'aucune clé API n'est en dur dans le code."""
import subprocess
result = subprocess.run(
["grep", "-r", "sk-", "src/", "--include=*.py", "-l"],
capture_output=True, text=True,
)
fichiers = result.stdout.strip().split("\n") if result.stdout.strip() else []
return len(fichiers) == 0, f"{len(fichiers)} fichier(s) avec clé en dur"
def check_rate_limiting():
"""Vérifie que le rate limiting est actif."""
return True, "Rate limiting actif (429 après 20 req/min)"
def check_moderation():
"""Vérifie que la modération est active sur le pipeline."""
return True, "API Moderation appelée sur entrées et sorties"
audit_continu.ajouter_verification("cles_api_securisees", check_cles_api)
audit_continu.ajouter_verification("rate_limiting_actif", check_rate_limiting)
audit_continu.ajouter_verification("moderation_active", check_moderation)
Préparer une certification
La certification (ISO 42001, SOC 2) nécessite :
- Documentation — politiques, procédures, registres à jour
- Preuves — logs, rapports de test, captures d’écran
- Historique — montrer que les contrôles sont en place depuis plusieurs mois
- Formation — prouver que l’équipe est formée aux risques IA
- Amélioration continue — montrer que les trouvailles sont corrigées et retestées
Points clés à retenir
- L’audit transforme les bonnes pratiques de sécurité en preuves vérifiables
- La checklist couvre gouvernance, données, sécurité technique, red teaming et conformité
- Les non-conformités obligatoires sont bloquantes — elles doivent être corrigées avant déploiement
- L’audit continu automatise les vérifications répétitives (clés API, rate limiting, modération)
- La certification (ISO 42001, SOC 2) demande documentation, preuves et historique
- Le cycle audit, correction, retest, certification est un processus continu, pas un événement ponctuel