Veröffentlicht am

Kubernetes Incident Response mit Falco unter 30 Min

Teilen:
Authors

Kubernetes Incident Response: Vom Alert zum Fix in unter 30 Minuten

TL;DR

  • Die meisten Kubernetes-Security-Incidents werden zu spaet erkannt. Durchschnittliche Detection-Zeit ohne Tooling: Stunden bis Tage.
  • Falco ist der De-facto-Standard fuer Kubernetes Runtime Security. Es erkennt verdaechtiges Verhalten auf Syscall-Ebene in Echtzeit.
  • Automatisierte Response (SOAR) kann einfache Incidents wie Crypto-Miner oder Reverse Shells in Sekunden isolieren.
  • Ein dokumentiertes Playbook ist wichtiger als jedes Tool. Ohne klare Zustaendigkeiten und Prozesse nuetzt die beste Erkennung nichts.
  • Teste dein Incident-Response-Setup regelmaessig mit simulierten Angriffen.

Warum Kubernetes-Umgebungen besonders verwundbar sind

Kubernetes hat eine grosse Angriffsflaeche. Im Vergleich zu klassischen VMs gibt es mehr Komponenten, mehr APIs und mehr Konfigurationsoberflaeche. Einige typische Angriffsvektoren:

  • Fehlkonfigurierte RBAC-Rollen: Zu weitreichende ClusterRoles erlauben Lateral Movement.
  • Unsichere Container-Images: Basis-Images mit bekannten CVEs, die nie gepatcht werden.
  • Exponierter API-Server: Unauthentifizierte oder zu offene API-Server-Endpunkte.
  • Privilegierte Container: Container mit privileged: true oder Zugriff auf den Host-Namespace.
  • Supply Chain Attacks: Kompromittierte Dependencies in Container-Images.

Das Problem: Standard-Monitoring (Prometheus, Grafana) erkennt Performance-Probleme, aber keine Security-Incidents. Dafuer braucht man spezialisierte Runtime-Security-Tools.

Falco: Runtime-Erkennung auf Syscall-Ebene

Falco ist ein CNCF Graduated Project und der meistgenutzte Runtime-Security-Ansatz fuer Kubernetes. Es ueberwacht Systemaufrufe (Syscalls) auf jedem Node und vergleicht sie mit Regeln. Wenn ein Container etwas tut, das er nicht tun sollte, generiert Falco einen Alert.

Installation

# Falco per Helm installieren
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

helm install falco falcosecurity/falco \
  --namespace falco \
  --create-namespace \
  --set falcosidekick.enabled=true \
  --set falcosidekick.config.slack.webhookurl="https://hooks.slack.com/services/XXX" \
  --set falcosidekick.config.slack.minimumpriority=warning

Falco laeuft als DaemonSet auf jedem Node. falcosidekick ist ein Event-Router, der Falco-Alerts an verschiedene Ziele weiterleiten kann: Slack, PagerDuty, Elasticsearch, Prometheus Alertmanager, und mehr.

Wichtige Default-Regeln

Falco kommt mit einer umfangreichen Regelsammlung. Einige der wichtigsten:

RegelErkenntSeverity
Terminal shell in containerJemand oeffnet eine Shell in einem laufenden ContainerWarning
Contact K8S API Server From ContainerEin Pod kontaktiert den API-Server (ungewoehnlich fuer die meisten Workloads)Notice
Read sensitive file untrustedZugriff auf /etc/shadow, /etc/passwd im ContainerWarning
Launch Crypto MinersBekannte Mining-Prozesse (xmrig, etc.) werden gestartetCritical
Unexpected outbound connectionContainer verbindet sich mit unbekannten externen IPsWarning
Write below etcSchreibzugriff auf /etc/ im ContainerWarning

Custom Rules

Fuer eigene Anforderungen lassen sich Falco-Regeln erweitern. Beispiel: Alert wenn ein Container in einem Production-Namespace eine Shell oeffnet:

- rule: Shell in Production Container
  desc: Ein interaktiver Shell-Prozess wurde in einem Production-Container erkannt
  condition: >
    spawned_process
    and container
    and shell_procs
    and k8s.ns.name = "production"
    and not proc.pname in (cron, crond)
  output: >
    Shell in Production-Container gestartet
    (user=%user.name container=%container.name
    namespace=%k8s.ns.name pod=%k8s.pod.name
    shell=%proc.name parent=%proc.pname
    cmdline=%proc.cmdline)
  priority: CRITICAL
  tags: [container, shell, production]

Incident-Response-Playbook

Tooling allein reicht nicht. Du brauchst ein dokumentiertes Playbook, das jeder im Team kennt. Hier ein pragmatisches Framework.

