01
📊 Contexte et enjeux
Les cyberattaques coûtent en moyenne 4,5M$ par incident en 2025. Le délai moyen de détection d'une menace est encore de 287 jours. Les équipes SOC (Security Operations Center) sont submergées par 10 000+ alertes par jour, dont 99% sont des faux positifs.
4,5M$
coût moyen par incident
287j
délai moyen de détection
10k+
alertes/jour (99% FP)
70%
des attaques non détectées
💡 L'opportunité : Un graphe de connaissances cyber permet de corréler des alertes isolées en une campagne d'attaque cohérente, réduisant les faux positifs et accélérant la réponse.
02
❌ Limites des approches classiques
🔗 La chaîne d'attaque (Cyber Kill Chain) :
Reconnaissance → Arme → Livraison → Exploitation → Installation → C&C → Exfiltration
Problème : Chaque étape est détectée isolément, sans contexte
⚠️ Limites des SIEM classiques :
- Alertes indépendantes, pas de corrélation temporelle/logique
- Pas de compréhension des relations entre entités (IP, utilisateurs, processus)
- Faux positifs massifs → fatigue des analystes
- Impossible de répondre à "quel est le chemin d'attaque complet ?"
- Règles statiques, inefficaces face aux nouvelles menaces
03
🧠 Solution : Security Knowledge Graph
🏗️ Architecture Security Knowledge Graph :
┌─────────────────────────────────────────────────────────────┐
│ SOURCES │
│ Firewall │ EDR │ IDS │ SIEM │ Threat Intel │ Logs système │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ SECURITY KNOWLEDGE GRAPH │
│ Entités : IP, User, Host, Process, File, Attack Pattern │
│ Relations : accède, exécute, télécharge, communique_avec │
│ Inférences : détection de campagne, prédiction prochaine étape│
└─────────────────────────────────────────────────────────────┘
│
┌────────────┬────────────┼────────────┬────────────┐
▼ ▼ ▼ ▼ ▼
Détection Investigation Réponse Threat Reporting
temps réel augmentée automatisée Hunting
Ontologie cyber sécurité
@prefix : <http://security.example.org/ontology#> .
@prefix stix: <https://oasis-open.org/cti/stix/v2.1/> .
# Entités cyber
:IP a owl:Class .
:Host a owl:Class .
:Utilisateur a owl:Class .
:Processus a owl:Class .
:Fichier a owl:Class .
:Alerte a owl:Class .
:Incident a owl:Class .
:AttaquePattern a owl:Class ; rdfs:subClassOf stix:AttackPattern .
:IOC a owl:Class . # Indicator of Compromise
# Relations temporelles et logiques
:aPourIPSource a owl:ObjectProperty .
:aPourIPDestination a owl:ObjectProperty .
:estExécutéSur a owl:ObjectProperty .
:estLancéPar a owl:ObjectProperty .
:aCréé a owl:ObjectProperty .
:estLiéÀIncident a owl:ObjectProperty .
:précèdeTemporellement a owl:ObjectProperty .
:estUneÉtapeDe a owl:ObjectProperty .
# Règle : Détection de campagne
[ (:aPourIPSource ?a1 ?ip), (:aPourIPSource ?a2 ?ip), (?a1 != ?a2),
(:estUneÉtapeDe ?a1 ?pattern), (:estUneÉtapeDe ?a2 ?pattern)
-> (:appartientÀCampagne ?a1 ?campagne), (:appartientÀCampagne ?a2 ?campagne) ]
# Règle : Prédiction prochaine étape
[ (:appartientÀCampagne ?a ?c), (:estUneÉtapeDe ?a ?e),
(:aPourÉtapeSuivante ?e ?next)
-> (:préditProchaineÉtape ?c ?next) ]
04
⚙️ Architecture technique
Détection et corrélation avancée
class SecurityKnowledgeGraph:
def __init__(self, kg, vector_db, llm):
self.kg = kg
self.vector_db = vector_db
self.llm = llm
self.alert_queue = []
def ingest_alert(self, alert):
"""Ingestion d'une alerte depuis SIEM, EDR, Firewall"""
# 1. Normalisation
normalized = self.normalize_alert(alert)
# 2. Insertion dans le graphe
alert_id = self.insert_alert(normalized)
# 3. Corrélation avec alertes précédentes
related = self.find_related_alerts(normalized)
if related:
# Lie l'alerte à un incident existant
incident = self.attach_to_incident(alert_id, related)
# 4. Prédiction de la prochaine étape
next_steps = self.predict_next_attack_steps(incident)
if next_steps:
self.raise_proactive_alert(next_steps)
else:
# Nouvel incident potentiel
self.create_new_incident(alert_id)
# 5. Enrichissement avec Threat Intelligence
self.enrich_with_threat_intel(alert_id)
return alert_id
def find_related_alerts(self, alert):
"""Trouve les alertes liées par IP, utilisateur, host, pattern"""
query = f"""
SELECT ?alert WHERE {{
{{
?alert :aPourIPSource "{alert['src_ip']}" .
}} UNION {{
?alert :aPourIPDestination "{alert['dst_ip']}" .
}} UNION {{
?alert :estExécutéSur "{alert['host']}" .
}} UNION {{
?alert :estLancéPar "{alert['user']}" .
}}
FILTER(?alert != :alert_{alert['id']})
FILTER(?date > NOW() - "1h"^^xsd:duration)
}}
"""
return self.kg.query(query)
def predict_next_attack_steps(self, incident_id):
"""Prédiction de la prochaine étape d'attaque via graphe + LLM"""
incident = self.kg.get_incident(incident_id)
# Récupération du pattern d'attaque détecté
pattern = incident['attack_pattern']
# Requête du graphe pour les étapes suivantes connues
next_steps = self.kg.query(f"""
SELECT ?step WHERE {{
:{pattern} :aPourÉtapeSuivante ?step .
}}
""")
if next_steps:
return next_steps
# Fallback : LLM pour prédiction probabiliste
prediction = self.llm.predict(f"""
Pattern d'attaque détecté: {pattern}
Étapes déjà observées: {incident['observed_steps']}
Quelle est la prochaine étape la plus probable ?
""")
return prediction
def generate_incident_report(self, incident_id):
"""Génération automatisée de rapport d'incident"""
incident = self.kg.get_incident(incident_id)
report = self.llm.generate(f"""
Génère un rapport d'incident cyber pour la direction:
Incident ID: {incident_id}
Détection: {incident['first_seen']}
Pattern: {incident['attack_pattern']}
Alertes associées: {incident['alerts']}
Entités compromises: {incident['compromised_assets']}
Chronologie: {incident['timeline']}
Actions recommandées: {incident['recommended_actions']}
Format: Synthèse exécutive + détails techniques + recommandations
""")
return report
def enrich_with_threat_intel(self, alert_id):
"""Enrichissement avec OSINT et Threat Intelligence feeds"""
alert = self.kg.get_alert(alert_id)
# Vérification IP malveillante
ip_reputation = self.check_ip_reputation(alert['src_ip'])
if ip_reputation['malicious']:
self.kg.insert(f"""
:alert_{alert_id} :estLiéÀThreatIntel :ti_{ip_reputation['threat_id']} ;
:niveauConfiance {ip_reputation['confidence']} .
""")
# Vérification hash de fichier
if alert.get('file_hash'):
hash_reputation = self.check_hash_reputation(alert['file_hash'])
if hash_reputation['malicious']:
self.kg.insert(f"""
:alert_{alert_id} :indicateurCompromis :{alert['file_hash']} .
""")
05
🎯 Cas d'usage concrets
🔍 Scénario 1 : Corrélation multi-alertes
Alertes reçues : (1) Scan de ports, (2) tentative de brute force, (3) téléchargement malware
Approche classique : 3 alertes indépendantes, analyste perd 45min à corréler
Graphe : Relie les 3 alertes (même IP source → même host → même utilisateur). Détecte une campagne LockBit. Temps de corrélation : 2 secondes.
🎯 Scénario 2 : Détection de mouvement latéral
Situation : Un utilisateur accède à un serveur inhabituel à 3h du matin
Graphe : Le graphe connaît le comportement normal (baseline). Détecte l'anomalie, trace le chemin de mouvement latéral, identifie tous les hôtes potentiellement compromis.
Résultat : Containment en 5 minutes (vs 4 heures en moyenne).
🔮 Scénario 3 : Prédiction proactive
Situation : Détection d'une étape 2 sur 5 d'une attaque de type "Living off the Land"
Graphe : Connaît le pattern complet via MITRE ATT&CK. Prédit les 3 prochaines étapes.
Action : Blocage préventif des IPs, augmentation surveillance sur assets critiques. Attaque stoppée avant impact.
🕵️ Scénario 4 : Threat Hunting augmenté
Requête hunter : "Trouve-moi toutes les tentatives d'accès à des bases de données depuis des IPs externes non autorisées"
Graphe : Requête SPARQL traverse les relations (IP externe → connexion → base de données → criticité). Résultat en 500ms.
Découverte : 3 accès suspects non détectés par les règles classiques.
📊 Scénario 5 : Investigation augmentée
Question analyste : "Montre-moi tout ce qu'a fait l'IP malveillante 1.2.3.4 dans les 72 dernières heures"
Graphe : Parcourt toutes les relations : connexions, fichiers téléchargés, processus créés, comptes utilisés. Génère timeline interactive.
Résultat : Investigation 10x plus rapide.
07
💬 Témoignage client
🎤 Groupe BPCE - RSSI
"Le Security Knowledge Graph a transformé notre SOC. Nous sommes passés d'une approche réactive à proactive. La détection de campagne multi-étapes, impossible avec notre SIEM classique, est devenue routinière. Le temps d'investigation a été divisé par 5."