Veröffentlicht am

Trivy, Falco und Kubescape im Vergleich

Teilen:
Authors

TL;DR

  • Trivy: Bester Allrounder fuer Image-, Filesystem- und IaC-Scanning. Einfach in CI/CD integrierbar, schnell, Open Source.
  • Falco: Runtime-Security-Monitoring auf Kernel-Ebene. Erkennt verdaechtiges Verhalten in laufenden Containern.
  • Kubescape: Compliance-Scanning gegen NSA/CISA, MITRE ATT&CK und CIS-Benchmarks. Ideal fuer Security-Posture-Management.
  • Alle drei Tools ergaenzen sich -- sie decken unterschiedliche Phasen ab (Build, Deploy, Runtime).

Warum drei Tools statt einem?

Container-Security hat verschiedene Angriffsvektoren, die kein einzelnes Tool vollstaendig abdeckt:

PhaseBedrohungTool
BuildVerwundbare Base-Images, Secrets in LayernTrivy
DeployFehlkonfigurationen, fehlende Security-ContextsKubescape
RuntimeShell-Zugriffe, Privilege Escalation, Crypto-MinerFalco

Ein Image kann beim Build sauber sein, aber zur Laufzeit kompromittiert werden. Umgekehrt nuetzt Runtime-Monitoring nichts, wenn bereits bekannte CVEs im Image stecken. Deshalb braucht ihr Coverage ueber alle Phasen.

Trivy: Image- und Vulnerability-Scanning

Trivy ist ein Open-Source-Scanner von Aqua Security, der mittlerweile weit ueber reines Image-Scanning hinausgeht: Filesystem, Git-Repos, Kubernetes-Manifeste und sogar Terraform-Code.

Installation und Basis-Scans

# Trivy installieren (Linux/macOS)
brew install trivy
# oder
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin

# Container-Image scannen
trivy image nginx:1.25
trivy image --severity HIGH,CRITICAL registry.example.com/myapp:v2.1

# Nur fixbare Vulnerabilities anzeigen
trivy image --ignore-unfixed --severity HIGH,CRITICAL nginx:1.25

# Filesystem scannen (z.B. im CI)
trivy fs --security-checks vuln,secret,misconfig ./

# Kubernetes-Manifest pruefen
trivy config ./k8s-manifests/

Trivy Operator im Cluster

Der Trivy Operator scannt automatisch alle laufenden Images und erstellt VulnerabilityReport-Ressourcen.

# Trivy Operator installieren
helm repo add aquasecurity https://aquasecurity.github.io/helm-charts/
helm repo update

helm install trivy-operator aquasecurity/trivy-operator \
  --namespace trivy-system \
  --create-namespace \
  --set trivy.severity=CRITICAL,HIGH,MEDIUM \
  --set trivy.ignoreUnfixed=true \
  --set operator.scanJobTimeout=10m
# Vulnerability Reports abfragen
kubectl get vulnerabilityreports -A

# Details fuer ein bestimmtes Image
kubectl get vulnerabilityreport -n production \
  -l trivy-operator.resource.name=my-app \
  -o jsonpath='{.items[0].report.summary}'

Trivy in der CI/CD-Pipeline (GitLab CI Beispiel)

# .gitlab-ci.yml (Auszug)
security-scan:
  stage: test
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 1 --severity CRITICAL ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}
    - trivy fs --exit-code 1 --severity HIGH,CRITICAL --security-checks secret .
  allow_failure: false

Der --exit-code 1 sorgt dafuer, dass die Pipeline bei kritischen Findings abbricht.

Falco: Runtime Security Monitoring

Falco ueberwacht Syscalls auf Kernel-Ebene und erkennt verdaechtiges Verhalten in Echtzeit -- z.B. Shell-Zugriffe in Containern, unerwartete Netzwerkverbindungen oder Dateizugriffe auf sensitive Pfade.

Installation

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

helm install falco falcosecurity/falco \
  --namespace falco-system \
  --create-namespace \
  --set falco.jsonOutput=true \
  --set falco.httpOutput.enabled=true \
  --set falcosidekick.enabled=true \
  --set falcosidekick.config.slack.webhookurl="https://hooks.slack.com/YOUR/WEBHOOK"

Falcosidekick leitet Events an verschiedene Ziele weiter (Slack, PagerDuty, Elasticsearch, Loki, etc.).

Eigene Falco-Rules schreiben

Die mitgelieferten Default-Rules sind ein guter Start, aber fuer Produktion solltet ihr sie anpassen. Hier einige praxisnahe Beispiele:

