Selon le rapport Sysdig 2021 sur la sécurité et l'utilisation des conteneurs, la sécurité des conteneurs est une préoccupation croissante pour de nombreuses organisations. Cependant, il y a encore quelques lacunes. L'analyse des images de conteneurs et les conteneurs privilégiés sont deux des aspects les plus cruciaux.
Les conteneurs sans racine Podman (voir Exécution de Podman sans racine en tant qu'utilisateur non root et Conteneurs sans racine avec Podman :les bases) et OpenShift Container Platform implémentent tous deux le principe du moindre privilège par défaut, ce qui aide les administrateurs à appliquer les meilleures pratiques de sécurité. Les offres de registre de conteneurs Red Hat quay.io et Red Hat quay aident les administrateurs et les développeurs à intégrer l'analyse des vulnérabilités d'image dans leurs pipelines CI/CD.
[ Vous aimerez peut-être également lire : Amélioration de l'intégration systemd avec Podman 2.0 ]
Red Hat gère quay.io, un registre de conteneurs public hébergé. Les particuliers ou les entreprises peuvent utiliser le registre pour stocker et partager des images de conteneurs (au sein d'une organisation ou avec le grand public). Les images de base universelles Red Hat (UBI) sont basées sur RHEL et offrent un moyen de créer et de partager librement vos images d'application.
Le registre dispose d'un scanner de sécurité intégré qui vérifie les images pour détecter les vulnérabilités, fournit des détails sur les packages de l'image et identifie les vulnérabilités avec leurs correctifs associés. Il organise les vulnérabilités en catégories de gravité faible, moyenne et élevée. Il fournit également des métadonnées telles que le numéro CVE et un lien vers les errata liés aux vulnérabilités. Au fur et à mesure que les images de conteneur vieillissent, de nouvelles CVE sont découvertes, donc pour cet article, nous allons jeter un œil à une ancienne version d'UBI. Par exemple, au moment de la rédaction de cet article, l'une des versions spécifiques d'ubi8 (8.2-299) a la sortie suivante mettant en évidence 178 paquets (10 paquets à impact élevé) et 38 vulnérabilités (10 élevées).
L'interface utilisateur quay.io fournit les informations relatives aux vulnérabilités dans un format convivial. On peut parcourir la liste des packages, vérifier les packages impactés et afficher les détails de la vulnérabilité. Cependant, les organisations se concentrant sur DevSecOps, il est avantageux d'obtenir ces informations à la volée et de les utiliser avant chaque déploiement pour s'assurer que seules les images sécurisées parviennent à l'environnement de production.
Cet article suppose une certaine familiarité avec les concepts de quay.io tels que les référentiels, les comptes de robots et les tâches générales telles que les créations d'images (à l'aide de DockerFiles) et le balisage d'images. Si vous souhaitez en savoir plus sur ces concepts, vous pouvez vous référer aux guides de l'utilisateur quay.io.
Pour obtenir les informations d'analyse via la ligne de commande, utilisez le skopeo
et jq
commandes. Skopeo permet aux utilisateurs non seulement d'inspecter les images sans les télécharger d'abord sur une machine locale, mais il prend également en charge la copie d'images d'un référentiel (local ou distant) à un autre.
La commande suivante récupérera les métadonnées d'image similaires à docker inspect
commande exécutée sur une image locale :
# IMAGE_NAME='app-sre/ubi8-ubi'
# IMAGE_TAG='8.2-299'
# skopeo inspect docker://quay.io/$IMAGE_NAME:$IMAGE_TAG
Pour obtenir le résumé unique de l'image, nous pouvons analyser la sortie json reçue en utilisant le jq
commande.
# IMAGE_DIGEST=`skopeo inspect docker://quay.io/$IMAGE_NAME:$IMAGE_TAG | jq -r .Digest`
Avec le résumé, vous pouvez obtenir le rapport de sécurité de l'image en interrogeant les API quay.io. Nous pouvons stocker la sortie (fichier json) dans un fichier local et utiliser jq
pour filtrer le contenu souhaité.
# curl -o `basename $IMAGE_NAME`.json https://quay.io/api/v1/repository/$IMAGE_NAME/manifest/$IMAGE_DIGEST/security?vulnerabilities=true
Par exemple, pour obtenir les informations relatives aux vulnérabilités de gravité élevée avec l'ID de conseil associé, l'URL de conseil, le nom du package, sa version affectée et la version qui contient les correctifs, la commande suivante peut être utilisée :
jq '.data.Layer.Features[]' `basename $IMAGE_NAME`.json | jq -c '{"Name":.Name,"Version":.Version,"Advisory":.Vulnerabilities[]} | select(.Advisory.Severity=="High") | {"Advisory":.Advisory.Name,"Link":.Advisory.Link,"PACKAGE":.Name,"CURRENT VERSION":.Version,"FIXED IN VERSION":.Advisory.FixedBy }'
La commande produit un résultat semblable à celui-ci, indiquant que cette image UBI (app-sre/ubi8-ubi) comporte 10 notifications d'avertissement :
{"Advisory":"RHSA-2020:3014","Link":"https://access.redhat.com/errata/RHSA-2020:3014","PACKAGE":"dbus-tools","CURRENT VERSION":"1:1.12.8-9.el8","FIXED IN VERSION":"1:1.12.8-10.el8_2"}
{"Advisory":"RHSA-2020:3658","Link":"https://access.redhat.com/errata/RHSA-2020:3658","PACKAGE":"librepo","CURRENT VERSION":"1.11.0-2.el8","FIXED IN VERSION":"0:1.11.0-3.el8_2"}
{"Advisory":"RHSA-2020:3014","Link":"https://access.redhat.com/errata/RHSA-2020:3014","PACKAGE":"dbus-libs","CURRENT VERSION":"1:1.12.8-9.el8","FIXED IN VERSION":"1:1.12.8-10.el8_2"}
{"Advisory":"RHSA-2020:3014","Link":"https://access.redhat.com/errata/RHSA-2020:3014","PACKAGE":"dbus-common","CURRENT VERSION":"1:1.12.8-9.el8","FIXED IN VERSION":"1:1.12.8-10.el8_2"}
{"Advisory":"RHSA-2020:3014","Link":"https://access.redhat.com/errata/RHSA-2020:3014","PACKAGE":"dbus-daemon","CURRENT VERSION":"1:1.12.8-9.el8","FIXED IN VERSION":"1:1.12.8-10.el8_2"}
{"Advisory":"RHSA-2020:2755","Link":"https://access.redhat.com/errata/RHSA-2020:2755","PACKAGE":"libnghttp2","CURRENT VERSION":"1.33.0-1.el8_0.1","FIXED IN VERSION":"0:1.33.0-3.el8_2.1"}
{"Advisory":"RHSA-2020:5476","Link":"https://access.redhat.com/errata/RHSA-2020:5476","PACKAGE":"openssl-libs","CURRENT VERSION":"1:1.1.1c-15.el8","FIXED IN VERSION":"1:1.1.1g-12.el8_3"}
{"Advisory":"RHSA-2020:3658","Link":"https://access.redhat.com/errata/RHSA-2020:3658","PACKAGE":"python3-librepo","CURRENT VERSION":"1.11.0-2.el8","FIXED IN VERSION":"0:1.11.0-3.el8_2"}
{"Advisory":"RHSA-2020:2637","Link":"https://access.redhat.com/errata/RHSA-2020:2637","PACKAGE":"gnutls","CURRENT VERSION":"3.6.8-10.el8_2","FIXED IN VERSION":"0:3.6.8-11.el8_2"}
{"Advisory":"RHSA-2020:3014","Link":"https://access.redhat.com/errata/RHSA-2020:3014","PACKAGE":"dbus","CURRENT VERSION":"1:1.12.8-9.el8","FIXED IN VERSION":"1:1.12.8-10.el8_2"}
[ Cours gratuit :Présentation technique de Red Hat Satellite. ]
Récapitulez
Dans la partie suivante de cette série d'articles, j'intègre les informations de cet article dans un exemple de pipeline pour prendre des décisions éclairées sur l'opportunité de poursuivre avec cette image et de déployer des applications en production.