Trivy (ausgesprochen /ˈtraɪvi/) ist ein umfassender Open-Source Sicherheitsscanner von Aqua Security. Auf GitHub hat er über 35.000 Stars und gehört damit zu den beliebtesten Open-Source Sicherheitstools überhaupt.

Der große Vorteil von Trivy ist seine Vielseitigkeit – er kann verschiedene Ziele scannen (Container-Images, Dateisysteme, Git-Repositories, VM-Images, Kubernetes-Cluster) und verschiedene Sicherheitsprobleme erkennen (bekannte CVEs, IaC-Fehlkonfigurationen, Leaks sensibler Daten, Software-Lizenzen, SBOM-Generierung). Für moderne DevSecOps-Teams deckt Trivy praktisch die gesamte Sicherheitskette ab – vom Code-Commit bis zur Produktivsetzung.

Dieser Artikel führt dich durch Installation, Kernfunktionen, praktische Anwendung und CI/CD-Integration. So kommst du schnell mit diesem mächtigen Tool zurecht.

Warum Trivy?

Vor Trivy war das Sicherheitsscanning oft fragmentiert: Du brauchtest verschiedene Tools für Container-Images, IaC-Checks und Secret-Leaks. Trivy vereint all das in einem einzigen CLI-Tool:

1. Multi-Target-Support

Trivy scannt:

  • Container-Images: Docker, OCI-kompatible Images (lokal oder remote)
  • Dateisysteme: Lokale Verzeichnisse, Projektquellcode
  • Git-Repositories: Remote-Repos (ohne Cloning)
  • VM-Images: AWS EC2 AMIs, Azure VMs etc.
  • Kubernetes-Cluster: Laufende Cluster-Ressourcen

2. Multi-Dimensionale Sicherheitserkennung

Trivy findet:

  • Bekannte Schwachstellen (CVEs): Basierend auf OS-Pakete und Software-Abhängigkeiten
  • IaC-Fehlkonfigurationen: Verstöße gegen Best Practices bei Terraform, CloudFormation, Kubernetes YAML etc.
  • Sensitive Daten: Hardcodierte API-Keys, Passwörter, Tokens
  • Lizenz-Compliance: Erkennung verwendeter Open-Source-Lizenzen
  • SBOM-Generierung: Software Bill of Materials

3. Einfache Integration

Trivy bietet:

4. Schnell und ressourcenschonend

Trivy ist in Go geschrieben – startet blitzschnell und braucht wenig RAM. Perfekt für häufige CI/CD-Runs.

Trivy installieren

Mehrere Installationsmethoden stehen zur Verfügung:

Option 1: Homebrew (macOS/Linux)

BASH
brew install trivy

Option 2: Docker

BASH
docker run aquasec/trivy --version

Option 3: Binary-Download

Von GitHub Releases:

BASH
# Linux x86_64
wget https://github.com/aquasecurity/trivy/releases/download/v0.50.0/trivy_0.50.0_Linux-64bit.tar.gz
tar -xzf trivy_0.50.0_Linux-64bit.tar.gz
sudo mv trivy /usr/local/bin/

Option 4: apt/yum (Linux-Distributionen)

BASH
# Ubuntu/Debian
sudo apt-get install wget gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy

# CentOS/RHEL
sudo yum install trivy

Installation prüfen

BASH
trivy --version
# Beispielausgabe: Version: 0.50.0

Schnellstart: Dein erstes Container-Image scannen

Ein einfaches Beispiel – wir scannen ein öffentliches Docker-Image:

Python-Official-Image scannen

BASH
trivy image python:3.9-slim

Trivy zeigt etwa Folgendes:

python:3.9-slim (debian 11.7)
=====================================
Total: 123 (UNKNOWN: 0, LOW: 45, MEDIUM: 52, HIGH: 24, CRITICAL: 2)

+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
|     LIBRARY      |   VULNERABILITY ID  | SEVERITY | INSTALLED VERSION | FIXED VERSION |               TITLE                   |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
| libssl1.1        | CVE-2023-5678       | CRITICAL | 1.1.1w-0+deb11u1  | 1.1.1w-0+deb11u2 | OpenSSL: X.509 Email Address ...     |
| openssl          | CVE-2023-6129       | HIGH     | 1.1.1w-0+deb11u1  | 1.1.1w-0+deb11u2 | OpenSSL: POLY1305 MAC implementation... |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+

