Automatisation de l'enrichissement des IOC
Quand l'utiliser
Utilisez cette compétence quand :
- Vous construisez un playbook SOAR qui enrichit automatiquement les alertes SIEM avec le contexte des renseignements sur les menaces avant de les router vers les analystes.
- Vous créez un pipeline Python pour l'enrichissement en masse des IOC à partir de soumissions de courriels de phishing.
- Vous souhaitez réduire le temps moyen de triage (MTTT) des analystes en pré-remplissant le contexte des alertes avec les données de VT, Shodan et MISP.
N'utilisez pas cette compétence pour des décisions de blocage entièrement automatisées sans examen humain — l'automatisation de l'enrichissement doit éclairer les décisions, et non exécuter des blocages en autonomie pour des actions à fort impact.
Prérequis
- Plateforme SOAR (Cortex XSOAR, Splunk SOAR, Tines ou n8n) ou environnement Python 3.9+
- Clés API : VirusTotal, AbuseIPDB, Shodan et au moins un TIP (MISP ou OpenCTI)
- Point d'intégration SIEM pour la consommation d'alertes
- Budgets de limites de débit documentés par API (VT : 4/min gratuit, 500/min entreprise)
Workflow
Étape 1 : Concevoir l'architecture du pipeline d'enrichissement
Définissez le flux d'enrichissement pour chaque type d'IOC :
Alerte SIEM → Extraire les IOC → Classifier le type → Router vers les fonctions d'enrichissement
Adresse IP → AbuseIPDB + Shodan + VirusTotal IP + MISP
Domaine → VirusTotal Domaine + PassiveTotal + Shodan + MISP
URL → URLScan.io + VirusTotal URL + Google Safe Browsing
Empreinte de fichier → VirusTotal Fichiers + MalwareBazaar + MISP
→ Agréger les résultats → Calculer le score de confiance → Mettre à jour l'alerte → Notifier l'analyste
Étape 2 : Implémenter les fonctions Python d'enrichissement
import requests
import time
from dataclasses import dataclass, field
from typing import Optional
RATE_LIMIT_DELAY = 0.25 # 4 requêtes/seconde pour le niveau gratuit VT
@dataclass
class EnrichmentResult:
ioc_value: str
ioc_type: str
vt_malicious: int = 0
vt_total: int = 0
abuse_confidence: int = 0
shodan_ports: list = field(default_factory=list)
misp_events: list = field(default_factory=list)
confidence_score: int = 0
def enrich_ip(ip: str, vt_key: str, abuse_key: str, shodan_key: str) -> EnrichmentResult:
result = EnrichmentResult(ip, "ip")
# Recherche VirusTotal IP
vt_resp = requests.get(
f"https://www.virustotal.com/api/v3/ip_addresses/{ip}",
headers={"x-apikey": vt_key}
)
if vt_resp.status_code == 200:
stats = vt_resp.json()["data"]["attributes"]["last_analysis_stats"]
result.vt_malicious = stats.get("malicious", 0)
result.vt_total = sum(stats.values())
time.sleep(RATE_LIMIT_DELAY)
# AbuseIPDB
abuse_resp = requests.get(
"https://api.abuseipdb.com/api/v2/check",
headers={"Key": abuse_key, "Accept": "application/json"},
params={"ipAddress": ip, "maxAgeInDays": 90}
)
if abuse_resp.status_code == 200:
result.abuse_confidence = abuse_resp.json()["data"]["abuseConfidenceScore"]
# Calculer le score de confiance composite
result.confidence_score = min(
(result.vt_malicious / max(result.vt_total, 1)) * 60 +
(result.abuse_confidence / 100) * 40, 100
)
return result
def enrich_hash(sha256: str, vt_key: str) -> EnrichmentResult:
result = EnrichmentResult(sha256, "sha256")
vt_resp = requests.get(
f"https://www.virustotal.com/api/v3/files/{sha256}",
headers={"x-apikey": vt_key}
)
if vt_resp.status_code == 200:
stats = vt_resp.json()["data"]["attributes"]["last_analysis_stats"]
result.vt_malicious = stats.get("malicious", 0)
result.vt_total = sum(stats.values())
result.confidence_score = int((result.vt_malicious / max(result.vt_total, 1)) * 100)
return result
Étape 3 : Construire le playbook SOAR (Cortex XSOAR)
Dans Cortex XSOAR, créez un playbook d'enrichissement :
- Déclencheur : Alerte créée dans le SIEM (via webhook ou interrogation périodique)
- Extraire les IOC : Utilisez la tâche "Extraire les indicateurs" avec des motifs regex pour IP, domaine, URL, empreinte
- Enrichissement parallèle : Déployez en éventail vers plusieurs tâches d'enrichissement simultanément
- Enrichissement VT : Appelez les commandes
!vt-file-scanou!vt-ip-scan - Vérification AbuseIPDB : Appelez la commande
!abuseipdb-check-ip - Recherche MISP : Appelez
!misp-searchpour le croisement - Agrégation de score : Tâche de transformation Python calculant le score composite
- Routage conditionnel : Si score ≥70 → File d'attente Haute priorité ; si 40–69 → Moyenne ; <40 → Fermeture automatique avec note
- Enrichissement de l'alerte : Écrire les résultats d'enrichissement dans le contexte de l'alerte pour la vue de l'analyste
Étape 4 : Gérer les limites de débit et les échecs
import time
from functools import wraps
def rate_limited(max_per_second):
min_interval = 1.0 / max_per_second
def decorator(func):
last_called = [0.0]
@wraps(func)
def wrapper(*args, **kwargs):
elapsed = time.time() - last_called[0]
wait = min_interval - elapsed
if wait > 0:
time.sleep(wait)
result = func(*args, **kwargs)
last_called[0] = time.time()
return result
return wrapper
return decorator
def retry_on_429(max_retries=3):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
for attempt in range(max_retries):
response = func(*args, **kwargs)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 60))
time.sleep(retry_after)
else:
return response
return wrapper
return decorator
Étape 5 : Métriques et réglage
Suivez les performances du pipeline chaque semaine :
- Latence d'enrichissement : Objectif <30 secondes entre le déclenchement de l'alerte et la sortie enrichie
- Taux de réussite des API : Objectif >99 % (identifier les événements de limite de débit ou d'indisponibilité)
- Taux de vrais positifs : Suivre les annulations par les analystes des scores de confiance automatisés
- Coût : Suivre le volume d'appels API par rapport au budget (VT Enterprise : X $ pour 1 million de recherches)
Concepts clés
| Terme | Définition |
|---|---|
| SOAR | Security Orchestration, Automation, and Response — plateforme pour automatiser les workflows de sécurité et intégrer des outils disparates |
| Playbook d'enrichissement | Séquence de workflow automatisée qui ajoute du contexte intelligent aux événements de sécurité bruts |
| Limitation de débit | Restrictions des fournisseurs d'API sur la fréquence des requêtes (par exemple, VT gratuit : 4 requêtes/minute) ; les pipelines doivent respecter ces limites |
| Score de confiance composite | Score unique agrégeant les signaux de plusieurs sources d'enrichissement à l'aide d'une formule pondérée |
| Modèle en éventail | Exécution parallèle de plusieurs requêtes d'enrichissement simultanément pour minimiser la latence totale d'enrichissement |
Outils et systèmes
- Cortex XSOAR (Palo Alto) : SOAR entreprise avec plus de 700 intégrations marketplace incluant VT, MISP, Shodan et AbuseIPDB
- Splunk SOAR (Phantom) : Plateforme SOAR avec playbooks Python ; intégration native Splunk SIEM
- Tines : Plateforme SOAR sans code avec automatisation pilotée par webhook ; économique pour les petites équipes
- TheHive + Cortex : Plateforme open source de RI/enrichissement avec enrichissement des observables via les analyseurs Cortex
Pièges courants
- Blocage sur la latence d'enrichissement : Si l'enrichissement prend plus de 5 minutes, les analystes commencent à traiter des alertes non enrichies, ce qui va à l'encontre de l'objectif. Définissez des délais d'attente et fournissez des résultats partiels.
- Absence de cache : Interroger le même IOC 50 fois génère des coûts d'API inutiles. Mettez en cache les résultats d'enrichissement pendant 24 heures par défaut.
- Ignorer les échecs d'API silencieusement : Les appels d'enrichissement échoués doivent être journalisés et déclencher une logique de repli, et non produire silencieusement des résultats vides qui apparaissent comme des IOC propres.
- Automatiser les blocages uniquement sur le score d'enrichissement : Les scores composites contiennent des faux positifs ; exigez une confirmation humaine pour les décisions de blocage contre une infrastructure partagée.