← All posts
Graph MLKubernetes SecurityExplainable AITGNN

Zero-Day: A Zero-Day Attack Detection & Mitigation Framework for Kubernetes

August 2, 2026·17 min read

A comprehensive security framework combining Temporal Graph Neural Networks (TGNN), real-time monitoring, and automated safe containment for detecting and mitigating zero-day attacks in Kubernetes environments — featuring PyTorch, PyTorch Geometric, Prometheus, Grafana, Go Operators, multi-source telemetry ingestion, Explainable AI, MITRE ATT&CK attack playbooks, and multi-tenant SaaS management.

Why This Project?

In modern cloud-native environments, Kubernetes clusters are under constant threat. Zero-day attacks — vulnerabilities with no known patch — are the most dangerous because traditional signature-based defenses can't detect them. Without an intelligent detection system, teams face:

  • Invisible attacks — Zero-day exploits bypass traditional firewalls and signature-based IDS because no known signature exists. Container breakouts and supply chain attacks are virtually undetectable by static rules.
  • Delayed response — Without automated detection, breaches can go unnoticed for weeks or months, allowing lateral movement across the cluster (MITRE ATT&CK T1021).
  • Blast radius — A compromised container in Kubernetes can escalate privileges (T1548), access secrets, and spread to other pods before anyone intervenes.
  • Operational blindness — Thousands of network flows, syscalls, and API audit logs are generated every second with no way to distinguish normal from malicious behavior.
  • No explainability — Even when anomalies are flagged, security operations teams can't understand why an alert fired, leading to alert fatigue and ignored warnings.

Zero-Day was designed to address all of these pain points by building a graph-based AI detection system that understands how containers interact, detects deviations from normal behavior in real-time, explains its decisions via XAI, and automatically contains threats — all while keeping humans in the loop through approval workflows.

System Architecture

The system follows a six-layer architecture with complete separation between data ingestion, stream processing, ML inference, containment, observability, and UI/SaaS management. Docker Compose orchestrates the local PoC, while Helm charts and Kubernetes manifests handle production deployment.

┌─────────────────────────────────────────────────────────────┐
│                   DATA INGESTION LAYER                       │
│  Kubernetes Audit Logs → Network Flows → eBPF Syscalls      │
│         ↓                    ↓                ↓              │
│      Kafka Cluster (Strimzi) / Local JSONL Files             │
└────────────────────────┬────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────────────┐
│                STREAM PROCESSING LAYER                       │
│  Temporal Graph Builder Service                              │
│  - Sessionization by container_id & 5-tuple flows            │
│  - Sliding time windows (60s window, 30s step)               │
│  - NetworkX directed graphs → Parquet snapshots              │
└────────────────────────┬────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────────────┐
│                  ML INFERENCE LAYER                          │
│  Parallel Scoring Ensemble:                                  │
│  ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌──────────┐ │
│  │ Autoencoder│ │  LSTM-AE   │ │  DeepLog   │ │   TGNN   │ │
│  └────────────┘ └────────────┘ └────────────┘ └──────────┘ │
│         ↓ Anomaly Score (0.01.0)                         │
│  If score > threshold → Create Containment CR + XAI Report  │
└────────────────────────┬────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────────────┐
│              CONTAINMENT & RESPONSE LAYER                    │
│  Kubernetes Operator (Go + controller-runtime)               │
│  Actions: NetworkPolicy / Pod Eviction / Istio Blackhole     │
│  Safety: Confidence ≥ 0.7, Dry-Run Default, Approval Tokens │
└────────────────────────┬────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────────────┐
│             OBSERVABILITY & ALERTING LAYER                   │
│  Prometheus (5s scrape) │ Grafana (8-panel dashboard)        │
│  Elasticsearch (logs)   │ Jaeger (distributed tracing)       │
└────────────────────────┬────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────────────┐
│               UI & SaaS MANAGEMENT LAYER                     │
│  Flask Web UI (Port 5000) │ SaaS API (Port 5001)            │
│  Alert management │ Multi-tenant billing │ JWT Auth          │
└─────────────────────────────────────────────────────────────┘