Wichtige Informationen:

  • Gesamtzahl: Nach Schweregrad kategorisiert (UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL)
  • Details: Bibliothek, CVE-ID, Schweregrad, aktuelle Version, gefixte Version, Beschreibung

Nur HIGH und CRITICAL anzeigen

BASH
trivy image --severity HIGH,CRITICAL python:3.9-slim

JSON-Output (für Automatisierung)

BASH
trivy image --format json python:3.9-slim > results.json

Kernfunktionen im Detail

1. Dateisystem-Scanning

Trivy scannt lokale Verzeichnisse auf Schwachstellen in Abhängigkeiten – ideal für die frühe Erkennung in der Entwicklung.

BASH
# Aktuelles Verzeichnis
trivy fs .

# Bestimmtes Verzeichnis
trivy fs /path/to/project

# Nur bestimmte Sprache
trivy fs --scanners vuln --language python /path/to/project

Unterstützte Sprachen: Python, Node.js, Java, Go, Ruby, PHP, .NET, Rust und mehr.

2. Git-Repository-Scanning

Trivy scannt Remote-Repos direkt, ohne Cloning:

BASH
# Öffentliches GitHub-Repo
trivy repo https://github.com/aquasecurity/trivy

# Bestimmter Branch
trivy repo https://github.com/aquasecurity/trivy@main

Praktisch für Sicherheits-Audits von Third-Open-Source-Projekten.

3. Kubernetes-Konfiguration scannen

Fehlkonfigurationen in K8s sind eine Hauptursache für Sicherheitsvorfälle. Trivy prüft YAML-Dateien gegen Best Practices:

BASH
# Einzelne YAML-Datei
trivy config deployment.yaml

# Alle Dateien im Verzeichnis
trivy config ./k8s-manifests/

Erkannte Probleme:

  • Container läuft als root
  • Keine Ressourcenlimits (CPU/RAM)
  • Nutzung des latest-Tags
  • Privilegierter Modus aktiviert
  • Hardcodierte Secrets in Umgebungsvariablen

Beispielausgabe:

k8s-manifests/deployment.yaml
=============================
Tests: 15 (SUCCESSES: 12, FAILURES: 3, EXCEPTIONS: 0)
Failures: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 1, HIGH: 1, CRITICAL: 0)

+-----------+------------+-----------------+----------+---------------------------------------+
| TYPE      | MISCONF ID |    CHECK        | SEVERITY |              MESSAGE                  |
+-----------+------------+-----------------+----------+---------------------------------------+
| Kubernetes| KSV012     | Image Tag       | MEDIUM   | Container 'app' uses 'latest' tag     |
| Kubernetes| KSV001     | Privileged      | HIGH     | Container 'app' runs in privileged mode|
+-----------+------------+-----------------+----------+---------------------------------------+

4. SBOM generieren

SBOMs sind essenziell für Supply-Chain-Sicherheit. Trivy generiert Standardformate:

BASH
# SPDX-Format
trivy image --format spdx-json python:3.9-slim > sbom.spdx.json

# CycloneDX-Format
trivy image --format cyclonedx python:3.9-slim > sbom.cyclonedx.xml

Nützlich für Compliance-Audits und Impact-Analysen.

5. Sensitive Daten erkennen

Trivy findet hardcodierte Secrets im Code:

BASH
trivy fs --scanners secret ./my-project

Eingebaute Regeln für:

  • AWS Access Keys
  • GitHub Tokens
  • Slack Webhook URLs
  • Private Keys
  • Datenbank-Connection-Strings

CI/CD-Integration in der Praxis

Trivy in die Pipeline zu integrieren ist der Schlüssel zu "Shift Left Security".

GitHub Actions

.github/workflows/trivy.yml erstellen:

YAML
name: Trivy Security Scan

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  trivy-scan:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: 'python:3.9-slim'
          format: 'table'
          severity: 'CRITICAL,HIGH'
          exit-code: '1'  # CI fail bei HIGH/CRITICAL

Automatisches Scanning bei jedem Push/PR. Bei kritischen Schwachstellen schlägt die CI fehl.

GitLab CI

In .gitlab-ci.yml:

