Progetto del corso di Advanced-CyberSecurity 2024/2025
Realizzazione di un'architettura Zero Trust
Team Members · Overview · Architettura · Complete Project Structure · Policy Implementate · Come Buildare e Avviare · Verifica SSL e Interazioni PEP · Esecuzione Use Cases · Account Types · Monitoring, Logs e Splunk · Contributing
Tecnologie utilizzate:
Questo progetto realizza un'infrastruttura di sicurezza informatica per un sistema bancario, ispirata ai principi dell'architettura Zero Trust, su una rete suddivisa in tre segmenti: interna, esterna e Wi-Fi. L'obiettivo è monitorare e regolare rigorosamente tutto il traffico verso il database, risorsa critica dell’infrastruttura.
Ogni richiesta di accesso alle risorse è sottoposta a controlli rigorosi di autenticazione, autorizzazione e monitoraggio, con valutazione dinamica della fiducia basata su molteplici fattori. L’architettura è progettata per essere adattiva e resiliente, proteggendo il database tramite accessi controllati, monitoraggio continuo, micro-segmentazione e reazione rapida alle anomalie. In questo modo, ogni richiesta viene trattata come sospetta fino a prova contraria, garantendo una sicurezza moderna e mirata.
L’architettura del sistema si fonda su un modello a microservizi, dove ogni componente di sicurezza è isolato in un container Docker dedicato. Questo approccio garantisce:
- Segmentazione logica e fisica delle funzioni di rete
- Maggiore sicurezza grazie all’isolamento dei servizi
- Scalabilità e manutenibilità semplificate
-
Client
Tre tipologie di client (external, internal, wifi), ciascuno collegato a una rete separata (esterna, interna, Wi-Fi).
Ogni client può inviare richieste di accesso alle risorse protette. -
Gateway
Punto di controllo centrale che:- Applica regole firewall tramite iptables
- Gestisce il proxy Squid per il traffico HTTP/HTTPS
- Monitora il traffico di rete con Snort (IDS)
- Redirige e filtra il traffico verso il PEP
-
Policy Enforcement Point (PEP)
- Riceve tutte le richieste dai client tramite il gateway
- Autentica l’utente
- Inoltra la richiesta di autorizzazione al PDP
-
Policy Decision Point (PDP)
- Valuta la richiesta secondo policy dinamiche, punteggi di fiducia, blacklist e regole granulari
- Restituisce una decisione (allow/deny) al PEP
-
Database (PostgreSQL)
- Rappresenta la risorsa sensibile
- Protetto tramite TLS
- Accessibile solo dopo aver superato tutti i controlli Zero Trust
-
Splunk
- Raccoglie e analizza i log generati da tutti i componenti
- Fornisce dashboard di monitoraggio e allarmi automatici in caso di eventi sospetti
-
Il client invia una richiesta →
Il traffico passa attraverso il gateway, che applica controlli di sicurezza e inoltra la richiesta al PEP. -
Autenticazione e autorizzazione →
Il PEP autentica l’utente e chiede al PDP se l’operazione è consentita. -
Valutazione della richiesta →
Il PDP applica policy di sicurezza, verifica blacklist e punteggi di fiducia, e restituisce la decisione. -
Accesso al database →
Se autorizzato, il PEP esegue l’operazione richiesta sul database. -
Monitoraggio centralizzato →
Tutti gli eventi e i log vengono inviati a Splunk per analisi e risposta automatica agli incidenti.
.
├── client_external/
│ ├── Dockerfile
│ ├── entrypoint.sh
│ └── uc.sh
├── client_internal/
│ ├── Dockerfile
│ ├── entrypoint.sh
│ └── uc.sh
├── client_wifi/
│ ├── Dockerfile
│ ├── entrypoint.sh
│ └── uc.sh
├── db/
│ ├── certs/
│ │ ├── server.crt
│ │ └── server.key
│ ├── init/
│ │ └── 03_ssl.sh
│ ├── data.sql
│ └── schema.sql
├── gateway/
│ ├── Dockerfile
│ ├── apply_blacklist.sh
│ ├── entrypoint.sh
│ ├── local.rules
│ ├── policy.yaml
│ ├── requirements.txt
│ ├── rules.sh
│ ├── snort.conf
│ └── squid.conf
├── logs/
│ ├── policy-engine/
│ ├── router/
│ ├── snort/
│ │ └── logs (snort.log files)
│ └── squid/
│ ├── access.log
│ └── cache.log
├── pdp/
│ ├── data/
│ │ ├── blacklist/
│ │ │ └── blacklist.txt
│ │ ├── GeoLite2-Country.mmdb
│ │ └── trust_db.json
│ ├── .env
│ ├── Dockerfile
│ ├── encrypt_existing.py
│ ├── entrypoint.sh
│ ├── pdp.py
│ ├── policies.py
│ └── utils.py
├── pep/
│ ├── db_scripts/
│ │ ├── db_DAO.py
│ │ ├── db_exec.py
│ │ ├── db_operations.py
│ │ └── __init__.py
│ ├── .env
│ ├── create_users.py
│ ├── Dockerfile
│ ├── pep.py
│ ├── users_db.json
│ └── user_auth.py
└── splunk-apps/
├── dashboard/
│ └── default/
│ ├── data/
│ │ └── ui/
│ │ ├── nav/default.xml
│ │ └── views/
│ │ ├── snort_attack_dashboard.xml
│ │ └── squid_traffic_dashboard.xml
│ └── metadata/default.meta
├── log_inputs/
│ ├── local/
│ │ ├── app.conf
│ │ ├── inputs.conf
│ │ ├── props.conf
│ │ └── savedsearches.conf
│ └── metadata/local.meta
└── lookups/
├── geo_attr_countries.csv
├── geo_attr_us_states.csv
├── geo_countries.kmz
├── geo_us_states.kmz
├── known_clients.csv
└── READMELe principali policy di sicurezza implementate nell’architettura Zero Trust sono:
-
Reputazione storica degli IP e monitoraggio eventi
- Snort-Attack-Detection-30Days: Se un IP genera più di 60 alert Snort negli ultimi 30 giorni, viene inserito immediatamente in blacklist e bloccato.
- Non-Working-Hours-Detection-More-Than-10-IPs: Più di 5 accessi da IP noti fuori orario lavorativo (20:00-08:00) negli ultimi 30 giorni riducono il punteggio di fiducia dell’IP di 15 punti.
- TrustReputation-Increase: Nessun evento malevolo in 30 giorni comporta un aumento di 1 punto fiducia.
- TrustReputation-Decrease: HTTP POST anomali simili a DoS verso il PEP comportano una riduzione di 40 punti fiducia.
- Attacchi DoS: comportano una riduzione della fiducia.
-
Monitoraggio in tempo reale degli attacchi
- PortScanning-HighRate-Detection: Port scanning ad alta frequenza porta a blacklist e blocco immediato dell’IP.
- ShellCode-Injection-Detection: Tentativi di shellcode injection nei log Snort portano a blacklist e blocco immediato dell’IP.
-
Controllo in tempo reale della rete di origine
- Rete esterna (
172.21.0.0/24): riduzione di 5 punti fiducia. - Rete Wi-Fi (
172.22.0.0/16): riduzione di 5 punti fiducia. - Rete interna (
172.20.0.0/16): aumento di 10 punti fiducia.
- Rete esterna (
-
Geolocalizzazione
- Richieste da IP non italiani subiscono una penalità di 40 punti nel punteggio di fiducia.
-
Controllo orario delle richieste
- Le richieste fuori orario lavorativo vengono monitorate e possono essere bloccate tramite proxy Squid.
-
Autenticazione utente e fiducia basata sul ruolo
- Nessuna operazione sul database è consentita senza login.
- Punteggi di fiducia iniziali per ruolo:
- Direttore: 85
- Consulente: 75
- Cassiere: 70
- Cliente: 60
-
Autorizzazione alle operazioni sulle risorse
- Per autorizzare un’operazione su una risorsa del database devono essere verificate tutte le seguenti condizioni:
- Il ruolo dell’utente consente l’operazione.
- Il ruolo consente l’accesso alla risorsa.
- La media tra punteggio di fiducia dell’IP e dell’utente supera una soglia prestabilita.
Tipo Documento Operazione Soglia minima (read/write/delete) Dati personali read / write / delete 60 / 80 / 80 Dati transazionali read / write / delete 65 / 75 / 80 Documenti operativi read / write / delete 60 / 70 / 80 Ruolo Permessi Direttore Tutte le operazioni su tutti i documenti Consulente Solo lettura e scrittura su documenti operativi Cassiere Lettura e scrittura su documenti transazionali e operativi Cliente Sola lettura su documenti personali - Per autorizzare un’operazione su una risorsa del database devono essere verificate tutte le seguenti condizioni:
- Assicurarsi di essere nella directory root del progetto
- Verificare che i file
.shusino line endings Unix (LF)find . -type f -name "*.sh" -exec sed -i 's/\r$//' {} +
- Creare file
.envnella root con i seguenti contenuti:POSTGRES_USER=<insert user> POSTGRES_PASSWORD=<insert password> POSTGRES_DB=<insert name db> SPLUNK_PASSWORD=<insert password>
- Avviare tutti i container con build
docker compose up --build -d
- Verificare lo stato dei servizi
docker compose ps
- Fermare ed eliminare i container, network e volumi
docker compose down -v
- Controllare che PostgreSQL accetti connessioni SSL
docker exec -it db bash psql "sslmode=require host=localhost dbname=bankDB user=user password=cyber_pwd"
- Esempi di richieste al PEP via
curl-
Login:
curl -X POST http://172.24.0.3:3100/login \ -H "Content-Type: application/json" \ -c cookies.txt \ -d '{"username": "giovanni.rossi", "password": "pass_direttore"}'
-
Operazione di lettura:
curl -X POST http://172.24.0.3:3100/request \ -H "Content-Type: application/json" \ -b cookies.txt \ -d '{"operation": "read", "document_type": "Dati Transazionali", "doc_id": 1}'
-
Operazione di scrittura:
curl -X POST http://172.24.0.3:3100/request \ -H "Content-Type: application/json" \ -b cookies.txt \ -d '{ "operation": "write", "document_type": "Dati Transazionali", "nome_file": "fattura_123.pdf", "contenuto": "Contenuto della fattura...", "sensibilita": "sensibile" }'
-
Operazione di cancellazione:
curl -X POST http://172.24.0.3:3100/request \ -H "Content-Type: application/json" \ -b cookies.txt \ -d '{"operation": "delete", "document_type": "Dati Transazionali", "doc_id": 2}'
-
Per eseguire gli script di use case (uc.sh) all’interno dei container:
docker exec -it <nome_servizio> bash ./uc.shEsempio:
docker exec -it client_internal bash ./uc.shI tipi di account sono:
{
"accounts": [
{ "username": "giovanni.rossi", "role": "Direttore", "password": "pass_direttore" },
{ "username": "marco.bianchi", "role": "Cassiere", "password": "pass_cassiere" },
{ "username": "luca.verdi", "role": "Consulente", "password": "pass_consulente" },
{ "username": "maria.neri", "role": "Cliente", "password": "pass_cliente" }
]
}Modificare o aggiungere nuovi tipi di account tramite lo script pep/create_users.py.
I log sono raccolti in logs/ e mostrano:
- Policy Engine:
logs/policy-engine - Router:
logs/router - Snort:
logs/snort - Squid:
logs/squid
Dopo aver avviato i container, aprire nel browser:
http://localhost:8000/
per accedere a Splunk e visualizzare le dashboard personalizzate. Il nome utente è: "admin", mentre la password è quella che viene inserita nel file .env, presente nella sezione 🛠️ Come Buildare e Avviare.
-
Snort Attack Dashboard
- Visualizza in tempo reale gli alert IDS generati da Snort.
- Grafico temporale dei rilevamenti per evidenziare picchi di attacco.
- Top signature alert più frequenti.
- Classifica IP sorgenti più attivi.
- Contatori riassuntivi di alert totali e severità.
-
Squid Traffic Monitoring Dashboard
- Trend orario delle richieste proxy negli ultimi 30 giorni.
- Top 10 URL più richiesti con percentuale di traffico.
- Top 10 IP client più attivi.
- Indicatori numerici di richieste totali e URL unici nelle ultime 24h.
- Distribuzione dei metodi HTTP (GET, POST, ecc.).
Apri issue, discussion o pull request per suggerimenti e miglioramenti!
