Supprimé dans la dernière couche : récupérer un secret dans une image Docker
Le défi
Pinewood efface .env à la fin de son build. Une image n'oublie rien : fouille ~/image. Récupère la STRIPE_KEY de ce .env.
Ce que tu vas apprendre
- Expliquer comment une image Docker est construite à partir de couches empilées, dans l'ordre du manifest
- Reconnaître un fichier whiteout et ce qu'il cache
- Localiser un fichier supprimé dans une couche précédente et le lire
- Garder les secrets de build hors des couches d'image
Compétences testées
Prérequis
- Commandes shell de base (ls, cat, find)
- Savoir ce qu'est un Dockerfile
Comment ça marche
Chaque COPY, ADD et RUN d'un Dockerfile produit une nouvelle couche en lecture seule. L'image est la pile de toutes ces couches, et un conteneur voit la vue fusionnée.
Quand une étape ultérieure supprime un fichier, Docker ne peut pas réécrire la couche précédente. Il ajoute à la place une entrée whiteout, un fichier nommé .wh.<name>, qui indique à la vue fusionnée de masquer l'original. Les octets d'origine restent livrés dans la couche précédente.
docker save exporte chaque couche sous forme de tarball : quiconque peut récupérer une image publique peut donc lire tous les fichiers que n'importe quelle étape du build a écrits.
Erreurs fréquentes
- Utiliser un simple
ls..envest un dotfile, il n'apparaît qu'avecls -aoufind. - Lire le whiteout.
.wh..envest vide : c'est le marqueur de suppression, pas le fichier. - Prendre le premier .env trouvé. Deux couches en ont écrit un. Les ids de couches ne se trient pas dans l'ordre du build : c'est
manifest.jsonqui le donne, et l'écriture la plus récente est celle que la production a utilisée. - Prendre le fichier d'exemple.
.env.examplecontient une valeur facticesk_test_.
Comment s'en protéger
- Exclure
.envet les autres fichiers secrets du contexte de build dans.dockerignore. - Passer les secrets de build avec BuildKit :
RUN --mount=type=secret,id=env ...monte le secret pour une seule étape et ne l'écrit jamais dans une couche. - Utiliser des builds multi-stage pour que seuls les artefacts finaux atteignent l'image livrée.
- Injecter les secrets d'exécution en variables d'environnement ou depuis un gestionnaire de secrets, et faire une rotation de toute clé qui s'est trouvée dans une image poussée.