Retour aux articles
3 min de lecture

Scanne tes images Docker pour les CVEs, ça prend 10 secondes

Trivy trouve les vulnérabilités dans tes containers. Presque personne le lance en CI/CD.

DockerSecurityCI/CDDevEx

Tes images Docker ont des vulnérabilités. Des critiques. Tu les ship en prod tous les jours.

Trivy scanne les images pour les CVEs en moins de 10 secondes. L’ajouter au CI/CD prend 5 lignes de YAML. J’ai reviewed des centaines de pipelines et presque aucun scanne les vulnérabilités!

Installer et lancer

curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh
trivy image python:3.4-alpine

Le premier scan télécharge la base de données de vulnérabilités. Ça prend quelques secondes. Tous les scans suivants tournent instantanément!

L’output montre les IDs des CVEs, la sévérité, les packages affectés, et les versions qui fixent:

python:3.4-alpine (alpine 3.4.6)
==================================
Total: 37 (UNKNOWN: 1, LOW: 15, MEDIUM: 11, HIGH: 9, CRITICAL: 1)

┌──────────────┬────────────────┬──────────┬───────────────────┬───────────────┬────────────────────────────────────────────┐
│   Library    │ Vulnerability  │ Severity │ Installed Version │ Fixed Version │                   Title                    │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────┤
│ curl         │ CVE-2018-14618 │ CRITICAL │ 7.61.0-r0         │ 7.61.1-r0     │ curl: NTLM password overflow via integer   │
│              │                │          │                   │               │ overflow                                   │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────┤
│ libcurl      │ CVE-2018-14618 │ CRITICAL │ 7.61.0-r0         │ 7.61.1-r0     │ curl: NTLM password overflow via integer   │
│              │                │          │                   │               │ overflow                                   │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────┤
│ openssl      │ CVE-2021-23840 │ HIGH     │ 1.0.2p-r0         │ 1.0.2u-r0     │ openssl: integer overflow in CipherUpdate  │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────┤
│ zlib         │ CVE-2018-25032 │ HIGH     │ 1.2.11-r0         │ 1.2.12-r0     │ zlib: A flaw found in zlib when compressing│
└──────────────┴────────────────┴──────────┴───────────────────┴───────────────┴────────────────────────────────────────────┘

Tu sais exactement ce qui est cassé et quelle version le fixe! Le tableau montre la librairie, l’ID du CVE, le niveau de sévérité, la version actuelle, et la version qui corrige la vulnérabilité.

Fail la CI sur les CVEs critiques

# GitHub Actions
- name: Scan image
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: 'myapp:latest'
    severity: 'CRITICAL,HIGH'
    exit-code: '1'
# GitLab CI
trivy_scan:
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 1 --severity CRITICAL,HIGH myapp:latest

Le pipeline fail si des vulnérabilités critiques ou high existent. Ça te force à les fixer avant de déployer!

Ignorer les vulnérabilités non fixées

Certaines CVEs n’ont pas encore de fix disponible. Trivy peut les ignorer:

trivy image --ignore-unfixed myapp:latest

Montre seulement les vulnérabilités que tu peux vraiment fixer!

Le scan est rapide

Les petites images se scannent en moins de 5 secondes. Les grosses images avec des dépendances Java prennent 10-30 secondes.

Le premier scan télécharge la base de données (50MB). Les scans suivants utilisent le cache!

Si les scans timeout sur des images énormes, augmente la limite:

trivy image --timeout 15m huge-java-app:latest

Ou réduis le parallélisme pour économiser de l’espace disque:

trivy image --parallel 1 myapp:latest

Pourquoi personne le fait

J’ai vu des équipes déployer des images avec 47 CVEs critiques. Ils savaient pas. Personne checkait.

Ajouter Trivy au CI/CD prend 5 minutes. Le lancer ajoute 10 secondes au temps de build. La barrière est pas technique!

C’est organisationnel. La sécurité, ça ressemble au problème de quelqu’un d’autre jusqu’à ce que tu te fasses breacher. À ce moment-là c’est trop tard.

Ça catch de vrais problèmes

Le mois dernier j’ai scanné une image Python qu’on utilisait depuis 6 mois. Trouvé 15 vulnérabilités critiques dans les packages de l’OS de base. Update vers une image de base plus récente, rescan, down à 2 CVEs non fixées!

Ça a pris 20 minutes total. On shippait ces vulnérabilités en prod tous les jours.

Formats d’output

JSON pour parser dans des scripts:

trivy image --format json -o results.json myapp:latest

SARIF pour l’onglet sécurité GitHub:

- uses: aquasecurity/trivy-action@master
  with:
    image-ref: 'myapp:latest'
    format: 'sarif'
    output: 'trivy-results.sarif'

- uses: github/codeql-action/upload-sarif@v2
  with:
    sarif_file: 'trivy-results.sarif'

Les résultats s’affichent dans le dashboard sécurité de GitHub!

Au-delà des containers

Trivy scanne plus que des images:

# Filesystem
trivy fs /path/to/project

# Repo Git
trivy repo https://github.com/user/project

# Cluster Kubernetes
trivy k8s --report summary

# Infrastructure as code
trivy config ./terraform

Même outil, cibles différentes. Un seul scanner pour tout!

Commence maintenant

Ajoute ça à tes GitHub Actions:

name: Scan

on: [push]

jobs:
  trivy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Build image
        run: docker build -t myapp:${{ github.sha }} .

      - name: Scan
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: myapp:${{ github.sha }}
          severity: CRITICAL,HIGH
          exit-code: 1

Ou GitLab CI:

stages:
  - build
  - scan

build:
  stage: build
  script:
    - docker build -t myapp:latest .

scan:
  stage: scan
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 1 --severity CRITICAL,HIGH myapp:latest

Cinq lignes de config. Dix secondes par scan. Pas d’excuses!

Bref

Les vulnérabilités existent dans toutes les images. Trivy les trouve avant qu’elles atteignent la prod!

L’outil est gratuit, rapide, et trivial à intégrer. La seule raison de pas l’utiliser c’est que t’as pas encore priorisé la sécurité.

Ajoute Trivy à ton pipeline et félicitations, t’es plus un DevOps engineer. T’es maintenant un DevSecOps engineer. Va update ton LinkedIn!

Fixe ça aujourd’hui!

La réalité est souvent plus nuancée. Moi, la nuance ça m'ennuie. Je préfère la clarté.

Commentaires