Stufe 1: Erkennung und Klassifizierung (0-5 Minuten)

Der Alert kommt rein (Falco, Prometheus, Audit Log). Erste Fragen:

  1. Was wurde erkannt? Shell-Zugriff, ungewoehnlicher Netzwerk-Traffic, Crypto-Miner, etc.
  2. Wo? Welcher Cluster, Namespace, Pod, Container?
  3. Severity? Critical (sofortige Aktion), Warning (Analyse noetig), Notice (beobachten).
  4. Blast Radius? Einzelner Pod, gesamter Namespace, Cluster-weit?

Stufe 2: Containment (5-15 Minuten)

Ziel: Den Schaden begrenzen, ohne den gesamten Service zu stoeren.

Option A: Netzwerk-Isolation per NetworkPolicy

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: isolate-compromised-pod
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: compromised-service
  policyTypes:
    - Ingress
    - Egress
  ingress: []
  egress: []

Diese Policy blockiert jeglichen ein- und ausgehenden Traffic fuer den betroffenen Pod. Achtung: Funktioniert nur, wenn ein CNI-Plugin installiert ist, das NetworkPolicies unterstuetzt (Calico, Cilium, etc. -- das Default-Netzwerk-Plugin vieler Managed-Kubernetes-Dienste unterstuetzt NetworkPolicies nicht).

Option B: Pod sofort loeschen und Deployment skalieren

# Kompromittierten Pod loeschen
kubectl delete pod compromised-pod-abc123 -n production

# Falls der Pod ueber ein Deployment laeuft, startet K8s automatisch einen neuen,
# sauberen Pod vom gleichen Image.
# Falls das Image selbst kompromittiert ist: Deployment auf letztes bekanntes gutes Image rollbacken
kubectl rollout undo deployment/my-service -n production

Option C: Node cordon + drain (bei Verdacht auf Host-Kompromittierung)

kubectl cordon node-xyz
kubectl drain node-xyz --ignore-daemonsets --delete-emptydir-data

Stufe 3: Analyse (15-30 Minuten)

Sobald die Bedrohung eingedaemmt ist, beginnt die forensische Analyse:

  • Falco-Alerts reviewen: Vollstaendige Timeline der verdaechtigen Aktivitaeten.
  • Kubernetes Audit Logs pruefen: Wer hat was wann am API-Server gemacht? Wurden neue ServiceAccounts oder ClusterRoleBindings erstellt?
  • Container-Logs sichern: Bevor der Pod geloescht wird, Logs exportieren (kubectl logs oder aus dem zentralen Log-System).
  • Image analysieren: Welches Image lief im kompromittierten Container? Gibt es bekannte CVEs? Wurde das Image manipuliert?

Stufe 4: Recovery und Haertung

  • Betroffene Deployments auf ein sicheres Image aktualisieren.
  • Kompromittierte Secrets rotieren (Service Account Tokens, API Keys, Datenbankpasswoerter).
  • Ursache dokumentieren und Gegenmaßnahmen definieren.
  • Policy hinzufuegen, die den Angriffsvektor kuenftig blockiert (z.B. kein privileged: true mehr erlauben).

Automatisierte Response mit Falco Talon

Fuer wiederkehrende, klar definierte Bedrohungen kann die Response automatisiert werden. Falco Talon ist ein Response-Engine, der auf Falco-Events reagiert und vordefinierte Aktionen ausfuehrt.

Beispiel-Konfiguration:

# falco-talon rules
- action: KillPod
  description: Crypto-Miner sofort beenden
  match:
    rules:
      - Launch Crypto Miners
    priority: critical
    output_fields:
      k8s.ns.name: "*"
  parameters:
    grace_period: 0

- action: NetworkIsolate
  description: Verdaechtige ausgehende Verbindungen isolieren
  match:
    rules:
      - Unexpected outbound connection
    priority: warning
    output_fields:
      k8s.ns.name: "production"
  parameters:
    allow_dns: true

Die automatisierte Response ist maechtig, aber auch riskant. Ein False Positive bei einem Critical-Alert kann einen produktiven Pod killen. Deshalb:

  • Starte mit Low-Risk-Actions (Alerting, Labeling) und steigere schrittweise.
  • Teste automatisierte Responses in Staging, bevor sie in Produktion aktiv sind.
  • Implementiere immer einen Kill-Switch, um die Automatisierung sofort deaktivieren zu koennen.

Kubernetes Audit Logs als Datenquelle

Neben Falco sind die Kubernetes Audit Logs eine wichtige Informationsquelle. Sie protokollieren jede Anfrage an den API-Server.

