Real-Time Cyber Anomaly Detection Platform
Project Plan, Architecture & Implementation Notes
1. Obiettivo del progetto
Sviluppare una piattaforma data-driven per il rilevamento in tempo reale di anomalie su log di rete e di sistema.
Funzionalità principali:
- acquisizione di log in tempo reale (Cowrie honeypot su VM);
- preprocessing, cleaning e feature engineering in streaming;
- detection di anomalie (brute-force, port-scan, traffic spikes, comportamenti insoliti) con modelli online/incrementali;
- visualizzazione in tempo reale su Streamlit e API REST con Flask.
2. Metodologia e framework
Metodologia di progetto: Agile (sprint settimanali, meeting quotidiani se necessario, PR/branch per ogni task).
Framework di data science scelto: CRISP-DM
Motivazione: CRISP-DM è iterativo, pratico e adatto a progetti che prevedono cicli di miglioramento continui e integrazione con sistemi di produzione (deployment + monitoring). KDD è più teorico e meno orientato al ciclo di vita continuo.
CRISP-DM adattato: 1. Business Understanding 2. Data Understanding 3. Data Preparation 4. Modeling 5. Evaluation 6. Deployment 7. Monitoring & Maintenance
3. Pipeline high-level
Cowrie VM (attacker + victim)
-> /var/log/cowrie.json
-> Flask API (Python)
-> Stream ingestion
-> ML pipeline
-> Streamlit dashboard
4. Fonti dati e come li otteniamo
- Primary source (recommended): Cowrie honeypot su VM (Oracle Cloud o VirtualBox) che scrive eventi in JSON (
/var/log/cowrie.json
). Questi log contengono login attempts, sessioni, comandi, trasferimenti di file ecc. - Backup / enrichment sources: MAWI / CAIDA (trace quotidiani), feed threat-intel (Shodan, GreyNoise, AlienVault OTX, AbuseIPDB) per arricchire gli eventi.
- Modalità di ingestione: tail del file JSON o inotify -> Flask endpoint o producer Kafka (a seconda della scala).
5. Scelte architetturali e componenti (tools)
- Ingestion / Collector: Python script (tail + requests), Filebeat (per forwarding), Kafka (per throughput e resilienza).
- API / Serving: Flask per esporre
/predict
,/logs
,/health
. - Stream processing & Online ML: River (online learning), scikit-multiflow (opzioni), Vowpal Wabbit (se serve performance).
- Storage: PostgreSQL o MongoDB per log + risultati; InfluxDB per metriche time-series.
- Dashboard: Streamlit (real-time UI).
- CI/CD & Docs: GitHub Actions (CI), MkDocs + GitHub Pages (docs).
- Monitoring: EvidentlyAI (data & model monitoring), Prometheus + Grafana (infrastruttura metrics).
- Experiment tracking: Weights & Biases o Neptune.ai.
6. Sfide previste
- Missing values — log incompleti o campi nulli.
- Data bias — honeypot attira tipologie specifiche di attacchi (non rappresentativo dell’intera rete).
- Noise & inconsistency — formati eterogenei, timestamp malformati.
- Imbalanced dataset — anomalie molto rare rispetto ai normali eventi.
7. Data Quality — metriche
Valuteremo la qualità dei dati secondo: - Accuracy — correttezza dei valori (IP, port, status). - Completeness — percentuale di campi presenti per evento. - Consistency — uniformità di formati e valori. - Timeliness — latenza tra evento e disponibilità per detection.
8. EDA (Exploratory Data Analysis)
Scopo: riassumere le caratteristiche del dataset, rilevare pattern e anomalie.
Tool suggeriti:
- pandas
, numpy
— manipolazione
- matplotlib
, seaborn
— visualizzazioni statiche
- plotly
— grafici interattivi
- ydata-profiling
(ex pandas-profiling
) — report automatico
- sweetviz
— confronto tra dataset/versioni
Attività EDA: - Conteggi per src_ip, dst_ip, porta, event_type - Serie temporali di eventi per minuto/ora - Heatmap di correlazioni tra features - Analisi di outlier (IQR, z-score) - Profiling automatizzato per report velocizzati
9. Preprocessing & cleaning (dettagli operativi)
Handling missing values:
- Se campo essenziale (es. timestamp) mancante → scartare o ricostruire.
- Numeric: imputation con median/mean (se appropriato).
- Categorical: imputation con mode o "unknown" token.
Outlier detection & treatment:
- Z-score, IQR per valori numerici (bytes, rate).
- Robust scaler se distribuzioni pesantemente skewed.
Noise reduction:
- Binning (temporal aggregation)
- Moving average per trend smoothing
Consistency checks:
- Normalizzazione timestamp a UTC e formato ISO.
- Validazione IP con regex e netaddr.
- Coerenza port/protocol mapping.
10. Feature engineering — chi lo fa e come
Responsabilità: Data Scientist con supporto ML Engineer.
Obiettivo: ridurre dimensionalità, creare variabili informative (es. failed_logins_30s, unique_ports_1min, avg_bytes_5min).
Esempi di feature: - temporal: hour_of_day, weekday, session_duration - network: src_ip_freq_30s, dst_port_entropy, avg_bytes - auth: failed_login_count_window, success_rate - derived: ratio_failed_success, is_internal_ip
Dimension reduction: useremo PCA inizialmente per features numeriche dense. - Motivazione PCA: riduce dimensionalità preservando varianza, diminuisce overfitting e costo computazionale. Utile se dopo encoding (one-hot / embeddings) lo spazio diventa molto grande. - Quando non usarlo: se serve alta interpretabilità per ogni singola feature — in tal caso preferire selezione feature per importanza.
Altre opzioni future: Autoencoders (per rappresentazioni non-lineari), LDA solo per text-topic extraction.
11. Modelli e strategia di modellazione
Tipo di apprendimento: principalmente unsupervised / semi-supervised / online (anomaly detection).
Algoritmi candidati: - Streaming / online: Hoeffding Tree (VFDT), Online Bagging/Boosting (River) - Anomaly detection: Isolation Forest (batch), One-Class SVM (batch), Autoencoders (deep), LOF - Detection drift: ADWIN, DDM (per trigger retraining/adattamento)
Scelta iniziale: River + Hoeffding Tree per classificazione online / ADWIN per drift detection; Isolation Forest come baseline offline per confronto.
RICE framework: lo useremo come guida concettuale: - Representation: feature + PCA - Information: feature selection & importance - Computation: algoritmi streaming (River) - Evaluation: metriche in streaming (precision/recall/latency)
12. Model adaptation & drift handling
- Sudden drift: Rilevamento rapido con ADWIN -> possibile retraining o switch a modello alternativo.
- Incremental drift: aggiornamento continuo (online learning).
- Recurring drift: mantenere pool di modelli con strategie di ensemble e rotazione.
13. Continuous learning — tecniche e librerie
- Online learning libs: River, Vowpal Wabbit.
- Window-based updates: aggiornamento su finestre temporali (sliding windows).
- Streaming ensembles: combinazione di modelli aggiornati localmente.
- Metriche streaming: precision@k, recall, F1 on sliding window, detection delay.
14. Ingestion / streaming infra (opzioni)
- Semplice (dev): Flask endpoint che riceve eventi JSON e li processa subito.
- Scalabile (prod/test): Filebeat -> Kafka -> stream processors -> model consumers.
- Processing engines: Apache Flink (complesso), Kafka Streams, o semplici Python consumers.
15. Deployment (serving) & dashboard
- Model serving: Flask microservice che carica il modello (pickle o joblib) e espone
/predict
e/update
. - Dashboard: Streamlit che chiama la Flask API o legge DB per ultimi eventi e anomalie.
- Storage: PostgreSQL / MongoDB (log & anomalies), InfluxDB per metriche.
- Containerization: Docker per Flask, Streamlit, worker, Kafka (dev compose).
16. CI/CD & Documentazione
- CI: GitHub Actions per lint (flake8), test (pytest), build Docker images, e deploy staging.
- Docs: MkDocs (Material) + GitHub Pages — pipeline automatica su merge a
main
. - Branching:
feature/*
per ogni task; PR ->develop
-> merge inmain
dopo review e CI passata.
17. Monitoring & Model Observability
- Data drift & model monitoring: EvidentlyAI (reports), Prometheus + Grafana (metrics).
- Alerting: webhook su slack/email quando drift o drop di metriche.
- Retraining trigger: soglia su metriche (precision, recall) o su drift detection.
18. Specific tasks: Who does what (sprint 1 example)
- Francesca (PM): repo, docs, sprint plan, kickoff, PR review.
- Francesco (Data Cloud Engineer): set up Cowrie VM, ingestion script, Kafka dev.
- Lucas (ML Engineer): baseline model (Isolation Forest), River setup, Flask API skeleton.
- All: create
docs/
, initial Streamlit skeleton, run EDA on collected logs.
19. Quick start / week 1 checklist
- Create repo with suggested structure.
- Setup Cowrie on VM (or Docker) and confirm
cowrie.json
generation. - Implement a simple Flask endpoint to ingest and store events.
- Implement a tail-to-db or tail-to-kafka producer script.
- Build a minimal Streamlit app that shows last N events (polls DB or API).
- Add CI workflow (lint + tests) to
.github/workflows/ci.yml
. - Create MkDocs skeleton in
docs/
and configure GitHub Pages.
20. Files & templates to add
docs/project_plan.md
(this file).github/workflows/ci.yml
(CI template)mkdocs.yml
+docs/index.md
(docs skeleton)src/api/flask_app.py
(Flask skeleton)src/ingestion/producer_replay.py
(replay/inject script)src/dashboard/streamlit_app.py
(basic UI)
21. Note finali e raccomandazioni
- PCA: utile come primo strumento di riduzione dimensionale. Sperimentare e valutare trade-off interpretabilità vs performance.
- Cowrie vs feed MAWI/CAIDA: Cowrie = eventi reali e variabili (consigliato, ma richiede isolamento); MAWI/CAIDA = ottimo come base storica e per replay giornaliero.
- Immediate demo: usa ingestion file->Flask->DB->Streamlit con dati di replay (1 msg/s) + injection casuale di anomalie per dimostrare la pipeline il primo giorno.