Sistema di analisi del traffico di rete basato su Suricata e Large Language Models (LLM) per l'identificazione intelligente di minacce e anomalie.
- Panoramica
- Architettura
- Componenti
- Flusso di Elaborazione
- Installazione
- Configurazione
- Utilizzo
- Funzionalità Avanzate
- Output
Il sistema combina l'analisi tradizionale di Suricata con l'intelligenza artificiale per:
- Correlare flussi di rete e alert di sicurezza
- Identificare pattern sospetti e falsi positivi
- Fornire analisi contestuali con informazioni su vulnerabilità (CVE)
- Ridurre le allucinazioni del modello LLM attraverso guardrails e esempi few-shot
Il sistema è composto da due componenti principali che lavorano in pipeline (con Polar Proxy opzionale):
Architettura Base:
Suricata (eve.json)
↓
[realtime.go] → Estrazione e correlazione flussi/alert
↓
flow_records_llm_ready.json
↓
[tokrealtime.py] → Analisi LLM con guardrails e RAG
↓
flow_rationale.txt + Analisi JSON
Architettura con Polar Proxy (Opzionale):
Traffico di Rete
↓
[Polar Proxy] → Decodifica TLS/SSL
↓
Traffico Decrittografato → Suricata
↓
eve.json
↓
[realtime.go] → Estrazione e correlazione flussi/alert
↓
flow_records_llm_ready.json
↓
[tokrealtime.py] → Analisi LLM con guardrails e RAG
↓
flow_rationale.txt + Analisi JSON
Scopo: Legge i log di Suricata in tempo reale, estrae features dai flussi e correlazioni con gli alert, producendo rappresentazioni ottimizzate per l'analisi LLM.
Funzionalità principali:
- Lettura real-time: Monitora continuamente
/var/log/suricata/eve.json - Estrazione features:
- Categorizzazione porte (http, https, ssh, dns, ecc.)
- Classificazione durata (instant, short, medium, long, persistent)
- Categorizzazione volume (minimal, small, medium, large, massive)
- Classificazione IP (internal, external, loopback, multicast, reserved)
- Generazione pattern signature basati su durata, volume, direzione, categoria porta e flag TCP
- Calcolo indicatori di rischio:
- Analisi porte ad alto rischio (445, 135, 139, 1433, 3389)
- Rilevamento burst di banda
- Anomalie TCP (RST su SYN)
- Attività IP sospetta (possibili DoS)
- Cooldown per evitare allarmi ripetuti dallo stesso IP
- Correlazione flussi-alert: Raggruppa alert per
flow_id - Rappresentazione LLM: Genera rappresentazioni testuali e token compatte per l'analisi
Output: File JSON con flussi arricchiti (flow_records_llm_ready.json)
Scopo: Analizza i flussi processati utilizzando un LLM locale (Ollama) con tecniche avanzate per ridurre falsi positivi e allucinazioni.
Funzionalità principali:
- Buffer temporale: Raccoglie flussi per 20 secondi (configurabile)
- Soglie minime: Richiede almeno 5 flussi per analisi batch
- Limite massimo: Analizza al massimo 15 flussi per batch
La funzione _apply_guardrails() implementa:
-
Whitelist falsi positivi: Pattern noti come benigni:
port_scan_known_fp: Scan di porte noti come falsi positivibenign_browse: Navigazione web normalelegit_bruteforce: Tentativi di autenticazione legittimi
-
Regole deterministiche:
- Se Suricata severity ≥ 2 → livello minimo "high"
- Se severity ≥ 3 o alert totali ≥ 10 → livello minimo "critical"
- Pattern whitelist → abbassa livello a "medium"
- Pattern critici (scan, flood, bruteforce, exploit) → aumenta a "high"
Include nel prompt esempi esplicativi:
- Esempio 1: Falso positivo benigno (scan senza evidenze di attacco)
- Esempio 2: Allarme reale (brute force con evidenze multiple)
Questi esempi aiutano il modello a distinguere meglio tra falsi positivi e minacce reali.
- Caricamento CVE: Legge dati CVE da file JSON (NVD)
- Indicizzazione: Crea indici per servizio e porta
- Retrieval contestuale: Estrae CVE rilevanti per i flussi nel batch
- Ranking: Ordina CVE per:
- CVSS score
- Presenza in KEV (Known Exploited Vulnerabilities)
- Numero di riferimenti
- Inclusione nel prompt: Aggiunge blocco
<candidate_cves>con CVE più pertinenti
Mantiene traccia degli ultimi 4 batch analizzati per:
- Livelli di minaccia recenti (con peso decrescente)
- Pattern dominanti osservati
- Minacce confermate
- Flussi con ≥ 5 alert vengono marcati come "malicious" e scritti direttamente nel file rationale senza analisi LLM
- Flussi con severity > 3 possono essere analizzati immediatamente (se
HIGH_RISK_IMMEDIATE = True)
Scopo: Polar Proxy è uno strumento opzionale che decodifica il traffico TLS/SSL, permettendo a Suricata di analizzare traffico HTTPS che altrimenti sarebbe opaco.
Quando utilizzarlo:
- Analisi di traffico HTTPS crittografato
- Necessità di ispezionare contenuti web per rilevare minacce
- Analisi di applicazioni che utilizzano TLS/SSL
Funzionalità:
- Decodifica TLS/SSL: Intercetta e decodifica connessioni TLS/SSL in tempo reale
- MITM (Man-in-the-Middle): Agisce come proxy trasparente per decrittografare traffico
- Output per Suricata: Fornisce traffico decrittografato a Suricata per analisi approfondita
- Logging: Genera log del traffico decrittografato
Integrazione con il sistema:
Con Polar Proxy, l'architettura diventa:
Traffico di Rete
↓
[Polar Proxy] → Decodifica TLS/SSL
↓
Traffico Decrittografato
↓
[Suricata] → Analisi IDS/IPS
↓
eve.json
↓
[realtime.go] → Estrazione e correlazione
↓
flow_records_llm_ready.json
↓
[tokrealtime.py] → Analisi LLM
↓
flow_rationale.txt
Configurazione:
-
Installazione Polar Proxy:
- Scaricare da PolarProxy.com
- Installare seguendo le istruzioni per il sistema operativo
-
Configurazione come Proxy:
# Avvio Polar Proxy su porta 8080 (esempio) polarproxy --listen 0.0.0.0:8080 --cert cert.pem --key key.pem -
Configurazione Suricata per ricevere da Polar Proxy:
- Configurare Suricata per ascoltare sul traffico proveniente da Polar Proxy
- Oppure configurare Polar Proxy per inoltrare a Suricata via mirroring
-
Configurazione Client/Server:
- Configurare i client per utilizzare Polar Proxy come proxy HTTP/HTTPS
- Oppure utilizzare tecniche di port mirroring/spanning
Note importanti:
- Polar Proxy richiede certificati SSL per funzionare (generati o forniti)
- Il traffico decrittografato può contenere informazioni sensibili
- Assicurarsi di rispettare le normative sulla privacy e la sicurezza dei dati
- Polar Proxy è uno strumento commerciale (con versione di prova disponibile)
Alternativa senza Polar Proxy: Il sistema funziona perfettamente anche senza Polar Proxy, analizzando:
- Metadati di connessione (IP, porte, durata, volume)
- Pattern di traffico (senza contenuto payload)
- Alert Suricata basati su signature e comportamenti
- Anomalie di rete rilevabili senza decodifica TLS
- Lettura real-time di
eve.json(Suricata) - Parsing eventi:
flow: Estrae features del flussoalert: Estrae informazioni di sicurezzatls: Ignorato per ora
- Calcolo metriche:
- Durata, volume, ratio upload/download
- Categorizzazioni (porta, durata, volume, IP)
- Pattern signature
- Indicatori di rischio
- Correlazione: Raggruppa alert per
flow_id - Scadenza flussi: Dopo 5 secondi di inattività, il flusso viene finalizzato
- Output: Scrive record JSON arricchito
- Lettura di
flow_records_llm_ready.json - Buffering: Accumula flussi per 20 secondi o fino a 15 flussi
- Preprocessing:
- Estrazione CVE rilevanti (RAG)
- Costruzione contesto memoria
- Preparazione prompt con esempi few-shot
- Analisi LLM: Invio a Ollama (modello llama3)
- Post-processing:
- Estrazione JSON dalla risposta
- Applicazione guardrails
- Logging risultati
- Output: Scrive rationale in
flow_rationale.txt
- Go 1.19+ (per
realtime.go) - Python 3.8+ (per
tokrealtime.py) - Ollama con modello
llama3installato - Suricata configurato per scrivere
eve.json - Polar Proxy (opzionale) - Solo se si desidera analizzare traffico TLS/SSL decrittografato
pip install requestsIl sistema richiede un file JSON con dati CVE dal National Vulnerability Database (NVD):
- Path:
/home/peppe/Desktop/go/combined_cve_data.json - Formato: Array di oggetti CVE con campi:
id: ID CVEdescription: Descrizione vulnerabilitàcvss: Oggetto conbaseScoreevectorStringservices: Array di servizi associatireferences: Array di riferimentikevocisaKnownExploited: Flag per vulnerabilità sfruttate
Modificare le costanti all'inizio del file:
const (
InputFile = "/var/log/suricata/eve.json"
OutputFile = "/home/peppe/Desktop/suricata_output/flow_records_llm_ready.json"
MaxPayloadLen = 100
)E il tempo di scadenza flussi (nel main):
processor := NewLLMFlowProcessor(OutputFile, 5) // 5 secondiModificare le variabili di configurazione:
INPUT_FILE = "/home/peppe/Desktop/suricata_output/flow_records_llm_ready.json"
LLAMA_API_URL = "http://localhost:11434/api/generate"
LLAMA_MODEL = "llama3"
CVE_DATA_FILE = "/home/peppe/Desktop/go/combined_cve_data.json"
BATCH_TIME_WINDOW = 20 # Analizza ogni 20 secondi
MIN_FLOWS_PER_BATCH = 5 # Minimo 5 flussi per batch
MAX_FLOWS_PER_BATCH = 15 # Limite massimo per analisi batch
HIGH_RISK_IMMEDIATE = False # Analisi immediata per flussi ad alto rischioSe si desidera utilizzare Polar Proxy per decodificare traffico TLS/SSL:
-
Avviare Polar Proxy (prima di Suricata):
# Esempio configurazione base polarproxy --listen 0.0.0.0:8080 --cert /path/to/cert.pem --key /path/to/key.pem -
Configurare Suricata per analizzare il traffico proveniente da Polar Proxy
-
Avviare Suricata (vedi sezione seguente)
cd live
go run realtime.goIl processo rimane in esecuzione e monitora continuamente i log di Suricata.
In un altro terminale:
cd live
python3 tokrealtime.pyOppure dalla directory root:
python3 tokrealtime.pyNota: Polar Proxy è completamente opzionale. Il sistema funziona correttamente anche senza di esso, analizzando metadati e pattern di traffico senza decodifica TLS.
# Processore flussi
nohup go run realtime.go > realtime.log 2>&1 &
# Analizzatore LLM
nohup python3 tokrealtime.py > analyzer.log 2>&1 &Il sistema implementa diverse strategie:
- Whitelist pattern: Pattern noti come benigni riducono automaticamente il livello di rischio
- Guardrails deterministici: Regole hard-coded che sovrascrivono decisioni LLM errate
- Esempi few-shot: Il modello impara da esempi di falsi positivi vs minacce reali
- Cooldown IP: Evita allarmi ripetuti dallo stesso IP in finestre temporali brevi
Per ogni batch di flussi:
- Identifica servizi e porte utilizzate
- Recupera CVE rilevanti dal database NVD
- Include CVE top-ranked nel prompt LLM
- Permette al modello di valutare plausibilità di exploit basati su vulnerabilità note
Il sistema mantiene memoria degli ultimi batch per:
- Rilevare pattern ricorrenti
- Evitare downgrade ingiustificati del livello di minaccia
- Fornire contesto temporale all'analisi
File JSON con un record per riga, contenente:
timestamp: Timestamp del flussoflow_id: ID univoco del flussollm_representation: Rappresentazione testuale per LLMllm_tokens: Rappresentazione compatta tokenizzataraw_flow: Oggetto Flow completo con tutte le featurescorrelated_alerts: Array di alert Suricata correlatialert_count: Numero totale di alertmax_alert_severity: Severity massima tra gli alert
File di testo con una riga per flusso analizzato:
<flow_id> [<timestamp>]: <motivazione_analisi>
Esempio:
12345 [2024-01-15T10:30:00Z]: Pattern matches known benign behavior without Suricata evidence
67890 [2024-01-15T10:30:05Z]: High Suricata severity and repeated failures from same IP
L'analizzatore LLM stampa su console:
- Livello di minaccia rilevato (con emoji: 🟢 low, 🟡 medium, 🟠 high, 🔴 critical)
- Risultati chiave
- Motivazioni per-flow
- Errori o problemi
Un batch tipico potrebbe contenere:
- 8 flussi HTTP/HTTPS
- 2 flussi SSH
- 1 flusso con pattern "short_small_upload_heavy_http_SYN_ACK"
- 1 alert Suricata severity 2
Il sistema:
- Estrae CVE rilevanti per HTTP/HTTPS e SSH
- Costruisce prompt con contesto, memoria, CVE ed esempi
- Invia a LLM per analisi
- Applica guardrails (severity 2 → minimo "high")
- Se pattern è whitelist, abbassa a "medium"
- Scrive rationale con motivazione
Verificare che Ollama sia in esecuzione:
curl http://localhost:11434/api/generateVerificare che il modello sia installato:
ollama listIl sistema continuerà a funzionare senza CVE, ma senza contesto vulnerabilità. Verificare il path in CVE_DATA_FILE.
Verificare che Suricata sia configurato per scrivere eve.json nel path specificato in InputFile.
Verificare:
- Che
realtime.gostia scrivendo inflow_records_llm_ready.json - Che
tokrealtime.pystia leggendo dallo stesso file - Che ci siano almeno 5 flussi nel buffer per triggerare analisi batch
- Il sistema è progettato per analisi real-time, ma può essere adattato per analisi batch di file storici
- La configurazione attuale è ottimizzata per ridurre falsi positivi, ma può essere regolata modificando le guardrails
- Il modello LLM può essere cambiato modificando
LLAMA_MODEL(richiede modello compatibile con Ollama)
- Il sistema legge solo log di Suricata e non modifica configurazioni di rete
- I file di output contengono informazioni sensibili (IP, pattern di traffico) e dovrebbero essere protetti
- L'accesso a Ollama è locale e non espone dati all'esterno