YAML
trivy-scan:
  image:
    name: aquasec/trivy:latest
    entrypoint: [""]
  script:
    - trivy fs --exit-code 1 --severity HIGH,CRITICAL .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

Jenkins Pipeline

GROOVY
pipeline {
    agent any

    stages {
        stage('Security Scan') {
            steps {
                sh '''
                    docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
                        aquasec/trivy image --exit-code 1 --severity HIGH,CRITICAL \
                        my-app:latest
                '''
            }
        }
    }
}

Fortgeschrittene Anwendung

1. Bestimmte CVEs ignorieren

Manche Schwachstellen sind in deinem Kontext nicht relevant. Erstelle .trivyignore:

# .trivyignore
CVE-2023-1234
CVE-2023-5678

Oder nutze --ignorefile:

BASH
trivy image --ignorefile .trivyignore python:3.9-slim

2. Datenbank cachen

Trivy lädt standardmäßig bei jedem Scan die DB neu (~100-200MB). Für schnellere CI-Runs:

BASH
# DB einmalig herunterladen
trivy image --download-db-only

# Spätere Scans nutzen Cache
trivy image --skip-db-update python:3.9-slim

In GitHub Actions mit actions/cache:

YAML
- name: Cache Trivy DB
  uses: actions/cache@v3
  with:
    path: ~/.cache/trivy
    key: trivy-db-${{ hashFiles('~/.cache/trivy/db/trivy.db') }}
    restore-keys: trivy-db-

3. Benutzerdefinierte Templates

Trivy unterstützt Go-Templates:

BASH
trivy image --format template --template "@contrib/html.tpl" python:3.9-slim > report.html

Eingebaute Templates:

  • @contrib/html.tpl: HTML-Report
  • @contrib/junit.tpl: JUnit XML (für CI/CD)
  • @contrib/sarif.tpl: SARIF (für GitHub Code Scanning)

4. Trivy Operator (Kubernetes)

Für laufende K8s-Cluster: Trivy Operator deployen:

BASH
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm install trivy-operator aqua/trivy-operator --namespace trivy-system --create-namespace

Der Operator scannt Workloads kontinuierlich und speichert Ergebnisse als Kubernetes CRDs. Dashboard oder API-Abfragen zeigen den aktuellen Sicherheitsstatus.

Troubleshooting

Problem 1: Langsame Scans

Ursache: Erster Scan lädt die Vuln-DB (~100-200MB).

Lösung: --skip-db-update nutzen oder DB vorab herunterladen:

BASH
trivy image --download-db-only
trivy image --skip-db-update python:3.9-slim

Problem 2: Zu viele False Positives

Ursache: Manche CVEs sind in deinem Kontext nicht relevant.

Lösung: .trivyignore nutzen oder --severity anpassen.

Problem 3: Private Images scheitern

Ursache: Keine Authentifizierung für private Registry.

Lösung: Umgebungsvariablen oder --registry-token:

BASH
export TRIVY_USERNAME=myuser
export TRIVY_PASSWORD=mypassword
trivy image registry.example.com/my-private-image:latest

Problem 4: Speicherprobleme

Ursache: Große Images/Dateisysteme brauchen viel RAM.

Lösung: Mehr RAM zuweisen oder --light Modus:

BASH
trivy image --light python:3.9-slim

Zusammenfassung

Trivy ist ein mächtiges und einfach zu nutzendes Open-Source Sicherheitstool:

  1. Umfassend: Multi-Target, Multi-Scanner – deckt die ganze Pipeline ab
  2. Benutzerfreundlich: Einfache CLI, gute Docs, aktive Community
  3. Integrationsfreundlich: Native Unterstützung für alle gängigen Plattformen
  4. Performant: Go-basiert, schnell, ressourcenschonend

Für jedes sicherheitsbewusste Entwicklungsteam ist Trivy eine kluge Wahl. Frühzeitige Erkennung und Behebung von Schwachstellen senken das Risiko in der Produktion erheblich.

Nächste Schritte:

  1. Trivy lokal installieren und ein paar Images scannen
  2. In CI/CD integrieren mit passenden Schwellenwerten
  3. Regelmäßige Reviews etablieren
  4. Trivy Operator für K8s-Monitoring evaluieren

Offizielle Dokumentation: https://trivy.dev
GitHub: https://github.com/aquasecurity/trivy


Weiterlesen: