Article original : How to Secure Your Container Deployments with Chainguard
Vous n'avez pas besoin de me convaincre que les conteneurs sont absolument la meilleure chose issue de la révolution de la virtualisation. J'utilise des conteneurs d'une forme ou d'une autre presque tous les jours.
Mais la beauté du modèle "template-it-once-and-deploy-it-everywhere" a un coût : que se passe-t-il si une seule couche de ce modèle contient une vulnérabilité de sécurité ? Et s'il y avait une vulnérabilité cachée là-bas, comment le sauriez-vous ?
Dans cet article, je vais vous montrer comment utiliser Chainguard (et Docker Scout) pour gérer la sécurité de toutes vos images.
Vous pouvez regarder la version vidéo de cet article ici :
Lorsque vous construisez votre infrastructure logicielle sur un serveur physique de manière traditionnelle, vous acquérez et installez manuellement chaque élément de la pile, un par un. Il est probable que vous allez récupérer la dernière version de tout directement depuis la source officielle. Et vous allez au moins réfléchir à chaque couche.
Mais la plupart des conteneurs modernes sont construits à partir de modèles compliqués. Il est facile de simplement copier et coller le code et de le lancer. Il est très possible que vous ne soyez même pas conscient de tout le logiciel qui alimente votre application. Et même si vous l'êtes, il vous faudrait facilement des heures de recherche sur chaque élément pour comprendre où vous en êtes.
C'est le problème que Chainguard existe pour résoudre. Chainguard fournit des centaines de versions personnalisées bien maintenues de nombreuses images de conteneurs les plus populaires.
Bien sûr, vous êtes libre de tirer, par exemple, l'image officielle MariaDB dans votre Dockerfile, mais opter pour la version Chainguard sera un choix bien plus sûr. C'est parce que Chainguard analyse constamment les couches de leurs images pour détecter les vulnérabilités et construit des images qui sont aussi à jour et sécurisées que possible.
Découvrons comment tout cela fonctionne dans le monde réel. Avant de commencer à construire de nouvelles images, je devrais vous expliquer comment nous allons visualiser les vulnérabilités de chaque image afin de quantifier l'avantage de Chainguard.
Tout d'abord, je devrais expliquer que les vulnérabilités de l'infrastructure sont généralement définies en utilisant le système Common Vulnerabilities and Exposures – ou CVE basé sur la National Vulnerability Database maintenue par le NIST du gouvernement américain. Il existe des centaines de milliers de définitions CVE qui ont été identifiées et catégorisées par le système CVE, chacune étant notée par gravité. L'existence de cette base de données – ainsi qu'un certain nombre d'outils connexes importants – nous permet d'automatiser nos évaluations de sécurité.
Docker Scout est l'un de ces outils. Cette page vous donne des instructions d'installation pour utiliser Scout sur Docker Engine, mais il devrait fonctionner directement si vous utilisez Docker Desktop. La commande curl téléchargera simplement le script Bash install-scout qui fera tout fonctionner.
curl -fsSL https://raw.githubusercontent.com/docker/scout-cli/main install.sh -o install-scout.sh
Comment choisir la bonne image
J'ai créé un Dockerfile qui tirera l'image officielle MariaDB depuis Docker Hub :
FROM mariadb:latest
ENV MYSQL_ROOT_PASSWORD=my_root_password
ENV MYSQL_DATABASE=my_database
ENV MYSQL_USER=my_user
ENV MYSQL_PASSWORD=my_user_password
Nous allons prétendre que l'image sera utilisée pour un déploiement multi-niveaux, donc nous allons créer une base de données racine et un mot de passe, ainsi qu'un nouveau compte utilisateur avec son propre mot de passe. Il pourrait y avoir une instance de niveau application qui utilisera ces identifiants pour accéder à la base de données à un moment donné.
Dans tous les cas, je vais construire l'image de la manière habituelle, en lui donnant le nom mariadb_standard.
docker build -t mariadb_standard .
Il y a un autre Dockerfile qui est exactement le même que le premier, sauf que nous tirons l'image spéciale Chainguard de MariaDB.
FROM chainguard/mariadb
ENV MYSQL_ROOT_PASSWORD=my_root_password
ENV MYSQL_DATABASE=my_database
ENV MYSQL_USER=my_user
ENV MYSQL_PASSWORD=my_user_password
Cette image provient de Docker Hub, mais nous aurions tout aussi facilement pu la tirer depuis le dépôt de Chainguard :
docker pull cgr.dev/chainguard/mariadb:latest
Construisez cette image de la même manière que vous l'avez fait pour l'image officielle. Lorsque vous scannez les deux images, voici ce que vous verrez :
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb_cg latest 50a484d1ded3 7 days ago 556MB
mariadb_standard latest 67949ccf8eb5 6 weeks ago 405MB
L'image Chainguard est, comme vous pouvez le voir, assez grande. Mais notez qu'elle est en fait beaucoup plus récente.
Comment scanner votre image
Maintenant, il est temps de mettre docker scout au travail. Voici comment cela va fonctionner. Je vais pointer Scout vers l'image mariadb_standard en premier :
$ docker scout qv mariadb_standard
qv, soit dit en passant, est l'abréviation de quickview.
Voici à quoi devrait ressembler la sortie :
sortie docker scout
L'image standard est composée de trois couches, commençant par Ubuntu 23.10, puis Ubuntu 22.04 long term support release, et enfin MariaDB par-dessus. Ubuntu a 10 vulnérabilités de faible gravité et 9 de gravité moyenne. De manière alarmante, la couche MariaDB a 2 problèmes critiques et 28 problèmes de haute gravité.
Cela devrait suffire à tenir un administrateur éveillé la nuit. Et trier tout cela pour déterminer lesquels sont des show stoppers et lesquels ne sont pas si graves pour votre environnement vous prendra beaucoup de temps.
Maintenant, je vais exécuter Scout contre l'image Chainguard :

