Il est très important de vérifier régulièrement les vulnérabilités de votre pipeline. L’une des étapes à exécuter consiste à effectuer une analyse de vulnérabilité de vos images Docker. Dans ce blog, vous apprendrez comment effectuer l’analyse des vulnérabilités, comment corriger les vulnérabilités et comment l’ajouter à votre pipeline Jenkins. Apprécier!
1. Introduction
Dans un précédent blog d’il y a quelques années, il a été décrit comment vous pouvez analyser vos images Docker à la recherche de vulnérabilités. Un blog de suivi a montré comment ajouter l’analyse à un pipeline Jenkins. Cependant, Anchore Engine, qui était utilisé dans les blogs précédents, n’est plus pris en charge. Une solution alternative est disponible avec le grype qui est également fourni par Anchore. Dans ce blog, vous examinerez de plus près grype, comment cela fonctionne, comment vous pouvez résoudre les problèmes et comment vous pouvez l’ajouter à votre pipeline Jenkins.
Mais avant tout, pourquoi vérifier les vulnérabilités ? Vous devez rester à jour avec les derniers correctifs de sécurité de nos jours. De nombreuses vulnérabilités de sécurité sont accessibles au public et peuvent donc être exploitées assez facilement. Il est donc indispensable de corriger au plus vite les failles de sécurité afin de minimiser votre surface d’attaque. Mais comment suivre cela? Vous vous concentrez principalement sur l’entreprise et vous ne souhaitez pas travailler à plein temps pour corriger les failles de sécurité. C’est pourquoi il est important de scanner automatiquement votre application et vos images Docker. Grype peut vous aider à numériser vos images Docker. Grype vérifiera les vulnérabilités du système d’exploitation, mais également les packages spécifiques au langage, tels que les fichiers jar Java, pour détecter les vulnérabilités et les signalera. De cette façon, vous disposez d’un excellent outil qui automatisera les contrôles de sécurité pour vous. Notez que grype ne se limite pas à la numérisation d’images Docker. Il peut également analyser des fichiers et des répertoires et peut donc être utilisé pour analyser vos sources.
Dans ce blog, vous allez créer une image Docker vulnérable contenant une application Spring Boot. Vous installerez et utiliserez grype afin de scanner l’image et de corriger les vulnérabilités. À la fin, vous apprendrez comment ajouter l’analyse à votre pipeline Jenkins.
Les sources utilisées dans ce blog se trouvent sur GitHub.
2. Prérequis
Les prérequis nécessaires pour ce blog sont :
- Connaissance de base de Linux ;
- Connaissance de base de Docker ;
- Connaissance de base de Java et Spring Boot.
3. Application vulnérable
Accédez à Spring Initializr et choisissez une version Maven, Java 17, Spring Boot 2.7.6 et la dépendance Spring Web. Ce ne sera pas une application très vulnérable car Spring garantit déjà que vous utilisez la dernière version de Spring Boot. Par conséquent, changez la version de Spring Boot en 2.7.0. L’application Spring Boot peut être construite avec la commande suivante, qui créera le fichier jar pour vous :
Vous allez scanner une image Docker, donc un Dockerfile doit être créé. Vous utiliserez un Dockerfile très basique qui contient juste les instructions minimales nécessaires pour créer l’image. Si vous souhaitez créer des images Docker prêtes pour la production, lisez les publications Docker Best Practices et Spring Boot Docker Best Practices.
FROM eclipse-temurin:17.0.1_12-jre-alpine
WORKDIR /opt/app
ARG JAR_FILE
COPY target/${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
Au moment de la rédaction, la dernière éclipse-témurine l’image de base pour Java 17 est la version 17.0.5_8. Encore une fois, utilisez-en un plus ancien afin de le rendre vulnérable.
Pour construire l’image Docker, un fork du dockerfile-maven-plugin
de Spotify sera utilisé. L’extrait suivant est donc ajouté au pom
dossier.
<plugin>
<groupId>com.xenoamess.docker</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.25</version>
<configuration>
<repository>mydeveloperplanet/mygrypeplanet</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
L’avantage d’utiliser ce plugin est que vous pouvez facilement réutiliser la configuration. La création de l’image Docker peut être effectuée par une seule commande Maven.
La création de l’image Docker peut être effectuée en appelant la commande suivante :
Vous êtes maintenant prêt à commencer avec grype.
4. Mise en place
L’installation de grype peut se faire en exécutant le script suivant :
$ curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
Vérifiez l’installation en exécutant la commande suivante :
$ grype version
Application: grype
Version: 0.54.0
Syft Version: v0.63.0
BuildDate: 2022-12-13T15:02:51Z
GitCommit: 93499eec7e3ce2704755e9f51457181b06b519c5
GitDescription: v0.54.0
Platform: linux/amd64
GoVersion: go1.18.8
Compiler: gc
Supported DB Schema: 5
5. Numériser l’image
La numérisation de l’image Docker se fait en appelant grype
suivie par docker:
indiquant que vous souhaitez numériser une image depuis le démon Docker, l’image et la balise :
$ grype docker:mydeveloperplanet/mygrypeplanet:0.0.1-SNAPSHOT
Application: grype
Version: 0.54.0
Syft Version: v0.63.0
Vulnerability DB [updated]
Loaded image
Parsed image
Cataloged packages [50 packages]
Scanned image [42 vulnerabilities]
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
busybox 1.34.1-r3 1.34.1-r5 apk CVE-2022-28391 High
jackson-databind 2.13.3 java-archive CVE-2022-42003 High
jackson-databind 2.13.3 java-archive CVE-2022-42004 High
jackson-databind 2.13.3 2.13.4 java-archive GHSA-rgv9-q543-rqg4 High
jackson-databind 2.13.3 2.13.4.1 java-archive GHSA-jjjh-jjxp-wpff High
java 17.0.1+12 binary CVE-2022-21248 Low
java 17.0.1+12 binary CVE-2022-21277 Medium
java 17.0.1+12 binary CVE-2022-21282 Medium
java 17.0.1+12 binary CVE-2022-21283 Medium
java 17.0.1+12 binary CVE-2022-21291 Medium
java 17.0.1+12 binary CVE-2022-21293 Medium
java 17.0.1+12 binary CVE-2022-21294 Medium
java 17.0.1+12 binary CVE-2022-21296 Medium
java 17.0.1+12 binary CVE-2022-21299 Medium
java 17.0.1+12 binary CVE-2022-21305 Medium
java 17.0.1+12 binary CVE-2022-21340 Medium
java 17.0.1+12 binary CVE-2022-21341 Medium
java 17.0.1+12 binary CVE-2022-21360 Medium
java 17.0.1+12 binary CVE-2022-21365 Medium
java 17.0.1+12 binary CVE-2022-21366 Medium
libcrypto1.1 1.1.1l-r7 apk CVE-2021-4160 Medium
libcrypto1.1 1.1.1l-r7 1.1.1n-r0 apk CVE-2022-0778 High
libcrypto1.1 1.1.1l-r7 1.1.1q-r0 apk CVE-2022-2097 Medium
libretls 3.3.4-r2 3.3.4-r3 apk CVE-2022-0778 High
libssl1.1 1.1.1l-r7 apk CVE-2021-4160 Medium
libssl1.1 1.1.1l-r7 1.1.1n-r0 apk CVE-2022-0778 High
libssl1.1 1.1.1l-r7 1.1.1q-r0 apk CVE-2022-2097 Medium
snakeyaml 1.30 java-archive GHSA-mjmj-j48q-9wg2 High
snakeyaml 1.30 1.31 java-archive GHSA-3mc7-4q67-w48m High
snakeyaml 1.30 1.31 java-archive GHSA-98wm-3w3q-mw94 Medium
snakeyaml 1.30 1.31 java-archive GHSA-c4r9-r8fh-9vj2 Medium
snakeyaml 1.30 1.31 java-archive GHSA-hhhw-99gj-p3c3 Medium
snakeyaml 1.30 1.32 java-archive GHSA-9w3m-gqgf-c4p9 Medium
snakeyaml 1.30 1.32 java-archive GHSA-w37g-rhq8-7m4j Medium
spring-core 5.3.20 java-archive CVE-2016-1000027 Critical
ssl_client 1.34.1-r3 1.34.1-r5 apk CVE-2022-28391 High
zlib 1.2.11-r3 1.2.12-r0 apk CVE-2018-25032 High
zlib 1.2.11-r3 1.2.12-r2 apk CVE-2022-37434 Critical
Que vous dit cette sortie ?
- NOM: Le nom du paquet vulnérable ;
- INSTALLÉE: quelle version est installée ;
- FIXE: Dans quelle version la vulnérabilité est corrigée ;
- TAPER: Le type de la dépendance, par exemple binaire pour le JDK, etc ;
- VULNÉRABILITÉ; L’identifiant de la vulnérabilité. Avec cet identifiant, vous pouvez obtenir plus d’informations sur la vulnérabilité dans la base de données CVE ;
- GRAVITÉ: Parle de lui-même et peut être négligeable, faible, moyen, élevé, critique.
En examinant de plus près la sortie, vous remarquerez que toutes les vulnérabilités n’ont pas de correctif confirmé. Alors que faire dans ce cas ? Grype fournit une option pour afficher uniquement les vulnérabilités avec un correctif confirmé. Ajout de la --only-fixed
le drapeau fera l’affaire.
$ grype docker:mydeveloperplanet/mygrypeplanet:0.0.1-SNAPSHOT --only-fixed
Vulnerability DB [no update available]
Loaded image
Parsed image
Cataloged packages [50 packages]
Scanned image [42 vulnerabilities]
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
busybox 1.34.1-r3 1.34.1-r5 apk CVE-2022-28391 High
jackson-databind 2.13.3 2.13.4 java-archive GHSA-rgv9-q543-rqg4 High
jackson-databind 2.13.3 2.13.4.1 ...