Sécurité des images Docker : Détection de CVE

La conteneurisation des applications est devenue une pratique très prisée dans le développement de projets web. Elle facilite la gestion des dépendances et le processus de déploiement. Les pipelines d’intégration continue et de déploiement continue (CI/CD) permettent de construire des images Docker, de les tester et de les pousser vers des registres. Cependant, cette flexibilité pose des défis de sécurité et il est essentiel de s’assurer que les images sur lesquelles reposent les applications ne contiennent pas de vulnérabilités avant de les pousser sur un registre.
Dans cet article, nous allons utiliser Snyk pour scanner une image Docker afin d’identifier d’éventuelles vulnérabilités, puis nous verrons comment Dependabot peut nous aider à maintenir nos images à jour et à corriger automatiquement les vulnérabilités détectées.

Scan de sécurité d’une image avec Snyk

Les Common Vulnerabilities and Exposures (CVE) identifient les failles de sécurité qui doivent être corrigées pour protéger une application. Pour les images Docker, plusieurs outils permettent de scanner et d’identifier ces vulnérabilités : Snyk, Clair, Trivy… De plus, les principaux fournisseurs de cloud proposent des fonctionnalités de scan automatisé intégrées dans leur registre. AWS par exemple via son service ECR permet d’activer un scan automatique basé sur Clair pour anaylser les images.
Dans cet exemple, nous allons créer une image Docker utilisant une ancienne version de Nginx puis nous lancerons un scan de sécurité pour identifier les CVE. Pour cela, créons un Dockerfile basique qui utilise la version 1.25-alpine de Nginx (celle-ci présente des vulnérabilités de moyenne à haute sévérité).


FROM nginx:1.25-alpine

Nous allons maintenant configurer un pipeline GitHub Actions pour analyser la sécurité de notre image Docker en utilisant Snyk. Ce pipeline doit être créé dans le dossier .github/workflows et peut être déclenché manuellement. Il est aussi nécessaire d’avoir un compte sur Snyk pour obtenir un jeton d’authentification (SNYK_TOKEN).


name: Docker images security scan
on:
  workflow_dispatch
jobs:
  zap_scan:
    runs-on: ubuntu-latest
    name: Scan Docker image

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

      - name: Build Docker image
        run: |
          docker build -t my-app -f ./Dockerfile .

      - name: Run Snyk to check my-app Docker image for vulnerabilities
        uses: snyk/actions/docker@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
        with:
          image: my-app
          args: --severity-threshold=medium

Ce pipeline permet globalement de construire l’image Docker my-app et s’appuie sur Snyk pour analyser l’image construite afin de relever les vulnérabilités de gravité moyenne ou supérieure. Après l’exécution, Snyk nous génère un log détaillant toutes les vulnérabilités détectées en précisant l’identifiant CVE, la catégorie de vulnérabilité CWE et le score de gravité CVSS.

Snyk docker scan result

Comme nous pouvons le constater, notre application présente des failles de sécurité critiques. Il est donc nécessaire de corriger ces vulnérabilités rapidement.

Correction automatique avec Dependabot

Pour mettre à jour et corriger les failles de sécurité de notre image, nous allons utiliser Dependabot, un outil Github qui propose des correctifs pour les dépendances obsolètes, y compris celles des images Docker. Dependabot doit d’abord être activé via le graphe de dépendance dans l’onglet Insights du repository GitHub.
Une fois activé, nous créons un fichier de configuration dans le dossier .github pour surveiller notre Dockerfile afin de le mettre à jour lorsque de nouvelles versions sont disponibles :


version: 2
updates:
  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "daily"
    commit-message:
      prefix: "chore"
    open-pull-requests-limit: 5
    target-branch: "develop"
    ignore:
      - dependency-name: "*"
        update-types: [ "version-update:semver-patch" ]

Pour obtenir plus d’informations sur la configuration de Dependabot, veuillez consulter la documentation officielle.
Comme nous pouvons le voir, Dependabot ouvre une Pull Request suggérant de remplacer nginx:1.25-alpine par une version plus récente (i.e nginx:1.27-alpine).
Nous pouvons alors accepter cette PR ou chercher par nous même d’autres versions adéquates sur le Docker Hub.

Dependabot bump Dockerfile

Une fois cette mise à jour intégrée, il ne reste plus qu’à lancer un nouveau scan pour s’assurer que toutes les vulnérabilités ont été corrigées.

Snyk final result

En combinant Snyk pour la détection des vulnérabilités dans nos images Docker et Dependabot pour maintenir automatiquement nos images à jour, nous pouvons améliorer grandement la sécurité de nos applications conteneurisées. Ces outils s’intègrent facilement dans les pipelines CI/CD, ce qui permet d’anticiper et de corriger d’éventuelles problèmes de sécurité avant la mise en production.

Retour en haut