La technologie des conteneurs et le terme « images de conteneurs » ne sont pas nouveaux pour de nombreux développeurs, SRE et ingénieurs DevOps. Mais le besoin d’avoir des images de conteneur sécurisées pour le déploiement de production est quelque chose dont nous avons vraiment besoin de nos jours. Nous avons vu la récente attaque de la chaîne d’approvisionnement logicielle contre une application commerciale SolarWinds en insérant une porte dérobée.
Lorsque les clients téléchargent les packages d’installation du cheval de Troie à partir de l’application SolarWinds, les attaquants peuvent accéder aux systèmes sur lesquels les produits SolarWinds sont en cours d’exécution. Dans cet article, nous discuterons des images de conteneurs cosignées et sans distribution qui peuvent vous aider à déployer et à exécuter vos conteneurs d’applications de manière plus sécurisée en production.
Que sont les images de conteneur Distroless ?
Les images de conteneur sans distribution sont des « images Docker axées sur la langue, moins le système d’exploitation ». Cela signifie qu’il ne contient que votre application et ses dépendances d’exécution, pas les autres gestionnaires de packages de système d’exploitation habituels, les shells Linux ou tout autre programme auquel nous nous attendrions généralement dans une distribution Linux standard. Les images de base sans distribution ont moins de packages que leurs homologues. Cela réduit la surface d’attaque car il y a moins de composants qui peuvent être vulnérables et donc augmenter la sécurité.
Avantages des images de conteneurs sans distribution
- Améliore la sécurité des conteneurs.
- Réduit la taille du conteneur.
- Réduit la portée de la conformité.
- Améliore les performances de distribution des conteneurs.
- Rentable en utilisant moins de ressources.
Images de conteneurs sans distribution pour notre application avec vérification Cosign
Cosign est un outil développé par Google en collaboration avec le Linux Foundation Project appelé sigstore pour simplifier la signature et la vérification des images de conteneurs. Google a annoncé que les images distroless sont désormais signées par Cosign. Cela signifie donc que tous les utilisateurs de distroless peuvent vérifier qu’ils utilisent bien l’image de base qu’ils souhaitaient, avant de lancer la création d’images, ce qui rend les images distroless encore plus fiables.
Flux de travail général de Cosign
Pourquoi avons-nous besoin de cosigner avec les images de conteneur Distrol ?
Le besoin de Cosign est dû au fait que même avec les images sans distribution, il existe un risque de faire face à certaines menaces de sécurité telles que les attaques de typosquatting ou la réception d’une image malveillante. Si le processus de génération sans distribution est compromis, cela rend les utilisateurs vulnérables à l’utilisation accidentelle de l’image malveillante au lieu de l’image sans distribution réelle.
Le typosquatting est une sorte d’attaque d’ingénierie sociale dans laquelle les attaquants publient des packages malveillants dans un registre dans l’espoir d’inciter les utilisateurs à les installer avec des noms similaires de package ou de registre/domaine.
Comment créer les images du conteneur d’applications avec des images Cosign et Distroless ?
Vérifier l’image de base du conteneur Distroless avec la vérification Cosign
Vérification de l’image sans distribution gcr.io/distroless/static avec la clé publique Cosign partagée par l’éditeur Google. Cela devrait être la première étape du processus de construction de l’image.
$ cosign verify -key publisher-shared-cosign-pub.key gcr.io/distroless/static
Verification for gcr.io/distroless/static --The following checks were performed on each of these signatures: - The cosign claims were validated - The signatures were verified against the specified public key - Any certificates were verified against the Fulcio roots.{"critical":{"identity":{"docker- reference":"gcr.io/distroless/static"},"image":{"docker-manifest-digest":"sha256:c9320b754c2fa2cd2dea50993195f104a24f4c7ebe6e0297c6ddb40ce3679e7d"},"type":"cosign container image signature"},"optional":null}
Créez des images de conteneur d’applications avec des images de base sans distribution vérifiées par Cosign
Il existe plusieurs approches pour créer des images d’application en tant qu’images de conteneur sans distribution :
- Utilisez les outils de génération respectifs pour générer l’application à partir du code source. Après cela, en utilisant les directives Docker COPY ou ADD pour créer les images Docker avec les artefacts de build copiés ou ajoutés.
- Construction Docker en plusieurs étapes.
Je suis plusieurs scénarios ici, où je crée une image de conteneur Docker pour mon application Web Hello-World Go, que vous pouvez trouver ici avec une image statique sans distribution et des images de base standard.
-
Image d’application créée avec gcr.io/distroless/static comme image de base dans un processus de génération en plusieurs étapes.
FROM golang:1.15 as builder COPY . /usr/local WORKDIR /usr/local/ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags netgo -ldflags '-w -extldflags "-static"' -o cmd/app FROM gcr.io/distroless/static USER nonroot:nonroot COPY --from=builder --chown=nonroot:nonroot /usr/local/cmd/app /bin/app ENTRYPOINT ["/bin/app"]
-
Image d’application créée avec golang:1.15 dans un processus de génération en une seule étape :
FROM golang:1.15 as builder COPY . /usr/local WORKDIR /usr/local/ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /bin/app ENTRYPOINT ["/bin/app"]
-
App Image construite avec ubuntu:21.04 comme image de base dans un processus de construction en plusieurs étapes :
FROM golang:1.15 as builderstage COPY . /usr/local WORKDIR /usr/local/ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o cmd/app FROM ubuntu:21.04 COPY --from=builderstage /usr/local/cmd/app /bin/app ENTRYPOINT ["/bin/app"]
Vous pouvez trouver les détails des rapports d’analyse Docker dans la rubrique suivante qui identifie l’importance de l’utilisation des images de base sans distribution pour votre application.
Numérisation d’images de conteneur : images de conteneur sans distribution par rapport aux images de conteneur standard
J’ai utilisé l’outil d’analyse natif Docker appelé Synk, qui est désormais disponible dans les versions les plus récentes du package Docker. Vous pouvez utiliser cet utilitaire en utilisant la commande docker : « docker scan image_name ».
Rapport d’analyse d’image
Image de base statique sans distribution | Image de base standard en tant que Alpin | Image de base standard en tant qu’Ubuntu |
$ docker scan local-distroless:v1
Test local-distroless:v1… Organisation : jeswinjkn ✔ Testé 3 dépendances pour les problèmes connus, aucun chemin vulnérable trouvé. |
$ docker scan local-standard:v1
Test de la norme locale : v1… Organisation : jeswinjkn Testé 200 dépendances pour les problèmes connus, trouvé 169 problèmes. |
$ docker scan local-ubuntu:v1
Test de local-ubuntu:v1… Organisation : jeswinjkn Testé 103 dépendances pour les problèmes connus, trouvé 12 problèmes. |
Remarque : vous pouvez trouver le rapport complet sur l’analyse de Synk dans les références.
Signez l’image du conteneur d’applications Distroless créée à l’aide de Cosign
Générer une paire de clés Cosign
$ cosign generate-key-pair
Enter password for private key:
Enter again:
Private key written to cosign.key
Public key written to cosign.pub
Nous devons baliser l’image de conteneur construite localement avec les détails du registre et la transmettre au registre distant. Signez l’image du conteneur distant avec la clé privée générée.
$ cosign sign -key cosign.key jeswinkninan/distroless:v1
Enter password for private key:
Pushing signature to: index.docker.io/jeswinkninan/distroless:sha256-41fd2ec0997d91c5df7c7d58d0a2433a5744119d79a803123541cdd2b0e93f08.sig
Vérifiez l’image du conteneur d’applications avec la clé publique Cosign générée
$ cosign verify -key cosign.pub jeswinkninan/distroless:v1
Verification for jeswinkninan/distroless:v1 --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
- Any certificates were verified against the Fulcio roots.
{"critical":{"identity":{"docker-reference":"index.docker.io/jeswinkninan/distroless"},"image":{"docker-manifest- digest":"sha256:41fd2ec0997d91c5df7c7d58d0a2433a5744119d79a803123541cdd2b0e93f08"},"type":"cosign container image signature"},"optional":null}
Points clés
- Distroless sont des images Docker axées sur la langue, moins le système d’exploitation.
- Moins de paquets, moins de chance d’avoir des vulnérabilités. Les images sans distribution n’auront que les packages nécessaires.
- Les images sans distribution sont désormais cosignées.
- Vérifiez chaque image sans distribution avec la clé publique Cosign avant chaque build.
- L’analyse des images de conteneurs est indispensable dans votre système de construction CICD.
- Cosignez l’image de l’application interne construite à partir de l’image sans distribution de base et vérifiez avant de l’utiliser en production pour garantir la confiance de l’image.
Nous espérons que vous avez apprécié la lecture de cet article de blog !