Architecture Highlights

  • Multi-source telemetry — Ingests Kubernetes audit logs, Cilium/Hubble network flows, and eBPF container syscalls into a unified event stream.
  • Temporal Graph Neural Network (TGNN) — Goes beyond flat feature vectors; models HOW containers interact with each other over time using graph attention mechanisms (GAT/GraphSAGE).
  • Safe automated containment — A Kubernetes-native operator with dry-run mode, confidence thresholds (≥ 0.7), and human approval workflows before enforcing any action.
  • Explainable AI (XAI) — SHAP DeepExplainer and gradient-based graph attributions provide interpretable alerts, not just scores.
  • MITRE ATT&CK mapping — Attack playbooks map to real-world techniques (T1610, T1548, T1021, T1041, T1059).
  • Dual-mode operation — File-based local PoC mode (no Kafka needed) or full Kubernetes production mode with Strimzi Kafka.
  • Multi-tenant SaaS — Production billing, usage metering, and namespace isolation with 4 subscription tiers.
  • Docker Compose for one-command local demo spin-up.
  • Helm charts for production Kubernetes deployment with autoscaling and automated backups.

Key Features

1. Temporal Graph Construction Engine

The Graph Builder service (graph_builder/) converts raw telemetry events into temporal graph windows suitable for ML processing.

FeatureDetail
SessionizationGroups events by container_id, pod_name, and 5-tuple network flows
Sliding Windows60-second windows with 30-second step (overlapping)
Graph StructureNetworkX directed graphs with node and edge features
Output FormatApache Parquet files via fastparquet engine
Dual ModeFile-based JSONL input (local) or Kafka consumer (production)
Auto-FlushBackground flusher thread wakes every step seconds, generates synthetic fallback events if real traffic is quiet

Input Event Schema:

{
  "timestamp": 1704282000,
  "event_type": "network_flow",
  "src_pod": "frontend-abc123",
  "dst_pod": "backend-xyz789",
  "src_ip": "10.0.1.5",
  "dst_ip": "10.0.2.15",
  "dst_port": 8080,
  "bytes_out": 1024,
  "bytes_in": 2048
}

Outputs:

  • window_<timestamp>.nodes.parquet — Node features (pod_name, namespace, total bytes, outgoing_unique_dst, flow_count)
  • window_<timestamp>.edges.parquet — Edge features (src→dst pairs with cumulative bytes and flow count)

Running Modes:

# File mode (local PoC)
python -m graph_builder.main file \
  --input-file events.jsonl \
  --out-dir ./graphs \
  --window-size 60 --step 30

# Kafka mode (production)
python -m graph_builder.main kafka \
  --topic telemetry.logs \
  --servers kafka:9092 \
  --out-dir /data/graphs

2. ML-Based Anomaly Detection (4 Models + Ensemble)

The inference layer runs four parallel anomaly detection models, each with a different strength:

ModelArchitectureBest ForThreshold
AutoencoderFC MLP: 16 → 64 → 32 → 64 → 16 (MSE loss)Node-level static feature anomalies0.5
LSTM-AELSTM encoder (H=64, T=50) → latent → LSTM decoderTemporal flow volume anomalies0.6
DeepLogEmbedding(64) → LSTM(H=128) → Linear(vocab_size)System call & log sequence anomaliesLow next-token probability
TGNNGraphSAGE/GATConv (4 heads) + Temporal LSTM aggregationComplex lateral movement & multi-pod attacks0.5

TGNN Architecture Deep Dive:

INPUT: Parquet Window Files
├─ nodes: (pod_name, cpu, memory, network_in, network_out, syscall_count) → 6-D vector
└─ edges: (flow_count, bytes_in, bytes_out, latency, duration) → 5-D vector

NODE ENCODER (MLP)
├─ Input: 6-D node features
├─ Linear(6, 64) → ReLU → Linear(64, 32) → Output: 32-D embedding per node

EDGE ENCODER (with Temporal Encoding)
├─ Sinusoidal positional time encoding (64-D):
│   PE(t, 2k) = sin(t / 10000^(2k/d))
│   PE(t, 2k+1) = cos(t / 10000^(2k/d))
├─ Concatenate: [edge_features(5-D), time_encoding(64-D)] = 69-D
├─ MLP projection → 16-D edge embedding

ATTENTION LAYERS (Graph Attention Networks)
├─ Multi-head attention (4 heads), each learns different patterns:
│   Head 1: Port-based communication patterns
│   Head 2: Volume-based anomalies (unusual byte counts)
│   Head 3: Temporal sequence anomalies (timing deviations)
│   Head 4: Unusual peer connections (lateral movement)
├─ attention_weight[i→j] = softmax(LeakyReLU(wᵀ[hᵢ ‖ hⱼ]))
├─ output[i] = σ(Σⱼ attention[i→j] · W · hⱼ)
└─ Output: (num_nodes, 64) after concatenation & projection

