
Sistema autonomo di cyber difesa basato su AI che utilizza MCP, Gemini 2.0 Flash, l'osservabilità di Dynatrace e MongoDB. Proposta per Google Cloud Hackathon.
Sottomissione per Google Cloud Hackathon — Rilevamento e correzione autonoma delle minacce orchestrata da Google Cloud Agent Builder (Vertex AI Agent), alimentata da Gemini 2.0 Flash, Model Context Protocol (MCP) e osservabilità Dynatrace.
I team di sicurezza affrontano 30 minuti di MTTD e 4 ore di MTTR per gli incidenti tipici. Quando un analista umano rileva l'attacco, scrive la regola del firewall e la distribuisce, il danno è già fatto.
SentinelMCP riduce l'MTTD a < 30 secondi e l'MTTR a < 30 secondi distribuendo un agente di Google Cloud Agent Builder che riceve webhook di anomalie Dynatrace, li elabora con Gemini 2.0 Flash e invoca strumenti di difesa reali tramite MCP — agendo su infrastruttura live, non solo segnalando.
Dynatrace webhook → Agent Builder receives alert → Gemini reasons → MCP tools execute → Threat neutralized
1 s 2 s 8 s 15 s 25 s total
Il risultato: un ciclo di vita dell'incidente che in precedenza richiedeva un analista umano e 4 ore ora si completa autonomamente in meno di 30 secondi, con una traccia di audit completa in MongoDB e tracce distribuite in Jaeger.
┌──────────────────────────────────────────────────────────────────────┐
│ SANDBOX ENVIRONMENT │
│ │
│ ┌─────────────┐ 100–1000 req/s ┌──────────────────────────┐ │
│ │ attacker │ ──────────────────►│ victim-service │ │
│ │ (DDoS/SQLi) │ │ port 8080 │ │
│ └─────────────┘ │ /admin/* control API │ │
│ └────────────┬─────────────┘ │
└───────────────────────────────────────────────────│──────────────────┘
│ metrics + anomaly webhook
┌────────────────────────────────▼─────────────────┐
│ Dynatrace Mock (anomaly engine) │
│ Threat Risk Score → fires POST /alerts/simulate │
└────────────────────────┬─────────────────────────┘
│ webhook
┌─────────────────────────────────▼──────────────────────────┐
│ Google Cloud Agent Builder (Vertex AI Agent) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Gemini 2.0 Flash ── reasons over threat context │ │
│ │ Tool manifest ── dynamically fetched from MCP │ │
│ │ HITL gate ── halts if confidence < threshold │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────┬─────────────────────────┬───────────────────┘
│ REST calls │ audit write
┌───────────────▼──────┐ ┌────────────▼──────────┐
│ MCP Server :8001 │ │ MongoDB 7.0 Atlas │
│ 11 real tools │ │ incidents + traces │
└───────────┬──────────┘ └───────────────────────┘
│ acts on live infra
┌───────────▼──────────┐
│ FastAPI :8000 │
│ victim-service :8080│
└──────────────────────┘
┌──────────────────────────────────────────────────┐
│ OBSERVABILITY STACK │
│ OTel Collector ──► Jaeger (distributed traces) │
│ Prometheus ──────────────► Grafana │
└──────────────────────────────────────────────────┘
Principio chiave di progettazione: Degradazione graduale + Human-in-the-Loop (HITL). L'agente Agent Builder si arresta in sicurezza e restituisce il controllo all'operatore quando non può prendere una decisione con sufficiente confidenza — non indovina mai sull'infrastruttura critica.
Tutti e tre i servizi sono distribuiti e in esecuzione su Google Cloud Run:
| Servizio | URL |
|---|---|
| Centro di Comando (Dashboard) | https://sentinel-api-62d3d66zda-uc.a.run.app/dashboard |
| Documentazione API Swagger | https://sentinel-api-62d3d66zda-uc.a.run.app/docs |
| Controllo Salute | https://sentinel-api-62d3d66zda-uc.a.run.app/health |
| Catalogo Strumenti MCP | https://sentinel-mcp-62d3d66zda-uc.a.run.app/mcp/tools |
| Servizio Vittima | https://victim-service-62d3d66zda-uc.a.run.app |
Esegui un attacco live contro la produzione:
.\attack.production.ps1 status # verify all services healthy
.\attack.production.ps1 ddos # DDoS — Gemini blocks IPs + rate limit
.\attack.production.ps1 sql # SQL Injection — Gemini activates WAF
.\attack.production.ps1 brute # Brute Force — Gemini blocks source IPs
.\attack.production.ps1 stop # reset defenses
Il contenitore dell'attaccante viene eseguito localmente e colpisce il servizio-vittima su Cloud Run tramite HTTPS. Guarda la dashboard del Centro di Comando per il ciclo completo di rilevamento → ragionamento → neutralizzazione in tempo reale.
Google Cloud Agent Builder (Vertex AI ReasoningEngine) è l'orchestratore centrale di SentinelMCP. L'implementazione si trova in sentinel_mcp/agent/agent_builder.py.
SentinelAgent eredita da vertexai.preview.reasoning_engines.Queryable — l'interfaccia programmatica ufficiale di Agent Builder — e può essere eseguita localmente o distribuita al servizio gestito Agent Builder con un singolo comando.
| Responsabilità | Implementazione |
|---|---|
| Ricezione webhook | SentinelAgent.query(incident=...) — chiamato da Agent Builder ad ogni allarme Dynatrace |
| Dichiarazioni strumenti | 6 strumenti MCP registrati come oggetti FunctionDeclaration di Vertex AI in set_up() |
| Ragionamento | Gemini 2.0 Flash legge il contesto della minaccia + il catalogo strumenti, seleziona gli strumenti minimi, li invoca automaticamente |
| Gate HITL | Se Gemini non restituisce chiamate a strumenti (confidenza < soglia), viene emesso escalate_to_humans=True |
| Audit | Ogni chiamata a strumento registrata in MongoDB Atlas + esportata come span OTel a Jaeger |
Codice chiave — sentinel_mcp/agent/agent_builder.py:
class SentinelAgent(reasoning_engines.Queryable):
def set_up(self):
# MCP tools as Vertex AI FunctionDeclarations — Gemini selects at runtime
mcp_tools = Tool(function_declarations=[
FunctionDeclaration(name="block_ip_address", ...),
FunctionDeclaration(name="activate_waf", ...),
FunctionDeclaration(name="rate_limit_requests", ...),
FunctionDeclaration(name="scale_service", ...),
FunctionDeclaration(name="collect_forensic_logs", ...),
FunctionDeclaration(name="analyze_attack_pattern", ...),
])
self._model = GenerativeModel("gemini-2.0-flash-001", tools=[mcp_tools])
self._chat = self._model.start_chat()
def query(self, *, incident: dict) -> dict:
# Entry point — Agent Builder calls this for every Dynatrace webhook
response = self._chat.send_message(threat_prompt(incident))
tool_calls = [{"name": p.function_call.name, "args": dict(p.function_call.args)}
for p in response.candidates[0].content.parts if p.function_call]
return {"engine": "agent_builder", "tool_calls": tool_calls, ...}
Distribuisci su Google Cloud Agent Builder:
# Test locally (no GCP needed with google_ai_studio backend)
python scripts/deploy_agent_builder.py --test-only
# Deploy to managed Agent Builder endpoint
python scripts/deploy_agent_builder.py --project my-gcp-project
Imposta Agent Builder come backend attivo:
# .env
GEMINI_BACKEND=agent_builder
GOOGLE_CLOUD_PROJECT=my-gcp-project
VERTEX_LOCATION=us-central1
SentinelMCP integra l'osservabilità Dynatrace a tre livelli:
Pipeline OpenTelemetry — Il sentinel-otel-collector ingerisce span e metriche dal core FastAPI e li inoltra all'endpoint Dynatrace Mock (OTLP/HTTP :14318). Ogni incidente, esecuzione di strumento e chiamata LLM viene tracciata end-to-end con ID di correlazione completi.
Motore di anomalie con attivazione automatica — dynatrace-mock esegue un loop in background che monitora http_requests_total, calcola un Threat Risk Score (dynatrace_mock_sentinel_risk_score, 0–10) e attiva automaticamente POST /api/v1/alerts/simulate/{type} verso SentinelMCP quando il punteggio supera la soglia critica — replicando il comportamento esatto di un webhook di rilevamento anomalie Dynatrace Davis in produzione.
Dashboard Grafana alimentata dalle metriche Dynatrace — Il gauge e la timeline del Risk Score consumano direttamente dynatrace_mock_sentinel_risk_score, rendendo possibile visualizzare il momento preciso in cui Dynatrace ha segnalato l'anomalia rispetto al momento in cui SentinelMCP ha ottenuto la neutralizzazione.
L'agente Gemini scopre le sue capacità difensive dinamicamente in fase di esecuzione — nessuna lista di strumenti hardcodata, nessuna riscrittura del prompt quando le capacità cambiano:
GET /mcp/tools → returns 11 tool descriptors → Gemini selects and invokes tools
Ogni strumento è etichettato REAL o Audit-Only nel catalogo live. Gemini legge questo flag, capisce cosa può realmente fare sull'infrastruttura live e giustifica ogni selezione dello strumento nella sua traccia di ragionamento. Aggiungere una nuova capacità difensiva richiede zero ingegneria del prompt.
Strumenti che agiscono sull'infrastruttura live:
| Strumento | Cosa fa |
|---|---|
block_ip_address | POST /admin/block_ip — blocca gli IP dell'attaccante nel middleware in esecuzione |
activate_waf | POST /admin/waf — abilita la modalità di blocco WAF nel servizio in esecuzione |
rate_limit_requests | POST /admin/rate_limit — limitatore di velocità a finestra scorrevole, attivo immediatamente |
scale_service | Docker SDK su socket — avvia repliche reali del contenitore sotto carico |
rollback | POST /admin/reset_defenses — dimostra il ciclo di vita completo dell'incidente: attacco → difesa → ripristino |
collect_forensic_logs | Acquisisce prove reali dai contenitori in esecuzione per revisione post-incidente |
build_attack_timeline | Cronologia cronologica dai log live dei contenitori |
analyze_attack_pattern | Classifica il tipo di attacco con dati reali del contesto dell'incidente |
identify_iocs | Estrae IP, user-agent e payload reali dai file live dell'incidente |
Requisiti: Docker Desktop 24+, credenziali Google Cloud o chiave API AI Studio, ~3 GB di disco, ~2 GB di RAM.
docker compose up -d --build
Il primo avvio scarica le immagini di base (~3 GB, 5–10 min). Le esecuzioni successive richiedono meno di 1 minuto.
cd simulacion
docker compose up -d victim-service
cd ..
docker compose ps
# Expected: 8 services running/healthy
curl http://localhost:8000/health
# Expected: {"status": "healthy", "service": "SentinelMCP", ...}
.\attack.ps1 ddos # DDoS attack (default)
.\attack.ps1 sql # SQL Injection
.\attack.ps1 brute # Brute Force
.\attack.ps1 stop # Stop attack + reset defenses
.\attack.ps1 status # Check system state
Apri il Centro di Comando mentre l'attacco è in esecuzione:
http://localhost:8000/dashboard
Guarda le 4 fasi in ~25 secondi:
THREAT DETECTED — Dynatrace attiva l'allarmeDEFENDING — Gemini legge il catalogo degli strumenti MCP, seleziona azioni, registra il ragionamentoNEUTRALIZED — MTTD e MTTR visualizzati con traccia di audit completaSentinelMCP è basato su Gemini. Scegli il metodo di autenticazione adatto al tuo ambiente:
Opzione A — Google AI Studio (configurazione più rapida):
# Edit .env
GOOGLE_API_KEY=AIza...your_key_here
GEMINI_BACKEND=google_ai_studio
Opzione B — Vertex AI su Google Cloud:
gcloud auth application-default login
.\scripts\setup_gcloud.ps1 # sets project, creates SA key, updates .env automatically
Quindi riavvia il motore AI: docker compose restart api
| URL | Cosa mostra |
|---|---|
| https://sentinel-api-62d3d66zda-uc.a.run.app/dashboard | Centro di Comando — interfaccia demo principale |
| https://sentinel-api-62d3d66zda-uc.a.run.app/docs | Swagger — esploratore API interattivo |
| https://sentinel-api-62d3d66zda-uc.a.run.app/health | Controllo salute |
| https://sentinel-api-62d3d66zda-uc.a.run.app/api/v1/incidents | Storico incidenti (JSON) |
| https://sentinel-mcp-62d3d66zda-uc.a.run.app/mcp/tools | Catalogo strumenti MCP live letto da Gemini |
| https://victim-service-62d3d66zda-uc.a.run.app | Servizio vittima (il bersaglio sotto attacco) |
| URL | Cosa mostra |
|---|---|
http://localhost:8000/dashboard | Centro di Comando — interfaccia demo principale |
http://localhost:8000/docs | Swagger — esploratore API interattivo |
http://localhost:8000/api/v1/incidents | Storico incidenti (JSON) |
http://localhost:8000/api/v1/incidents/statistics/summary | Medie MTTD / MTTR su tutti gli incidenti |
http://localhost:8001/mcp/tools | Catalogo strumenti MCP live letto da Gemini |
http://localhost:8080 | Servizio vittima (il bersaglio sotto attacco) |
http://localhost:14499 | Dynatrace Mock — metriche live + motore di anomalie |
http://localhost:16686 | Jaeger — tracce distribuite |
http://localhost:9090 | Prometheus — metriche grezze |
http://localhost:3000 | Grafana — dashboard infrastruttura (admin / admin) |
| Scenario | Script | Cosa succede |
|---|---|---|
| DDoS | .\attack.ps1 ddos | Inondazione 1000 req/s; Gemini blocca IP + abilita limitazione velocità |
| SQL Injection | .\attack.ps1 sql | Rilevamento payload; Gemini attiva WAF in modalità blocco |
| Brute Force | .\attack.ps1 brute | Tentativi di login massivi; Gemini blocca IP sorgente + abilita WAF |
| Modalità Auto | Dashboard 🎯 Auto ON | Attacchi casuali ogni 45–90 s, risposta completamente autonoma |
GET http://localhost:8001/mcp/tools
| Strumento | Categoria | Modalità |
|---|---|---|
analyze_attack_pattern | analisi | REAL |
identify_iocs | analisi | REAL |
block_ip_address | difesa | REAL → victim-service |
activate_waf | difesa | REAL → victim-service |
rate_limit_requests | difesa | REAL → victim-service |
scale_service | difesa | REAL → Docker SDK |
collect_forensic_logs | forense | REAL |
build_attack_timeline | forense | REAL |
patch_vulnerabilities | riparazione | Audit-Only |
apply_hardening | riparazione | Audit-Only |
rollback | riparazione | REAL → victim-service |
SentinelMCP impiega una Modalità Audit Fail-Safe. Se l'infrastruttura di destinazione non è raggiungibile, l'agente registra le azioni intese senza interrompere la pipeline, garantendo una degradazione graduale. Gemini legge il flag REAL / Audit-Only nel catalogo — sa esattamente cosa può eseguire rispetto a cosa può solo raccomandare.
sentinel_mcp/
├── api/ FastAPI core — routes, schemas, dashboard UI
├── agent/ Decision engine + LLM providers (Gemini 2.0 Flash, Vertex AI)
├── mcp_server/ MCP server + 11 tool implementations
├── services/ Incident service, remediation orchestrator, threat calculator
├── observability/ OTel / Dynatrace / SigNoz providers
└── core/ Config, logging, exceptions
simulacion/
├── victim-service/ FastAPI target service with /admin/* control plane
└── attacker/ Python attack engine (DDoS / SQLi / brute force)
docker/
├── prometheus.yml Scrape config (victim-service at 5s interval)
└── grafana/ Auto-provisioned dashboard — 6-panel infrastructure witness
| Livello | Tecnologia |
|---|---|
| Orchestratore Agente | Google Cloud Agent Builder (Vertex AI Agent) |
| LLM | Gemini 2.0 Flash — via google-genai SDK |
| Protocollo Strumenti | MCP (Model Context Protocol) — 11 strumenti reali |
| API | FastAPI + Uvicorn (Python 3.11) |
| Database | MongoDB 7.0 Atlas (Motor async) |
| Osservabilità | OpenTelemetry → Dynatrace |
| Tracciamento | Jaeger |
| Metriche | Prometheus + Grafana |
| Client HTTP | httpx (async) |
| Orchestrazione Contenitori | Docker Compose v2 |