Comment utiliser « docker sbom » pour indexer les packages de votre image Docker
La sécurité de la chaîne d’approvisionnement logicielle est devenue d’actualité à la suite d’attaques très médiatisées basées sur la dépendance. La production d’un SBOM pour vos artefacts logiciels peut vous aider à identifier les faiblesses et à réduire le nombre de packages sur lesquels vous comptez.
Une nouvelle fonctionnalité Docker intègre la prise en charge de la génération SBOM dans le docker
CLI. Cela vous permet de produire un SBOM parallèlement à votre build, puis de le distribuer aux consommateurs de votre image.
Sommaire
La commande « docker sbom »
Le nouveau docker sbom
La commande est fournie avec les versions 4.7.0 et ultérieures de Docker Desktop. Vous pouvez ajouter la commande à une installation Docker Engine sous Linux en installant le docker-sbom
plugin de GitHub :
$ curl -sSfL https://raw.githubusercontent.com/docker/sbom-cli-plugin/main/install.sh | sh -s --
Vérifiez que l’installation a réussi en exécutant la commande :
$ docker sbom Usage: docker sbom [OPTIONS] COMMAND View the packaged-based Software Bill Of Materials (SBOM) for an image. ...
Vous pouvez maintenant générer le SBOM pour une image Docker en passant sa balise à la commande :
$ docker sbom nginx:latest Syft v0.43.0 ✔ Pulled image ✔ Loaded image ✔ Parsed image ✔ Cataloged packages [143 packages] NAME VERSION TYPE adduser 3.118 deb apt 2.2.4 deb base-files 11.1+deb11u3 deb base-passwd 3.5.51 deb bash 5.1-2+b3 deb bsdutils 1:2.36.1-8+deb11u1 deb ...
La CLI extraira l’image spécifiée si elle n’existe pas déjà sur votre système. Le contenu de l’image est alors indexé et une liste de packages s’affiche dans votre terminal.
Sous le capot, Docker utilise le populaire générateur Syft SBOM pour numériser et indexer l’image. La version active de Syft est affichée chaque fois que vous utilisez la commande. Sa sortie correspond à ce qu’une installation Syft autonome produirait.
Syft est capable d’identifier les packages du système d’exploitation et les dépendances du langage de programmation. Le type de chaque package détecté est affiché dans la sortie de la commande, à côté de son nom et de sa version précise. Vous pouvez utiliser ces informations pour auditer avec précision vos images de conteneurs et découvrir les logiciels sur lesquels elles reposent. Lorsqu’une vulnérabilité majeure est signalée, vous pouvez consulter le SBOM de l’image pour vérifier rapidement si vous êtes concerné.
Personnalisation de la sortie
La sortie est affichée par défaut sous forme de tableau lisible par l’homme. C’est idéal pour la distribution à côté de votre image ou dans le cadre de votre documentation.
Vous pouvez supprimer les lignes contenant la version de Syft et le rapport d’avancement en ajoutant le --quiet
drapeau. Utilisation --output
pour écrire le rapport dans un fichier, au lieu de votre fenêtre de terminal. La combinaison de ces deux options vous permet d’enregistrer facilement les données de la liste des packages.
$ docker sbom --output sbom.txt --quiet nginx:latest
Plusieurs formats de sortie alternatifs sont disponibles via le --format
drapeau. La text
variant est une autre option lisible par l’homme utilisant une mise en page basée sur les lignes :
$ docker sbom --format text --quiet nginx:latest [Image] Layer: 0 Digest: sha256:9c1b6dd6c1e6be9fdd2b1987783824670d3b0dd7ae8ad6f57dc3cea5739ac71e Size: 80400891 MediaType: application/vnd.docker.image.rootfs.diff.tar.gzip ... [adduser] Version: 3.118 Type: deb Found by: dpkgdb-cataloger [apt] Version: 2.2.4 Type: deb Found by: dpkgdb-cataloger
La [Image]
La section énumère les détails de toutes les couches de l’image numérisée. Les sections suivantes répertorient les packages détectés, en indiquant leur type et leur version sous forme de propriétés imbriquées.
Plusieurs autres formats sont également pris en charge, chacun pouvant être activé à l’aide de la --format
drapeau. Ce sont de meilleurs choix lorsque vous souhaitez consommer des données SBOM par programmation à l’aide d’outils tiers.
syft-json
– Générez un rapport au format JSON natif de Syft.cyclonedx-xml
/cyclonedx-json
– Produire un rapport compatible avec les normes CycloneDX au format XML ou JSON. Cette norme SBOM est dirigée par l’OWASP.github-0-json
– Un format de rapport compatible GitHub.spdx-tag-value
/spdx-json
– Compatible avec la norme SPDX pour l’expression des SBOM, qui est définie par la Linux Foundation.
Les analyses examinent généralement tout ce qui se trouve dans le système de fichiers de l’image. Parfois, vous souhaiterez peut-être exclure des répertoires spécifiques pour empêcher l’affichage de certains packages dans la sortie. Passez une expression glob au --exclude
flag pour filtrer des chemins particuliers. Vous pouvez l’utiliser pour indexer uniquement les packages associés à votre application, au lieu de ceux appartenant à la couche du système d’exploitation de l’image.
$ docker sbom --exclude /var nginx:latest
À l’occasion, vous devrez peut-être numériser une image conçue pour une architecture différente de votre plate-forme actuelle. Utilisez le --platform
drapeau pour sélectionner une variante multi-arch différente, telle que linux
ou arm64
:
$ docker sbom --platform arm64 nginx:latest
Cela vous permet d’indexer les images que vous avez créées pour d’autres plates-formes sans basculer entre les périphériques matériels physiques.
Cas d’utilisation
De plus en plus de développeurs commencent à reconnaître les avantages des SBOM. Ils mettent en évidence des listes de dépendances excessivement longues, offrant des opportunités d’élagage qui réduisent votre exposition aux menaces. Pour les consommateurs de logiciels, les SBOM sont un outil de plus en plus important pour évaluer le risque présenté par un nouveau projet. Ils deviendront probablement un livrable obligatoire pour les logiciels commandés par les grandes organisations et les agences gouvernementales.
Une fois que vous avez un SBOM, les données peuvent être utilisées avec des outils automatisés pour identifier davantage les problèmes de sécurité. Par exemple, vous pouvez passer la sortie de docker sbom
directement dans Grype pour identifier les CVE associés aux packages de votre image :
$ docker sbom --format syft-json nginx:latest | grype
La génération SBOM reposait auparavant sur l’adoption de nouveaux outils tels que Syft. Cela réduit la possibilité de découverte et fait du SBOM un supplément supplémentaire, plutôt que quelque chose d’intrinsèque à vos artefacts. En intégrant les SBOM dans la CLI Docker, davantage de développeurs pourront produire des rapports tout au long du cycle de vie du logiciel.
La mise en œuvre actuelle de docker sbom
est considéré comme expérimental et de portée limitée. À l’avenir, les données SBOM pourraient être capturées dans le cadre du processus de création d’image. docker sbom
afficherait alors ces informations, au lieu d’effectuer une analyse active à la demande.
Intégrer les SBOM dans docker build
en ferait un composant de premier ordre dans la chaîne d’outils du conteneur, garantissant que chaque image est accompagnée d’un SBOM tout au long de sa vie. Le stockage d’une image dans un registre inclurait le SBOM correspondant, même si l’hôte du registre était isolé et incapable d’effectuer des analyses actives. Cette fonctionnalité est encore loin cependant. La version d’aujourd’hui de docker sbom
reste un outil puissant qui facilite la production de SBOM d’images de conteneurs.
Sommaire
La docker sbom
La commande vous permet de générer le SBOM pour une image Docker sans installer d’outil autonome. La CLI Docker s’intègre à Syft pour fournir des analyses à la demande qui produisent un index des packages présents dans le système de fichiers de l’image.
Vous pouvez commencer à utiliser docker sbom
aujourd’hui en mettant à jour Docker Desktop v4.7.0 ou en installant le plug-in SBOM pour Docker Engine sous Linux. La génération d’un SBOM chaque fois que vous créez votre image vous aidera à identifier et à résoudre le problème de dépendance avant qu’il ne devienne un problème. Vous pouvez souvent réduire le nombre de packages dans votre image en passant à une image de base minimale telle que alpine
et supprimer les dépendances de langage de programmation inutilisées.