Konfiguriere ein Audit-Policy, die relevante Events erfasst, ohne das Log-Volumen zu sprengen:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  # Keine Logs fuer Read-Only-Anfragen an bekannte Endpoints
  - level: None
    resources:
      - group: ""
        resources: ["events"]
  # Metadata fuer alles andere
  - level: Metadata
    stages:
      - ResponseComplete
  # Request+Response fuer sicherheitsrelevante Ressourcen
  - level: RequestResponse
    resources:
      - group: ""
        resources: ["secrets", "configmaps"]
      - group: "rbac.authorization.k8s.io"
        resources: ["clusterroles", "clusterrolebindings", "roles", "rolebindings"]

Diese Audit Logs sollten an ein zentrales System (Loki, Elasticsearch) weitergeleitet werden, damit sie im Incident-Fall durchsuchbar sind.

Vergleich: Managed vs. Self-Hosted Security

KriteriumManaged Security ServiceSelf-Hosted (Falco + eigenes Team)
Initiale KostenGering (Service-Gebuehr)Hoeher (Setup + Einarbeitung)
Laufende Kosten2.000-10.000 EUR/Monat500-2.000 EUR/Monat (Infra + Personalanteil)
24/7-AbdeckungJa (im Service enthalten)Nur mit Bereitschaftsdienst
AnpassbarkeitEingeschraenktVollstaendig
DatenhoheitDaten beim AnbieterDaten in eigener Infrastruktur
Time-to-ValueSchnell (Wochen)Mittel (1-3 Monate)
Expertise noetigWeniger internMehr intern

Fuer Teams mit wenig Security-Expertise ist ein Managed Service oft der schnellere Weg zu einem soliden Sicherheitsniveau. Fuer Teams mit vorhandenem Know-how und strengen Anforderungen an Datenkontrolle kann Self-Hosted die bessere Wahl sein.

Praeventive Massnahmen

Incident Response ist wichtig, aber Praevention ist besser. Einige Massnahmen, die die Angriffsflaeche reduzieren:

  • Pod Security Standards (PSS) erzwingen: Die Built-in Pod Security Admission in Kubernetes (ab v1.25 stable) kann restricted, baseline oder privileged Sicherheitslevel pro Namespace erzwingen.
  • Network Policies als Default: Jeder Namespace sollte eine Default-Deny NetworkPolicy haben. Nur explizit freigegebener Traffic wird erlaubt.
  • Image Scanning in CI/CD: Trivy, Grype oder Snyk in der Build-Pipeline integrieren. Images mit Critical CVEs blockieren.
  • RBAC minimieren: Verwende das Prinzip der minimalen Berechtigung. Keine Wildcard-Rechte (*) in ClusterRoles.
  • Secrets verschluesseln: Nutze External Secrets Operator mit einem Key Management System statt Kubernetes-nativer Secrets.

Weitere Details zu praeventiven Security-Massnahmen findest du unter Kubernetes Runtime Security und Kubernetes Network Security.

Regelmaessig testen: Chaos Engineering fuer Security

Ein Incident-Response-Plan, der nie getestet wird, funktioniert im Ernstfall nicht. Plane regelmaessige Security-Tests:

  • Tabletop Exercises: Das Team geht ein Szenario am Whiteboard durch. Wer macht was, wann, wie?
  • Red Team / Penetration Testing: Ein externes oder internes Team versucht, in den Cluster einzubrechen. Falco und das Playbook muessen die Angriffe erkennen und die Response muss greifen.
  • Chaos Engineering: Tools wie Chaos Mesh oder Litmus koennen Netzwerk-Ausfaelle, Pod-Kills und Ressourcen-Engpaesse simulieren. Details dazu unter Kubernetes Chaos Engineering.

Weiterfuehrende Artikel

Fazit

Kubernetes Incident Response ist kein Thema, das man aufschieben sollte. Die Frage ist nicht ob, sondern wann ein Security-Incident passiert. Mit Falco als Erkennungs-Engine, einem dokumentierten Playbook und getesteten Response-Prozessen reduzierst du die Mean Time to Detect (MTTD) und Mean Time to Respond (MTTR) auf Minuten statt Stunden.

Der erste Schritt: Falco im Cluster installieren, die Default-Regeln aktivieren, und schauen, was passiert. Die Ergebnisse sind oft ueberraschend.

Wenn du Unterstuetzung beim Aufbau deines Incident-Response-Setups brauchst oder ein Security Assessment fuer deine Kubernetes-Umgebung willst, melde dich unter /kontakt.

Kubernetes-Beratung gesucht?

Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.

📖 Verwandte Artikel

Weitere interessante Beiträge zu ähnlichen Themen