DUAL ANOMALY SCORING HEADS
├─ Node Head: Linear(6432) → ReLU → Linear(328) → ReLU → Linear(81) → Sigmoid
├─ Edge Head: Linear(19264) → ReLU → Linear(6416) → ReLU → Linear(161) → Sigmoid
└─ Composite Score: final = 0.6 × node_anomaly + 0.4 × edge_anomaly

Training Strategy: Contrastive triplet loss on benign vs attack windows:

L(a,p,n)=max(f(a)f(p)2f(a)f(n)2+α,  0)\mathcal{L}(a, p, n) = \max(\|f(a) - f(p)\|_2 - \|f(a) - f(n)\|_2 + \alpha,\; 0)

Best Practice: Baseline models (Autoencoder, LSTM-AE) for speed; TGNN for accuracy. Ensemble voting for the final decision.

3. Explainable AI (XAI) Integration

Every alert comes with an explanation so SOC analysts can understand why it fired:

XAI MethodWhat It Does
SHAP DeepExplainerComputes feature-level attributions over Autoencoder inputs, showing which features contributed most to the anomaly score
Gradient Graph AttributionsEvaluates ∇ₓ𝓛 with respect to node features to isolate top influential features and suspicious neighbor nodes
Feature Deviation AnalysisLightweight production explainer computing absolute percentage deviations from baseline mean μf

Example explanation output:

{
  "score": 0.85,
  "anomaly": true,
  "model": "tgnn",
  "explanation": "High outbound traffic to unusual port",
  "top_features": ["bytes_out: +340% above baseline", "dst_port: 22 (unusual)"],
  "suspicious_nodes": ["admin-pod-4", "db-pod-7"]
}

4. Red-Team Attack Playbooks (MITRE ATT&CK Mapped)

The project includes realistic adversary simulations mapped to MITRE ATT&CK techniques:

Attack PlaybookMITRE IDWhat It Simulates
Container EscapeT1610Accesses /var/run/docker.sock, executes docker run --privileged, escalates Linux capabilities (CAP_SYS_ADMIN)
Privilege EscalationT1548.001Executes suspicious setuid binary, issues prctl(PR_SET_DUMPABLE), spawns root shell (UID 0)
Lateral MovementT1021Internal DNS enumeration (*.default.svc.cluster.local), TCP RPC to port 8080, credential theft POST to /api/admin/credentials
Data ExfiltrationT1041Massive outbound burst (500,000 bytes) to external IP (8.8.8.8), rapid concurrent connections to unknown public subnets

5. Safe Automated Containment (Kubernetes Operator)

The Containment Operator (Go + controller-runtime) watches for Containment CRs and enforces security policies with multiple safety layers:

ActionMechanismRisk LevelRollback
Isolate PodCreates deny-all NetworkPolicy (empty ingress/egress arrays)MEDIUMDelete NetworkPolicy resource
Evict PodGraceful termination via Eviction API (30s grace period)HIGHPod auto-restarts via Deployment controller
Blackhole TrafficIstio VirtualService with 100% fault delay injection (1000s)LOWDelete VirtualService

Containment CRD (security.example.com/v1alpha1):

apiVersion: security.example.com/v1alpha1
kind: Containment
metadata:
  name: alert-pod-xyz
  namespace: quarantine
spec:
  alertID: "alert-frontend-123"
  confidence: 0.92
  suggestedAction: "isolate_pod"  # isolate_pod | evict_pod | blackhole_traffic
  explanation: "Unusual outbound traffic pattern"
  dryRun: true
  approvalToken: ""
status:
  state: "pending"  # pending → approved → applied → failed
  appliedAction: ""
  result: ""
  lastUpdate: "2026-01-15T10:00:00Z"

Operator Reconciliation Loop:

Reconcile(ctx, req)
  │
  ├── Fetch Containment CR
  ├── If State == "applied" || "failed" → Return (No-op)
  ├── If Confidence < 0.7 → UpdateStatus("pending", "confidence_too_low")
  ├── If !DryRun && ApprovalToken == "" → Requeue every 30s ("awaiting_approval")
  └── Execute Action:
        ├── "isolate_pod" → Create Deny-All NetworkPolicy
        ├── "evict_pod" → Delete Pod with 30s GracePeriod
        └── "blackhole_traffic" → Istio VirtualService Fault Delay
        → UpdateStatus("applied", action)

