Dans l'écosystème DevOps moderne, Docker est devenu le roi incontesté de la conteneurisation. Sa simplicité et sa puissance nous permettent de packager et de déployer des applications avec une agilité sans précédent. Mais cette facilité cache une complexité : que se passe-t-il à l'intérieur de ces images que nous tirons si nonchalamment depuis le Docker Hub ?
Chaque image Docker est construite sur des couches, chacune pouvant contenir des paquets, des librairies et des dépendances. Et chacune de ces dépendances est une porte d'entrée potentielle pour des vulnérabilités de sécurité.
Ignorer la sécurité de nos images, c'est comme construire une forteresse sur des sables mouvants. Heureusement, des outils puissants et simples existent pour nous aider à "scanner" nos fondations. Aujourd'hui, nous allons nous pencher sur Grype, un scanner de vulnérabilités open-source qui va devenir votre meilleur allié pour sécuriser votre supply chain logicielle.
Pourquoi la Sécurité des Images Docker est-elle Cruciale ?
Avant de plonger dans l'outil, comprenons le problème. Quand vous écrivez un Dockerfile
qui commence par FROM ubuntu:20.04
, vous héritez de l'ensemble des paquets et des librairies de cette version d'Ubuntu. Si une faille critique (comme Log4Shell ou Heartbleed) est découverte dans l'un de ces composants, votre application devient immédiatement vulnérable, même si votre propre code est parfait.
Cette approche, où la sécurité est intégrée dès le début du cycle de développement, est le cœur du mouvement DevSecOps. Le but est de "Shift Left" : déplacer les contrôles de sécurité le plus tôt possible dans le processus, bien avant la mise en production. Scanner vos images Docker est l'une des pratiques les plus efficaces de cette philosophie.
C'est Quoi, Grype ? 🛡️
Grype est un projet open-source développé par la société Anchore. C'est un scanner de vulnérabilités pour les images de conteneurs et les systèmes de fichiers.
Ses principaux atouts sont :
- Simplicité d'installation et d'utilisation : Pas de serveur à gérer ou de configuration complexe.
- Rapidité : Il effectue des scans très rapidement, ce qui est idéal pour une intégration dans des pipelines CI/CD.
- Base de données complète : Il croise les paquets détectés avec de multiples bases de données de vulnérabilités (NVD, etc.) pour offrir une vision exhaustive.
- Formats de sortie multiples : Il peut générer des rapports en mode texte, JSON, ou même au format CycloneDX, un standard pour les nomenclatures logicielles (SBOM).
Mise en Pratique : Scanner une Image avec Grype
Assez de théorie, passons à la pratique !
Étape 1 : Installation de Grype
L'installation est un jeu d'enfant.
Sur macOS (avec Homebrew) :
brew install grype
Sur Linux (avec un script) :
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
Étape 2 : Lancer un Scan de Base
Prenons une image volontairement un peu ancienne pour voir ce que Grype peut trouver. L'image python:3.8-slim-buster
est un bon candidat.
Lancez simplement la commande suivante :
grype python:3.8-slim-buster
Grype va d'abord télécharger sa base de données de vulnérabilités, puis analyser l'image couche par couche. En quelques secondes, vous obtiendrez un rapport directement dans votre terminal.
Exemple de sortie (tronquée) :
✔ Vulnerability DB [updated]
✔ Scanned image [sha256:f1a9a4b...
✔ Scanned 130 packages
NAME INSTALLED FIXED-IN VULNERABILITY SEVERITY
------------------------------------------------------------------------------------
apt 1.8.2.3 CVE-2020-27350 Negligible
bsdutils 1:2.33.1-0.1 1:2.33.1-0.1+deb10u1 CVE-2021-37600 Medium
gnupg2 2.2.12-1+deb10u2 CVE-2022-34903 Critical
libapt-pkg5.0 1.8.2.3 CVE-2020-27350 Negligible
libgnutls30 3.6.7-4+deb10u9 3.6.7-4+deb10u10 CVE-2023-29491 High
...
Étape 3 : Analyser les Résultats
Le tableau de résultats est très clair :
- NAME : Le nom du paquet vulnérable.
- INSTALLED : La version actuellement installée dans l'image.
- FIXED-IN : La version du paquet qui corrige la vulnérabilité. C'est l'information la plus importante pour la remédiation !
- VULNERABILITY : L'identifiant de la faille (souvent une CVE).
- SEVERITY : Le niveau de criticité (Negligible, Low, Medium, High, Critical).
Dans l'exemple ci-dessus, on voit immédiatement une vulnérabilité Critique dans gnupg2
et une High dans libgnutls30
. On voit aussi que pour libgnutls30
, un correctif est disponible dans la version 3.6.7-4+deb10u10
.
Aller Plus Loin : Intégration et Automatisation ⚙️
La vraie puissance de Grype se révèle quand on l'intègre dans des processus automatisés.
Filtrer les résultats
Pour vous concentrer sur l'essentiel, vous pouvez demander à Grype de n'afficher que les vulnérabilités d'un certain niveau ou supérieur.
# N'afficher que les vulnérabilités 'High' et 'Critical'
grype python:3.8-slim-buster --fail-on high
Cette commande aura aussi pour effet de retourner un code de sortie non-nul si des vulnérabilités de ce niveau sont trouvées, ce qui est parfait pour faire échouer un build dans un pipeline.
Intégration dans un pipeline CI/CD
Voici un exemple conceptuel de ce à quoi ressemblerait une étape de scan dans un pipeline CI/CD (comme GitHub Actions ou GitLab CI).
# Exemple pour GitHub Actions
jobs:
build-and-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Build Docker image
run: docker build -t mon-app:latest .
- name: Install Grype
run: curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
- name: Scan Docker image
run: |
grype mon-app:latest --fail-on high
Avec cette configuration, si Grype trouve une seule vulnérabilité de niveau High
ou Critical
, le pipeline échouera. L'image ne sera jamais poussée vers le registre, empêchant la faille d'atteindre la production.
Stratégies de Remédiation : Que Faire Après le Scan ?
Trouver les failles, c'est bien. Les corriger, c'est mieux.
- Mettre à jour l'image de base : La première chose à faire est de voir si une version plus récente de votre image de base existe. Passer de
ubuntu:20.04
àubuntu:22.04
ou depython:3.8-slim-buster
àpython:3.10-slim-bullseye
peut résoudre des dizaines de failles d'un coup. - Utiliser des images minimalistes : Envisagez d'utiliser des images comme Alpine, Distroless, ou des images
slim
. Moins il y a de paquets, moins la surface d'attaque est grande. - Accepter le risque : Pour les vulnérabilités dont le champ
FIXED-IN
est vide, il n'existe pas de correctif simple. Vous devez alors évaluer le risque : la faille est-elle exploitable dans votre contexte ? Si non, vous pouvez documenter votre décision d'accepter ce risque.
Mettre à jour les paquets : Si vous ne pouvez pas changer l'image de base, ajoutez une étape de mise à jour dans votre Dockerfile
. C'est une bonne pratique dans tous les cas.
FROM ubuntu:20.04
RUN apt-get update && apt-get upgrade -y
# ... reste du Dockerfile
Conclusion 🚀
La sécurité n'est pas une option, et l'adoption de Docker ne doit pas se faire à ses dépens. Des outils comme Grype rendent la détection de vulnérabilités si simple et rapide qu'il n'y a plus d'excuse pour ne pas le faire.
En l'intégrant à vos habitudes et, surtout, à vos pipelines CI/CD, vous adoptez une posture de sécurité proactive. Vous ne vous contentez pas de réagir aux problèmes, vous les empêchez d'arriver en production. C'est ça, la maîtrise de la sécurité Docker.
Alors, n'attendez plus : installez Grype et lancez votre premier scan dès aujourd'hui !