Les concepteurs de Wolfi OS, porté par la société
Chainguard ↗ se sont fixé comme objectif de produire des
images de conteneurs qui répondent aux exigences de sécurité. Par exemple les
images officielles ne doivent contenir aucune vulnérabilité critique connue.
Les spécifications de Wolfi OS
Parmi les spécifications, on retrouve que les outils de construction d’image
doivent fournir une SBOM de qualité. Cette distribution fourni le support des
librairies Glibc et de Musl. Le support de Musl se fait en s’appuyant sur la
distribution Alpine. Du coup, le format des packages retenu est de celui de
cette distribution : l’APK. Attention le gestionnaire de package n’est pas
installé par défaut pour limiter la taille des images.
Il existe plusieurs façons d’installer des packages supplémentaires dans les
images :
via un Dockerfile.
via des outils maison melange et apko.
Construction des images avec un Dockerfile
Je vais utiliser un simple api flask et construire l’image comme je le ferai avec
donc une alpine. base d’une alpine.
Le code contenant dans le fichier main.py
Le Dockerfile avec une image alpine :
On build et on vérifie la taille de l’image :
Je teste et cela fonctionne !
On va construire une image à base de Wolfi et vérifier la taille obtenue. J’ai
dû adapter le Dockerfile car certains packages ne sont pas disponibles :
On lance le build, on teste et on vérifie la taille :
La taille de l’image est un peu plus importante. La raison est assez simple
wolfi utilise glibc contrairement à Alpine les librairies sont un peu plus
grosses.
On utilise apko et melange
La première chose est de construire le package, car on ne peut utiliser de
commande dans le fichier apko.yml
Avant de lancer le build du package, il faut générer une clé pour signer le package :
On se retrouve avec deux fichiers. On peut lancer le build :
On voit apparaître un dossier packages dans lequel on retrouve notre package
portant le nom défini dans le yaml de melange accompagné de l’index du dépot :
Maintenant passons à la construction de l’image avec apko. Le fichier de définition :
On lance le build :
On obtient un fichier .tar et de fichiers SBOM. Chargeons les images :
Vérifions la taille de l’image :
Mince la taille est plus importante que les deux autres ?
Changeons la source en prenant une alpine :
Si je lance le build sans modifier le package en le passant aussi à Alpine,
j’obtiens cette erreur :
Il faut donc générer un package basé sur Apline, modifions en conséquence le fichier yaml :
On relance le build du package, puis de l’image :
La taille est redevenu plus petite mais pas au point de faire la meme taille que
celle produite par buildkit.
Par contre avec docker image inspect on voit que l’image produite avec apko ne
contient qu’un seul layer.
Alors que celle produite avec Docker en contient cinq :
Et les vulnérabilités ?
Je vais utiliser trivy pour scanner les images :
Sur celle construite avec Wolfi :
Conclusion
Pour ce qui est de l’objectif d’obtenir une image de petite taille, je n’y
arrive pas vraiment. Je manque certainement de connaissances pour ce qu’il
faille mettre comme paramètre dans chacun des fichiers de configuration.
Pour ce qui est des vulnérabilités mon test n’est pas suffisant pour tirer des
conclusions. Je vais tester d’autres images fourni par Chainguard. Vous les
trouverez ici ↗.
Après en avoir testé quelques-unes aucune vulnérabilité remontée par trivy.
Par contre, je trouve la documentation pas assez claire. Heureusement, il suffit
de se promener dans les repos pour trouver des exemples.
Je vais continuer de tester apko et melange pour construire des images. Je vais
aussi regarder la partie signature des images et comment intégré la SBOM dans ma
chaine de compliance.