Approval Workflow:

# Review alert
kubectl describe containment alert-frontend-123

# Approve containment action
kubectl patch containment alert-frontend-123 \
  -p '{"spec":{"approvalToken":"approved-by-vineeth"}}'

# Check result
kubectl get containment alert-frontend-123 -o json | jq '.status'

6. Real-Time Monitoring & Visualization

The monitoring stack provides a rich, color-coded Grafana dashboard with 8 panels:

PanelTypePromQL QueryGreenYellowRed
Events/sec (1m)Statrate(zero_day_events_total[1m])< 100/s100–500/s> 500/s
Active Alerts (5m)Statincrease(zero_day_attack_alerts_total[5m])01–5> 5
Attack ScoreStatzero_day_attack_score0–3940–6970–100
Event VolumeTimeseriesrate(zero_day_events_total[1m])BaselineSpikeBurst
Attack AlertsTimeseriesincrease(zero_day_attack_alerts_total[1m])Flat 0Step upSharp spike
Latency (p95)Timeserieshistogram_quantile(0.95, ...)< 50ms50–200ms> 200ms
Attack Score TrendTimeserieszero_day_attack_scoreDecayedClimbingSpiked > 70
System InstructionsMarkdown

Key Prometheus Metrics:

MetricTypePurpose
zero_day_events_totalCounterTotal events received (labeled by source)
zero_day_attack_alerts_totalCounterTotal alerts triggered (labeled by severity)
zero_day_attack_scoreGaugeCurrent attack score (0–100), decays by 1/sec after 30s inactivity
graph_builder_processing_duration_secondsHistogramWindow construction latency distribution
inference_requests_totalCounterTotal inference requests (labeled by model & status)
inference_duration_secondsHistogramInference latency per model
inference_model_accuracyGaugeModel accuracy metric
zd_windows_count / zd_alerts_countGaugeTrack Parquet files and alert JSON files on disk

7. Multi-Tenant SaaS Management API

The project includes a production-grade SaaS management layer (saas-management-api/) for multi-tenant deployment:

Subscription Tiers:

TierRPS LimitConnectionsStoragePrice/mo
FREE10510 GB$0
STARTER10020100 GB$99
PROFESSIONAL500100500 GB + custom rules$499
ENTERPRISE2,0005005 TB + SSO + dedicated SLA$2,000

Security: JWT bearer token authentication + Admin API Key enforcement.

API Endpoints:

POST   /api/v1/auth/register              Onboard tenant, generate API key, create K8s namespace
GET    /api/v1/tenants/<id>               Retrieve tenant profile & subscription state
GET    /api/v1/tenants/<id>/usage         Aggregate requests, inference calls, storage over N days
POST   /api/v1/tenants/<id>/upgrade       Dynamic tier upgrade with audit logging
GET    /api/v1/billing/invoices           Invoicing and billing status history
GET    /api/v1/admin/tenants              Multi-tenant administrative overview

Each tenant gets an isolated Kubernetes namespace with custom labels, ResourceQuotas, and LimitRanges automatically provisioned via kubectl.

Tech Stack

ML & Backend

  • Python 3.11+ — Primary language for graph building and ML pipeline
  • PyTorch 2.0+ — Deep learning framework for all anomaly detection models
  • PyTorch Geometric (PyG) — Graph neural network library (GATConv, GraphSAGE)
  • scikit-learn — Baseline model utilities, IsolationForest, and metrics
  • SHAP — Explainable AI for model interpretability (DeepExplainer)
  • NetworkX — Graph construction library for temporal graph building
  • pandas — Data manipulation for event sessionization
  • PyArrow / fastparquet — Apache Parquet I/O for graph window storage
  • Flask — Web UI (Port 5000) and SaaS Management API (Port 5001)
  • prometheus_client — Python library for exposing custom Prometheus metrics
  • kafka-python — Kafka consumer for production telemetry ingestion
  • SQLite — SaaS management database for tenants, usage, invoices

Containment & Operators

  • Go 1.21+ — Containment operator implementation
  • controller-runtime v0.16.0 (Kubebuilder) — Kubernetes operator framework
  • client-go v0.28.0 — Kubernetes API interactions (NetworkPolicy, Eviction, CRD management)
  • Zap Logger — Structured logging for operator

