Falco mit Docker installieren: CNCF-Runtime-Security für Container
Falco ist das einzige CNCF-graduierte Runtime-Security-Tool für Container: Es überwacht per eBPF jeden Systemaufruf in Echtzeit und erkennt Shell-Spawning oder Privilege-Escalation sofort. Diese Anleitung zeigt den vollständigen Docker-Compose-Stack mit Falcosidekick und Web-UI.

Wer Docker-Container betreibt, sichert sie meist vor dem Start ab: Images scannen, Ports minimieren, Netzwerke trennen. Was danach passiert – zur Laufzeit – bleibt oft blind. Genau hier setzt Falco an: Das CNCF-graduierte Open-Source-Tool hängt sich per eBPF tief in den Linux-Kernel ein und analysiert jeden Systemaufruf aller laufenden Container in Echtzeit. Sobald ein Container eine Shell startet, Rechte eskaliert, auf sensible Dateien zugreift oder unerwartete Netzwerkverbindungen öffnet, feuert Falco sofort einen Alert – ohne nennenswerten Performance-Impact. Für DevOps- und Security-Teams in KMU ist Falco der fehlende letzte Verteidigungsring, der auch nach dem Deployment noch schützt.
Voraussetzungen
- Linux-Host (Ubuntu 22.04+, Debian 12, oder beliebige Linux-VM/NAS mit Docker-Support) – Windows und macOS Docker Desktop werden von Falco nicht unterstützt, da der Kernel-Zugriff fehlt.
- Linux-Kernel 5.8+ für den Modern-eBPF-Modus (empfohlen, kein Treiber-Kompilieren nötig). Ältere Kernel (ab 4.14) funktionieren mit eBPF-Probe oder Kernel-Modul.
- Docker Engine 20.10+ und Docker Compose v2 (Plugin-Variante, Befehl
docker compose) installiert – siehe Docker und Docker Compose auf Linux installieren. - Root- oder sudo-Zugriff: Falco braucht zwingend erhöhte Rechte (
privileged: trueoder CAP_SYS_ADMIN). - Internetzugang vom Host: Beim ersten Start lädt
falcoctlautomatisch die Community-Regelsets herunter. - Mindestens 512 MB RAM für Falco, weitere 256 MB für Falcosidekick + Redis.
- Optional: Reverse Proxy mit HTTPS, wenn die Falcosidekick-UI über das Internet erreichbar sein soll – empfehlenswert, da die UI keine eigene Authentifizierung mitbringt.
Schritt 1: Projektordner und .env anlegen
Lege einen dedizierten Projektordner an und erstelle die Konfigurationsdatei. Alle anpassbaren Einstellungen – z. B. Slack-Webhook für Alert-Weiterleitung – kommen ausschließlich in die .env, nicht direkt in die compose.yaml.
sudo mkdir -p /opt/falco
cd /opt/falcoErstelle die .env-Datei:
# /opt/falco/.env
# Falcosidekick: optionaler Slack-Webhook für Alert-Weiterleitung
# Leer lassen, wenn kein Slack verwendet wird
SLACK_WEBHOOKURL=
# Weitere Ausgabe-Ziele (optional, Falcosidekick unterstützt >50 Ziele)
# TEAMS_WEBHOOKURL=
# PAGERDUTY_ROUTINGKEY=
# Falcosidekick-UI aktivieren
FALCOSIDEKICK_UI=trueVerifizieren: Die Datei ist vorhanden und lesbar:
ls -la /opt/falco/.env
# Erwartete Ausgabe: -rw-r--r-- 1 root root ... .envSchritt 2: compose.yaml erstellen
Der Stack besteht aus vier Services: Falco (Kernel-Sensor), Falcosidekick (Alert-Router), Falcosidekick-UI (Web-Dashboard) und Redis (Alert-Persistenz für die UI). Wichtig: Falco benötigt zwingend privileged: true sowie mehrere Host-Bind-Mounts für Kernel-Tracing, Docker-Socket und Prozess-Informationen.
Die nachfolgende Tabelle gibt einen Überblick über alle Image-Parameter, bevor wir zur vollständigen compose.yaml kommen:
| Parameter | Wert | Hinweis |
|---|---|---|
| Image Falco | falcosecurity/falco:0.44.1 | Stabiles Tag pinnen, nicht :latest |
| Image Falcosidekick | falcosecurity/falcosidekick:latest | Alert-Router, >50 Ausgabe-Ziele |
| Image Falcosidekick-UI | falcosecurity/falcosidekick-ui:latest | Web-Dashboard Port 2346 |
| Image Redis | redis:7-alpine | Alert-Persistenz für die UI |
| Port Falcosidekick | 2345:2345 | Alert-Eingang von Falco |
| Port Falcosidekick-UI | 2346:2346 | Browser-Zugriff auf Dashboard |
| Architektur | amd64, arm64 | Offiziell unterstützt (z. B. AWS Graviton) |
| Volume / Mount | Zweck | Pflicht |
|---|---|---|
| /sys/kernel/tracing:ro | Kernel-Tracing für Modern eBPF | Ja (Kernel 5.8+) |
| /var/run/docker.sock | Container-Metadaten | Ja |
| /proc:/host/proc:ro | Prozess-Informationen | Ja |
| /etc:/host/etc:ro | Host-Konfiguration für Enrichment | Ja |
| redis_data | Alert-Historie für Falcosidekick-UI | Empfohlen |
Erstelle jetzt die vollständige compose.yaml:
# /opt/falco/compose.yaml
services:
falco:
image: falcosecurity/falco:0.44.1
restart: unless-stopped
# Falco benötigt privilegierten Zugriff für Kernel-Tracing.
# In Produktion stattdessen: cap_add + cap_drop all (siehe Troubleshooting).
privileged: true
ulimits:
memlock:
soft: -1
hard: -1
volumes:
# Kernel-Tracing für Modern eBPF (Kernel 5.8+ pflicht)
- /sys/kernel/tracing:/sys/kernel/tracing:ro
# Docker-Socket für Container-Metadaten
- /var/run/docker.sock:/host/var/run/docker.sock
# Prozess-Informationen vom Host
- /proc:/host/proc:ro
# Host-Konfiguration für Kontext-Anreicherung
- /etc:/host/etc:ro
environment:
# falcoctl lädt Community-Rules beim ersten Start automatisch
- SKIP_DRIVER_LOADER=false
# Falcosidekick-Verbindung: Falco sendet Alerts per HTTP an Port 2345
command: >
falco
-o "json_output=true"
-o "http_output.enabled=true"
-o "http_output.url=http://falcosidekick:2345"
depends_on:
- falcosidekick
falcosidekick:
image: falcosecurity/falcosidekick:latest
restart: unless-stopped
ports:
- "2345:2345"
environment:
- LISTENADDRESS=0.0.0.0
- LISTENPORT=2345
# Slack-Webhook aus .env (leer = deaktiviert)
- SLACK_WEBHOOKURL=${SLACK_WEBHOOKURL:-}
# Webui aktivieren und Adresse angeben
- WEBUI_URL=http://falcosidekick-ui:2346
depends_on:
- falcosidekick-ui
falcosidekick-ui:
image: falcosecurity/falcosidekick-ui:latest
restart: unless-stopped
ports:
- "2346:2346"
environment:
# Redis für Alert-Persistenz (optional, aber empfohlen)
- FALCOSIDEKICK_UI_REDIS_URL=redis:6379
depends_on:
- redis
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
- redis_data:/data
volumes:
redis_data:Verifizieren: Die YAML-Syntax ist korrekt (kein Fehler bei der Ausgabe):
cd /opt/falco && docker compose config --quiet
# Keine Ausgabe = kein SyntaxfehlerSchritt 3: Stack starten
Starte alle vier Services mit einem einzigen Befehl. Beim ersten Start zieht Docker die Images und falcoctl lädt automatisch die aktuellen Community-Regelsets herunter – das dauert je nach Internetverbindung bis zu zwei Minuten.
cd /opt/falco
docker compose up -dErwartete Ausgabe (gekürzt):
✔ Network falco_default Created
✔ Container falco-redis-1 Started
✔ Container falco-falcosidekick-ui-1 Started
✔ Container falco-falcosidekick-1 Started
✔ Container falco-falco-1 StartedVerifizieren: Alle Container laufen (Status „Up"):
docker compose ps
# NAME STATUS
# falco-falco-1 Up X seconds
# falco-falcosidekick-1 Up X seconds
# falco-falcosidekick-ui-1 Up X seconds
# falco-redis-1 Up X secondsPrüfe außerdem die Falco-Logs auf erfolgreichen Treiber-Load und Regelsets:
docker compose logs falco | tail -30
# Gesuchte Zeilen (Beispiel):
# Falco version: 0.44.1
# Loading rules from file /etc/falco/falco_rules.yaml
# Starting health webserver with threadiness 4
# Enabled event sources: syscallSchritt 4: Falcosidekick-UI im Browser öffnen
Öffne im Browser http://<SERVER-IP>:2346 – du siehst die Falcosidekick-UI mit einer Echtzeit-Übersicht aller Falco-Alerts nach Priorität, Regelname und betroffenen Containern. Zu Beginn ist die Ansicht leer, da noch keine Alerts gefeuert wurden.
Verifizieren: Die UI antwortet per HTTP:
curl -I http://localhost:2346
# Erwartete Ausgabe:
# HTTP/1.1 200 OKFalcosidekick selbst ist auf Port 2345 erreichbar:
curl -s http://localhost:2345/ping
# Erwartete Ausgabe: pongSchritt 5: Falco-Erkennung testen
Falco schlägt sofort an, wenn ein Container eine Shell startet – eines der häufigsten Anzeichen für eine laufende Attacke. Teste das mit einem einzeiligen Befehl: Der offizielle event-generator triggert gezielt bekannte Regeln und ist das empfohlene Werkzeug für funktionale Tests.
Variante A – einfacher Shell-Test in einem bestehenden Container:
# Starte einen Test-Container und öffne eine Shell darin
docker run -it --rm alpine sh -c "whoami"
# Falco sollte sofort 'Terminal shell in container' loggenVariante B – offizieller Event-Generator (triggert mehrere Regeln):
docker run -it --rm falcosecurity/event-generator run syscall --loopVerifizieren: Alerts erscheinen in den Falco-Logs:
docker compose logs falco | grep -i "Warning\|Critical\|Error" | tail -20
# Beispiel-Alert:
# Warning Symlinks created over sensitive files
# (user=root command=ln -s /etc/shadow /tmp/shadow ...)In der Falcosidekick-UI unter http://<SERVER-IP>:2346 tauchen die Alerts jetzt ebenfalls auf – mit Zeitstempel, Regelname, Container-ID und Host-Kontext.
Schritt 6: Eigene Regeln einbinden (optional)
Falco liest Regeln aus /etc/falco/falco_rules.yaml und aus allem, was in /etc/falco/rules.d/ liegt. Eigene Regeln ergänzen die Community-Defaults, ohne sie zu überschreiben. Erstelle lokal eine Regel-Datei und mounte sie per Volume:
Beispiel-Regelfile /opt/falco/custom_rules.yaml:
- rule: Curl in Container detected
desc: Jemand führt curl in einem Container aus
condition: spawned_process and proc.name = "curl" and container
output: "curl-Aufruf in Container (user=%user.name cmd=%proc.cmdline container=%container.name)"
priority: WARNING
tags: [network, custom]Füge das Volume in der compose.yaml unter dem falco-Service hinzu:
volumes:
- /sys/kernel/tracing:/sys/kernel/tracing:ro
- /var/run/docker.sock:/host/var/run/docker.sock
- /proc:/host/proc:ro
- /etc:/host/etc:ro
# Eigene Regeln:
- /opt/falco/custom_rules.yaml:/etc/falco/rules.d/custom_rules.yaml:roDanach den Falco-Service neu starten:
cd /opt/falco && docker compose up -d falcoVerifizieren: Falco lädt die eigene Regel:
docker compose logs falco | grep "custom_rules"
# Erwartete Ausgabe:
# Loading rules from file /etc/falco/rules.d/custom_rules.yamlSchritt 7: Updates durchführen
Für Updates ziehe neue Images und starte den Stack neu. Das gepinnte Tag 0.44.1 für Falco solltest du bewusst auf neue Releases anpassen – prüfe dazu das Falco GitHub-Repository auf neue Releases. Falcosidekick und die UI laufen auf :latest und werden automatisch aktuell gezogen. Für ein strukturiertes Container-Update-Konzept empfiehlt sich Diun oder WUD als Watchtower-Nachfolger.
cd /opt/falco
docker compose pull
docker compose up -d
docker compose psVerifizieren: Alle Container laufen mit aktualisierten Images:
docker compose ps
docker images | grep falcoTroubleshooting / Typische Fehler
- „Failed to load the driver" / „BPF probe: permission denied" – Ursache:
privileged: truefehlt, oder der Kernel ist älter als 5.8. Lösung:privileged: trueergänzen oder Kernel-Modul-Modus aktivieren:-o engine.kind=kmodin den Falco-Startparametern. - „/sys/kernel/tracing: No such file or directory" – Ursache: Ältere Kernels mounten tracefs unter
/sys/kernel/debug/tracing. Lösung: Volume-Mount ändern auf/sys/kernel/debug/tracing:/sys/kernel/debug/tracing:ro. - Falco startet, aber keine Alerts erscheinen – Ursache:
falcoctlkann Community-Regeln nicht herunterladen (kein Internetzugang vom Container). Lösung: Regeln manuell herunterladen und als Volume mounten, oderFALCOCTL_DRIVER_REPOSauf einen internen Mirror setzen. - „docker.sock: permission denied" – Ursache: Falscher Volume-Pfad. Das Mapping muss exakt
/var/run/docker.sock:/host/var/run/docker.socklauten – nicht/var/run/docker.sock:/var/run/docker.sock. - Falcosidekick zeigt „connection refused" zu Falco – Ursache: Falco sendet Alerts nicht per HTTP an Falcosidekick. Prüfe, ob der Befehl in der
compose.yamldie Flags-o "http_output.enabled=true"und-o "http_output.url=http://falcosidekick:2345"enthält. - „mmap: Operation not permitted" beim eBPF-Probe-Laden – Ursache: RLIMIT_MEMLOCK zu niedrig. Lösung:
ulimits: memlock: soft: -1 hard: -1unter demfalco-Service ergänzen (im Beispiel oben bereits enthalten). - ARM64-Host: Kernel-Modul-Treiber steht nicht bereit – Empfehlung: Modern eBPF verwenden (
engine.kind=modern_ebpf), das erfordert keine Kompilierung. - „rule file not found" für eigene Regeln – Ursache: Regelfiles außerhalb von
/etc/falco/rules.d/gemountet. Falco liest nur aus/etc/falco/falco_rules.yamlund/etc/falco/rules.d/.
Häufige Fragen
Braucht Falco eine Datenbank?
Nein. Falco selbst ist vollständig zustandslos und benötigt keine Datenbank. Redis im Stack dient ausschließlich der Falcosidekick-UI, damit die Alert-Geschichte über Container-Neustarts hinaus erhalten bleibt. Wer die UI-Persistenz nicht braucht, kann Redis weglassen und die FALCOSIDEKICK_UI_REDIS_URL-Umgebungsvariable entfernen.
Welcher Treiber-Modus ist empfohlen?
Für die meisten Setups ist Modern eBPF die beste Wahl: Er ist seit Falco 0.35+ direkt im Falco-Binär eingebettet, muss nicht separat kompiliert werden und läuft auf jedem Linux-Kernel ab 5.8. Ubuntu 22.04 und Debian 12 erfüllen diese Anforderung von Haus aus. Für ältere Kernel (ab 4.14) ist die eBPF-Probe die nächste Option, erfordert aber einen Treiber-Build via falco-driver-loader.
Kann Falco auf Windows oder macOS laufen?
Nein. Falco greift direkt auf Linux-Kernel-Systemaufrufe zu – das ist technisch nicht möglich unter Windows oder macOS, auch nicht über Docker Desktop. Du brauchst zwingend einen echten Linux-Host oder eine Linux-VM (z. B. auf Proxmox, Hetzner oder Netcup). Docker Desktop auf Windows/macOS simuliert keinen vollständigen Linux-Kernel mit eBPF-Support.
Wie hoch ist der Performance-Impact?
Laut Falco-Projekt-Benchmarks liegt der CPU-Overhead des Modern-eBPF-Treibers auf einem typischen Produktionssystem unter 3 % – deutlich weniger als klassische Kernel-Module oder User-Space-Agenten. Der Grund: eBPF-Programme laufen im Kernel-Kontext ohne Kontext-Wechsel in den User-Space.
Kann ich Alerts an Slack, Teams oder PagerDuty weiterleiten?
Ja, genau dafür ist Falcosidekick zuständig. Es unterstützt über 50 Ausgabe-Ziele. Für Slack reicht es, die Variable SLACK_WEBHOOKURL in der .env-Datei zu setzen. Weitere Ziele wie Microsoft Teams (TEAMS_WEBHOOKURL) oder PagerDuty (PAGERDUTY_ROUTINGKEY) werden analog konfiguriert.
Sollte ich in Produktion wirklich --privileged verwenden?
Der Einfachheit halber setzt diese Anleitung auf privileged: true, was dem Container nahezu uneingeschränkten Host-Zugriff gibt. In Produktionsumgebungen empfiehlt die offizielle Falco-Dokumentation stattdessen Least-Privilege: cap_add: [SYS_ADMIN, SYS_RESOURCE, SYS_PTRACE] kombiniert mit cap_drop: [ALL]. Das reduziert die Angriffsfläche erheblich, während Falco weiterhin alle notwendigen Rechte behält. Mehr dazu in der Anleitung Docker Compose absichern: Secrets, Healthchecks, Non-Root.
Wie überprüfe ich, ob Falco-Images legitim sind?
Alle offiziellen Falco-Container-Images ab Version 0.35.0 sind mit cosign signiert. Du kannst die Signatur prüfen mit: cosign verify falcosecurity/falco:0.44.1 --certificate-oidc-issuer=https://token.actions.githubusercontent.com. Das ist besonders sinnvoll in automatisierten CI/CD-Pipelines, bevor ein neues Image eingespielt wird. Mehr zum Thema Image-Sicherheit findest du in der Anleitung Docker-Images auf Schwachstellen scannen mit Trivy.
Fazit
Falco schließt eine echte Lücke im Container-Sicherheitskonzept: Was vor dem Deployment passiert, lässt sich gut mit Image-Scannern absichern. Was zur Laufzeit passiert, sieht man ohne ein Tool wie Falco schlicht nicht. Das CNCF-Graduation-Label ist dabei kein Marketing, sondern ein Zeichen für produktionsreife Stabilität – das Projekt wird aktiv gepflegt und folgt klaren Release-Zyklen.
Für KMU und DevOps-Teams, die Docker-Umgebungen ohne enormen Aufwand gegen Laufzeit-Angriffe absichern wollen, ist der hier beschriebene Stack aus Falco, Falcosidekick und der Web-UI ein pragmatischer Einstieg: einmal aufgesetzt, läuft er wartungsarm im Hintergrund und liefert sofort umsetzbare Alerts. Wer danach mehr Tiefe will, kann Falcosidekick an Elasticsearch oder Grafana Loki anbinden und die Alerts in bestehende Monitoring-Infrastruktur integrieren – etwa zusammen mit dem Beszel Server Monitoring.
Weiterführende Anleitungen und Quellen
- Docker-Images auf Schwachstellen scannen mit Trivy: CVE-Check, SBOM und automatische Scans
- Docker Compose absichern: Secrets, Healthchecks, Non-Root und Read-Only für den Produktivbetrieb
- Docker-Container automatisch aktualisieren nach dem Watchtower-Aus: Diun, WUD und Renovate
- Docker und Docker Compose auf Linux installieren: die Self-Hosting-Grundlage
- Linux-Server absichern: UFW-Firewall und Fail2ban
Offizielle Quellen: Falco Container-Deployment-Dokumentation | Falco Docker Quickstart | Falco GitHub-Repository | falcosecurity/falco auf Docker Hub