# custom-falco-rules.yaml
customRules:
  custom-rules.yaml: |-
    # Shell in Produktions-Container erkennen
    - rule: Shell in Production Container
      desc: Jemand hat eine Shell in einem Produktions-Container geoeffnet
      condition: >
        spawned_process
        and container
        and proc.name in (bash, sh, zsh, ash)
        and k8s.ns.name = "production"
      output: >
        Shell geoeffnet in Produktions-Container
        (user=%user.name pod=%k8s.pod.name ns=%k8s.ns.name cmd=%proc.cmdline)
      priority: CRITICAL
      tags: [container, shell, mitre_execution]

    # Sensitive Dateien lesen
    - rule: Read Sensitive Files
      desc: Zugriff auf sensitive Dateien wie /etc/shadow oder private Keys
      condition: >
        open_read
        and container
        and (fd.name startswith /etc/shadow
             or fd.name startswith /root/.ssh
             or fd.name contains id_rsa)
      output: >
        Sensitive Datei gelesen
        (user=%user.name file=%fd.name pod=%k8s.pod.name)
      priority: WARNING
      tags: [container, filesystem, mitre_credential_access]

    # Unerwartete ausgehende Verbindung
    - rule: Unexpected Outbound Connection
      desc: Container stellt Verbindung zu unbekannter externer IP her
      condition: >
        outbound
        and container
        and not fd.rip in (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
        and not k8s.ns.name in (kube-system, monitoring)
      output: >
        Unerwartete ausgehende Verbindung
        (pod=%k8s.pod.name ns=%k8s.ns.name remote=%fd.rip:%fd.rport)
      priority: WARNING
      tags: [container, network, mitre_command_and_control]

Rules als ConfigMap oder direkt ueber Helm-Values deployen:

helm upgrade falco falcosecurity/falco \
  --namespace falco-system \
  -f custom-falco-rules.yaml

Falco-Events abfragen

# Letzte Events aus den Falco-Logs
kubectl -n falco-system logs -l app.kubernetes.io/name=falco --tail=50

# Oder ueber Falcosidekick UI (falls aktiviert)
kubectl -n falco-system port-forward svc/falco-falcosidekick-ui 2802:2802

Kubescape: Compliance und Security Posture

Kubescape scannt euren Cluster und eure Manifeste gegen etablierte Frameworks:

  • NSA/CISA Kubernetes Hardening Guide
  • MITRE ATT&CK fuer Container
  • CIS Kubernetes Benchmark
  • SOC 2

Installation und erste Scans

# Kubescape installieren
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | bash

# Cluster gegen NSA/CISA Framework scannen
kubescape scan framework nsa

# CIS Benchmark
kubescape scan framework cis-v1.23-t1.0.1

# Einzelnes Manifest scannen
kubescape scan ./k8s-manifests/deployment.yaml

# Nur einen Namespace pruefen
kubescape scan framework nsa --include-namespaces production

# Ergebnis als JSON exportieren (fuer CI/CD)
kubescape scan framework nsa --format json --output results.json

Kubescape im Cluster (Operator)

# Kubescape Operator installieren
helm repo add kubescape https://kubescape.github.io/helm-charts/
helm repo update

helm install kubescape kubescape/kubescape-operator \
  --namespace kubescape \
  --create-namespace \
  --set clusterName=production-cluster

Der Operator scannt regelmaessig und speichert Ergebnisse als Custom Resources. Dashboards koennt ihr ueber die Kubescape Cloud oder eine eigene Grafana-Instanz aufbauen.

Kubescape in der CI/CD-Pipeline

# GitHub Actions Beispiel
- name: Kubescape Scan
  uses: kubescape/github-action@v3
  with:
    format: sarif
    outputFile: kubescape-results.sarif
    frameworks: nsa,mitre
    severityThreshold: high
    failedThreshold: 0

- name: Upload SARIF
  uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: kubescape-results.sarif

Vergleichstabelle: Trivy vs. Falco vs. Kubescape

KriteriumTrivyFalcoKubescape
Primaerer FokusVulnerability ScanningRuntime SecurityCompliance Scanning
Scanning-PhaseBuild/DeployRuntimeBuild/Deploy/Audit
Image-ScanningJa (Kern-Feature)NeinBegrenzt
Runtime-ErkennungNeinJa (Syscall-Level)Nein
Compliance-FrameworksBegrenztNeinNSA, CIS, MITRE, SOC2
IaC-ScanningJa (Terraform, K8s YAML)NeinJa (K8s YAML)
Secret DetectionJaNeinNein
CI/CD-IntegrationSehr einfachNicht relevantEinfach
Cluster-OperatorJa (Trivy Operator)Ja (DaemonSet)Ja (Kubescape Operator)
RessourcenbedarfGering (on-demand)Mittel (DaemonSet)Gering (on-demand)
LizenzApache 2.0Apache 2.0Apache 2.0

Integration in den Security-Workflow

So sieht ein typischer Security-Workflow mit allen drei Tools aus:

Developer Commit
       |
       v
  +---------+
  |  CI/CD  |
  +---------+
       |
  +----v----+     +----------+
  |  Trivy  |--*/}| Image    |  Bricht ab bei CRITICAL CVEs
  |  Scan   |     | Registry |
  +---------+     +----------+
       |
  +----v-------+
  | Kubescape  |  Prueft Manifest gegen NSA/CIS
  | Scan       |
  +------------+
       |
       v
  +---------+
  | Deploy  |
  +---------+
       |
       v
  +----------+
  |  Falco   |  Ueberwacht Runtime-Verhalten
  | (always) |
  +----------+
       |
       v
  +--------------+
  | Alertmanager |  Slack, PagerDuty, etc.
  +--------------+