Infrastructure & Orchestration

  • Kubernetes / Minikube / GKE / EKS / AKS — Container orchestration
  • Istio — Service mesh with mTLS for secure inter-service communication
  • Cilium / Hubble — eBPF-based network observability and security
  • Apache Kafka (Strimzi) — Event streaming (3-broker cluster)
  • Docker & Docker Compose — Containerization and local PoC orchestration
  • Helm 3 — Kubernetes package manager (Chart: zero-day-saas v1.0.0)
  • Terraform — (Placeholder) Cloud provider Infrastructure-as-Code
  • Velero — Automated daily backups (2:00 AM cron, 30-day retention)

Monitoring & Observability

  • Prometheus — Time-series metrics database (5s scrape interval, 15-day retention)
  • Grafana — Real-time visualization dashboards (8-panel, 5s auto-refresh)
  • OpenTelemetry Collector — Distributed telemetry collection
  • Fluent Bit — Log forwarding and aggregation (DaemonSet)
  • Jaeger — Distributed tracing
  • Elasticsearch / ClickHouse — Structured log indexing and telemetry storage

Database Schema

Event Storage (Parquet Windows)

Node Features (6-D vector per window):

FeatureTypeDescription
pod_namestringPod identifier
namespacestringKubernetes namespace
total_bytesintTotal network bytes in window
outgoing_unique_dstintUnique destination count
flow_countintNumber of network flows
syscall_countintContainer syscall count

Edge Features (5-D vector + temporal encoding):

FeatureTypeDescription
bytes_inintTotal inbound bytes
bytes_outintTotal outbound bytes
packet_countintNumber of packets
durationfloatFlow duration in seconds
latency_p95float95th percentile latency

Features are standardized during TGNN preprocessing: xnorm=xμσ+106x_{\text{norm}} = \frac{x - \mu}{\sigma + 10^{-6}}

SaaS Management Database (SQLite)

TablePurpose
tenantsTenant profiles, API keys, subscription tiers, creation timestamps
usageRequest counts, inference calls, storage consumption per tenant
invoicesBilling records with amounts, status, and payment dates
subscription_eventsAudit log of tier upgrades, downgrades, and billing events

API Endpoints

Inference Service (Port 8080)

POST   /score               Score telemetry features for anomalies
GET    /health              Health check endpoint
GET    /metrics             Prometheus metrics endpoint

Web UI Dashboard (Port 5000)

GET    /                    Bootstrap dashboard (index.html)
GET    /api/system-status   Live pod health across namespaces (ml, kafka, monitoring, quarantine)
GET    /api/alerts          List active Containment CR alerts
GET    /api/metrics         Average anomaly score, model state, alerts count
GET    /api/graphs          Active graph window count, node count, edge count
GET    /api/logs/<comp>     Live container log streaming (graph-builder, inference, containment)
POST   /api/score           Proxy forwarder to ML inference service

SaaS Management API (Port 5001)

POST   /api/v1/auth/register              Register tenant + provision K8s namespace
GET    /api/v1/tenants/<id>               Get tenant profile
GET    /api/v1/tenants/<id>/usage         Get usage aggregates
POST   /api/v1/tenants/<id>/upgrade       Upgrade subscription tier
GET    /api/v1/billing/invoices           Get billing history
GET    /api/v1/admin/tenants              Admin: list all tenants

Metrics Exporter (Port 8000)

GET    /metrics             Prometheus-format metrics (events, alerts, attack score, latency)

Kubernetes API (via kubectl)

kubectl get containment -A                List all containment actions
kubectl describe containment <name>       View containment details
kubectl patch containment <name>          Approve containment action
kubectl get crd                           Verify CRD registration

Testing

Zero-Day includes a comprehensive multi-level testing strategy:

Test LevelTestsCoverage
Unit Tests (graph_builder)Sessionization, graph construction, Parquet I/O, window boundaries~90%
Integration Tests (ML pipeline)Data generation, model training, inference API, model persistence~85%
End-to-End Tests (scripts)7 tests across the full stackAll 7 PASSED ✅
ML ValidationPrecision, recall, F1, ROC-AUC, MTTD on attack vs benign windowsROC-AUC: 0.92
Attack Simulations4 MITRE ATT&CK playbooks (T1610, T1548, T1021, T1041)Containment Success: 85%

