Cybersécurité augmentée par graphe de connaissances

Détection avancée des menaces et réponse automatisée

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.
06

💰 Bénéfices et ROI

-90%
faux positifs
-80%
temps d'investigation
-70%
temps de détection (MTTD)
-60%
temps de réponse (MTTR)
📈 Cas réel : Entreprise du CAC 40 (50 000 collaborateurs)
  • Avant : 15 000 alertes/jour, 5 analystes temps plein, MTTD = 48h
  • Après (Security Knowledge Graph) : 1 500 alertes/jour (-90%), MTTD = 2h (-96%)
  • Économie : 2M€/an de coûts d'analyse
  • Incidents évités : 3 attaques majeures détectées tôt (estimation 5M€ évités)
  • ROI : 850% la première année
🏆 Autres bénéfices :
  • ✅ Conformité réglementaire (NIS2, DORA, RGPD) facilitée
  • ✅ Reporting automatique pour la direction
  • ✅ Réduction de la fatigue des analystes (moins de FP)
  • ✅ Détection des menaces inconnues (patterns implicites)
  • ✅ Base de connaissances cyber qui s'enrichit en continu
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."