Prometheus-Alerts fuer Security-Events

Sowohl Trivy Operator als auch Falco exponieren Prometheus-Metriken:

# security-prometheus-rules.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: security-scanning-alerts
  namespace: monitoring
  labels:
    release: monitoring
spec:
  groups:
    - name: security-scanning
      rules:
        - alert: CriticalVulnerabilityFound
          expr: trivy_image_vulnerabilities{severity="Critical"} > 0
          for: 10m
          labels:
            severity: critical
          annotations:
            summary: "Kritische Vulnerability in {{ $labels.image_repository }}:{{ $labels.image_tag }}"
            description: "{{ $value }} kritische CVEs gefunden. Sofortige Aktualisierung empfohlen."

        - alert: FalcoCriticalEvent
          expr: rate(falco_events{priority="Critical"}[5m]) > 0
          for: 1m
          labels:
            severity: critical
          annotations:
            summary: "Falco Critical Event: {{ $labels.rule }}"
            description: "Kritisches Security-Event in Namespace {{ $labels.k8s_ns_name }}"

        - alert: ComplianceDrift
          expr: kubescape_compliance_score < 70
          for: 1h
          labels:
            severity: warning
          annotations:
            summary: "Compliance-Score unter 70% fuer Framework {{ $labels.framework }}"

Haeufige Findings und wie man sie behebt

Top-5 Trivy-Findings

FindingSchwereLoesung
Veraltetes Base-ImageHIGH/CRITICALBase-Image aktualisieren, alpine/distroless nutzen
Secrets im Image-LayerCRITICALMulti-Stage-Build, Secrets via Env/Volumes
Verwundbare OS-PackagesMEDIUM-CRITICALapk upgrade / apt-get upgrade im Build
Veraltete App-DependenciesMEDIUM-HIGHnpm audit fix, pip install --upgrade
Misconfigured DockerfileMEDIUMUSER nonroot, keine COPY . . mit Secrets

Top-5 Kubescape-Findings

FindingFrameworkLoesung
Container laeuft als rootNSA, CISsecurityContext.runAsNonRoot: true
Kein Resource LimitNSAresources.limits setzen
Privilege Escalation erlaubtCISallowPrivilegeEscalation: false
Keine Network PolicyNSADefault-Deny NetworkPolicy anlegen
Host-PID/Network-ZugriffMITREhostPID: false, hostNetwork: false

Minimales Security-Context Template

# secure-pod-template.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secure-app
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    runAsGroup: 1000
    fsGroup: 1000
    seccompProfile:
      type: RuntimeDefault
  containers:
    - name: app
      image: registry.example.com/myapp:v1.0
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities:
          drop: ["ALL"]
      resources:
        requests:
          cpu: 100m
          memory: 128Mi
        limits:
          cpu: 500m
          memory: 256Mi

Dieses Template besteht die meisten Kubescape- und Trivy-Config-Checks automatisch.

Checkliste: Security Scanning einfuehren

  • Trivy in der CI/CD-Pipeline fuer Image-Scans (--exit-code 1 bei CRITICAL)
  • Trivy Operator im Cluster fuer laufende Workloads
  • Falco als DaemonSet im Cluster mit Falcosidekick fuer Alerting
  • Kubescape-Scan als Gate vor jedem Deployment
  • Prometheus-Alerts fuer Security-Events eingerichtet
  • Security-Context-Defaults in Helm-Charts/Templates
  • Regelmaessige Reviews der Falco-Rules (monatlich)
  • Vulnerability-SLA definiert: CRITICAL = 24h, HIGH = 7 Tage

Weitergehende Ressourcen


Security-Assessment fuer euren Cluster? Wir fuehren Security-Audits durch, richten Scanning-Toolchains ein und schulen eure Teams in Container-Security-Best-Practices. Kontakt aufnehmen fuer ein unverbindliches Erstgespraech.

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