End-to-End Test Results

[TEST 1] Docker Compose Services      ✅ All services running
[TEST 2] Metrics Exporter Health       ✅ Exporter exposing zero_day metrics (15 found)
[TEST 3] Prometheus Scraping           ✅ Prometheus scraping metrics
[TEST 4] Grafana Authentication        ✅ Grafana login successful (admin:admin)
[TEST 5] Dashboard Import              ✅ Dashboard imported and accessible
[TEST 6] Demo Execution                ✅ Demo executed, metrics updated (7,746 events)
[TEST 7] Attack Demo                   ✅ Attack demo successful, alerts incremented (400)

ML Validation Metrics

MetricValue
ROC-AUC0.92
Mean Time to Detect (MTTD)< 1 second (attack injection → dashboard visualization)
False Positive RateMinimized via confidence gating (≥ 0.7)
Containment Success Rate85%
SLO Latency Impact50ms inference latency target

Key Design Decisions

  • Why a Temporal Graph Neural Network? Unlike traditional flat-feature models, a TGNN captures the relationships between containers — HOW they interact, not just individual behavior. This is critical for detecting lateral movement (T1021), where the suspicious signal is in the graph topology (e.g., pod1 suddenly connecting to admin-pod4 on port 22), not in a single metric.

  • Why multiple ML models? Each model has different strengths. The Autoencoder is ultra-fast but ignores relationships. LSTM-AE captures temporal patterns but works on sequences, not graphs. DeepLog detects unusual log sequences. TGNN captures full topological and temporal context. Running all in parallel with ensemble voting gives the best precision-recall tradeoff.

  • Why a Kubernetes Operator for containment? Containment actions (NetworkPolicy, pod eviction) must be Kubernetes-native to be reliable. A CRD-based operator follows the Kubernetes reconciliation pattern — it's idempotent, retryable, and integrates with kubectl for approval workflows. This is far more robust than script-based approaches.

  • Why dry-run by default? In security, false positives that trigger automated containment can cause more damage than the attack itself. Starting with dryRun: true and requiring an approvalToken ensures a human validates the alert before enforcement. The 0.7 confidence threshold adds an additional safety gate.

  • Why Parquet for graph storage? Parquet is columnar, compressed, and fast for analytical reads. Using fastparquet (not pyarrow) eliminates C-extension compatibility conflicts in containerized environments. Storing graph windows on a PersistentVolume makes them accessible to both the graph builder (writer) and inference service (reader) without a separate database.

  • Why dual-mode (file + Kafka)? A local file-based PoC mode lets you demo the entire system without setting up Kafka, Zookeeper, and Strimzi. This dramatically reduces the barrier to testing and presentation, while the Kafka mode handles production-scale throughput with 3-broker resilience.

Challenges Faced

  • TGNN Training Complexity — PyTorch Geometric has a steep learning curve. Converting Parquet graph windows into PyG Data objects with proper edge_index, edge_attr, and 64-dimensional sinusoidal temporal encodings required careful tensor construction. The model includes a graceful fallback if PyG is unavailable, and a lightweight IsolationForest baseline as a final safety net.

  • Safe Containment Design — Implementing automated security responses that DON'T accidentally take down production was the hardest design challenge. The confidence threshold (≥ 0.7), dry-run default, and approval workflow were all born from scenarios where naive auto-remediation would cause worse outages than the attack. The three-action hierarchy (NetworkPolicy → Eviction → Blackhole) provides graduated response options.

  • Multi-Source Telemetry Normalization — Kubernetes audit logs, Cilium network flows, and eBPF syscalls all have different schemas. Building a unified event format that the graph builder can sessionize required careful schema mapping, ISO-8601/epoch timestamp parsing, and handling of edge cases like events spanning multiple sliding windows.

  • Sliding Window Graph Construction — Getting the sessionization right (60s windows, 30s step, overlapping) while maintaining correct graph topology across window boundaries was a subtle engineering challenge. The background flusher thread needed to handle Kafka lag, synthetic fallback event generation, and memory cleanup of processed buffers.

  • Kubernetes Operator Reconciliation — The Go operator's reconciliation loop needed to handle all edge cases: CRDs not yet registered, pods already evicted, NetworkPolicies already existing, approval tokens arriving out of order, and failed actions needing retry with 30-second requeue intervals.

  • Explainable AI in Production — Integrating SHAP DeepExplainer into a Flask-based inference service that runs in resource-constrained containers required a lightweight fallback (xai_explain.py) that computes feature deviations from baseline means without the heavy SHAP dependency — ensuring XAI explanations are always available, even in minimal deployments.