Tout d'abord, nous pouvons voir qu'il n'y a qu'une seule couche ici. Je soupçonne que c'est une façon pour Chainguard de maintenir le contrôle sur leurs images. Ces deux vulnérabilités critiques sont toujours présentes, mais il n'y a que 5 vulnérabilités de haute gravité et aucune de gravité moyenne ou faible.
Si vous le souhaitez, vous pourriez approfondir pour afficher toutes les vulnérabilités individuelles. Voici la commande pour le faire avec un extrait de la sortie :
$ docker scout cves local://mariadb_cg
2717 CRITICAL GHSA-xfg6-62px-cxc2 [OWASP Top Ten 2017 Category A9 - Using Components with Known Vulnerabilities]
https://scout.docker.com/v/GHSA-xfg6-62px-cxc2
Affected range : <42.2.8
Fixed version : 42.7.2, 42.6.1, 42.5.5, 42.4.4, 42.3.9, 42.2.8
CVSS Score : 10.0
CVSS Vector : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
2717 CRITICAL CVE-2024-1597 [Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')]
https://scout.docker.com/v/CVE-2024-1597
Affected range : <42.2.28
Fixed version : 42.2.28
CVSS Score : 10.0
CVSS Vector : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Nous pouvons rechercher chacune de celles-ci en utilisant les outils et bases de données CVE standard pour mieux les comprendre. Mais ce sera beaucoup plus facile que de rechercher les 28 vulnérabilités de haute gravité dans l'image standard MariaDB.
Conclusion
Donc, si vous êtes préoccupé par la sécurité des images de conteneurs – et vous feriez mieux de l'être – alors Docker Scout est un excellent outil pour maintenir la visibilité dans vos piles. Et les images plus propres de Chainguard peuvent vous donner une avance significative.
Il y a plus de bonnes choses en matière de TI sous forme de livres, de cours et de vidéos disponibles sur mon site Bootstrap IT.