What I Learned

Through this project, I gained deep hands-on experience in:

  • Designing and training Graph Neural Networks (GNNs) with PyTorch Geometric for anomaly detection on dynamic, temporal graph data using contrastive triplet loss optimization.
  • Building Kubernetes-native operators in Go using controller-runtime, with custom CRDs, reconciliation loops, RBAC policies, and approval workflows.
  • Implementing a complete multi-model ML inference pipeline with Autoencoder, LSTM-AE, DeepLog, and TGNN architectures — and understanding when to use each.
  • Integrating Explainable AI (XAI) techniques (SHAP, gradient graph attributions) to make ML model decisions interpretable for security operations teams.
  • Setting up production-grade monitoring with Prometheus, Grafana, and custom metrics exporters — including dashboard design, PromQL queries, color-coded alert thresholds, and histogram quantile calculations.
  • Building streaming data pipelines with Apache Kafka (Strimzi) and file-based alternatives for event ingestion and temporal graph construction.
  • Containerizing a complex multi-service system with Docker Compose (local) and Helm charts (production) — spanning Python, Go, and infrastructure services with autoscaling, PDBs, and Velero backups.
  • Designing safe automated security responses with confidence thresholds, dry-run modes, and human approval workflows — where false positives in automation can be more damaging than the attacks themselves.
  • Building multi-tenant SaaS architectures with JWT authentication, subscription tiers, usage metering, and automated Kubernetes namespace isolation.
  • Writing an IEEE conference paper synthesizing the system design, experimental results, and lessons learned for academic publication.

Most importantly, I learned how to think about security-critical systems engineering — where every automated action must have a rollback path, an approval gate, and an audit trail.

Setup & Execution

The fastest way to run Zero-Day is using Docker Compose, which spins up Prometheus, Grafana, and the Metrics Exporter in one command:

git clone https://github.com/Tejashwini2406/zero-day.git
cd zero-day

bash scripts/start_local_stack.sh

Wait 10–30 seconds for all services to initialize, then:

ServiceURL
Grafana Dashboardhttp://localhost:3000
Prometheushttp://localhost:9090
Metrics Exporterhttp://localhost:8000/metrics

Default Login Credentials:

URL:      http://localhost:3000
Username: admin
Password: admin

Run Demos:

# Terminal 1: Normal traffic
USE_KAFKA=false EVENTS_FILE=events.jsonl bash scripts/demo_normal.sh

# Terminal 2: Attack traffic (5 waves × 100 events = 500 alerts)
bash scripts/attack_wave.sh

Watch the Grafana dashboard update in real-time — Events/sec increases, Attack Score spikes from Green → Yellow → Red.

Manual Setup (Full Kubernetes)

Prerequisites: kubectl, Docker, Python 3.11+, Go 1.21+, Helm 3+, jq, curl

1. Cluster Setup

make setup-minikube        # Start cluster with Istio + Cilium
make setup-telemetry       # Deploy Kafka, OTel, Fluent Bit
make setup-monitoring      # Deploy Prometheus/Grafana/ClickHouse

2. Build & Deploy

make build-images          # Build 5 container images
make deploy-all            # Deploy all services to Kubernetes

3. Train ML Models

make train-ml-full         # Synthetic data → Graph windows → AE → LSTM-AE → TGNN → Validation

4. Test Inference

make test-inference        # Port-forward and POST test features to /score

5. Access Dashboard

kubectl -n ml port-forward svc/prometheus 9090:9090 &
kubectl -n ml port-forward svc/grafana 3000:3000 &

Open Grafana at http://localhost:3000 → Dashboard UID: zerodaymetrics.

Helm Deployment (Production)

helm install zero-day ./helm/zero-day-saas \
  --set highAvailability.replicas.inferenceService=3 \
  --set autoscaling.hpa.maxReplicas=15 \
  --set security.mtls.enabled=true \
  --set backup.velero.enabled=true

Kubernetes Namespace Structure

NamespaceServicesPurpose
mlgraph-builder, inference-service, trainer (CronJob)ML pipeline and inference
quarantinecontainment-operatorSecurity enforcement and pod isolation
monitoringPrometheus, Grafana, AlertManager, ClickHouseObservability and alerting
kafkaStrimzi Kafka cluster, Zookeeper (3 brokers)Event streaming (optional)
prodTarget production microservicesProtected workloads
devDevelopment and testing sandboxStaging environment

Security Hardening

  • default-deny-all NetworkPolicy applied to prod namespace
  • Explicit ingress allowed only from authorized ingress gateways
  • Egress restricted to monitoring endpoints and internal cluster DNS
  • Pod Security Standards: readOnlyRootFilesystem: true, runAsNonRoot: true, allowPrivilegeEscalation: false, drop: ["ALL"] capabilities
  • PodDisruptionBudget: minAvailable: 1 for HA services
  • podAntiAffinity: Spread across physical topology zones
  • ResourceQuotas and LimitRanges per tenant namespace

Future Enhancements

Planned Improvement
Complete TGNN with full PyG tensor conversion and advanced temporal graph neural network
XAI expansion with GNNExplainer and Integrated Gradients for node/edge attributions
Attack playbooks for container escape, privilege escalation, and lateral movement scenarios
Real Kafka broker integration replacing file mode for production throughput
GraphQL API alongside REST for flexible querying
Multi-region deployment support on GKE/EKS/AKS via Terraform modules
Advanced containment: VirtualService blackholing, PodDisruptionBudgets, capability restrictions
Elasticsearch integration for full-text metadata search across telemetry events
Grafana auth with LDAP/OAuth2 and RBAC roles
Long-term metrics storage with Prometheus remote write to ClickHouse
AlertManager integration with webhook notifications (Slack, PagerDuty)
Production dashboards with model drift detection and retraining triggers

Performance Metrics

MetricActualTarget
Startup Time< 30 seconds< 1 minute ✅
Dashboard Load< 200ms< 500ms ✅
Metrics Latency< 5 seconds< 10 seconds ✅
Alert DetectionReal-time (< 1s)< 100ms ✅
Inference Latency50ms< 100ms ✅
Services Stability100% uptime99.9% ✅
ROC-AUC Score0.92> 0.90 ✅
Containment Success85%> 80% ✅

IEEE Research Paper

The project includes a formal IEEE Transactions conference paper (paper/zero_day_ieee.tex):

  • Title: Zero-Day Detection Proof-of-Concept: A Pipeline, Monitoring, and Evaluation
  • Format: Standard IEEE 2-column conference format
  • Core Thesis: Demonstrates that combining sliding-window graph abstractions of Kubernetes telemetry with deep learning anomaly detection and explainability (XAI) enables rapid, signature-less mitigation of unknown zero-day attacks with minimal false positives.
  • Key Findings: Successfully evaluated on Minikube producing 120+ graph windows; latency from attack injection to dashboard visualization verified under 1 second.

Conclusion

Zero-Day demonstrates how a well-architected, multi-layered security framework can solve one of the hardest problems in cloud-native security — detecting and mitigating zero-day attacks in Kubernetes clusters — with a combination of graph-based AI, safe automation, and production-grade observability.

It highlights the importance of:

  • Temporal Graph Neural Networks for capturing inter-container relationships that flat-feature models miss — using graph attention mechanisms and sinusoidal temporal encodings
  • Multi-model ensemble approach combining speed (Autoencoder) with accuracy (TGNN) for robust anomaly detection with 0.92 ROC-AUC
  • Explainable AI via SHAP and gradient graph attributions so SOC analysts understand why an alert fired — not just the score
  • Safe automated containment with confidence thresholds (≥ 0.7), dry-run defaults, and human approval workflows — because false positives in security automation are worse than no automation
  • Kubernetes-native design using CRDs, Go operators, and the reconciliation pattern for reliable, idempotent security enforcement
  • Production-grade observability with Prometheus metrics, 8-panel Grafana dashboards, and traffic-light color-coded alert thresholds
  • Multi-tenant SaaS architecture with JWT auth, subscription tiers, and automated namespace isolation
  • Docker-first development for rapid local prototyping with a clear upgrade path to Helm-based Kubernetes deployment

This project bridges the gap between ML research and production security operations, proving that graph neural networks can be practically deployed for real-time threat detection in containerized environments.

If you found this helpful, star the repo on GitHub!

Download Project Report (PDF)