{"id":4311,"date":"2021-04-22T14:00:00","date_gmt":"2021-04-22T12:00:00","guid":{"rendered":"https:\/\/www.unicoda.com\/?p=4311"},"modified":"2021-04-21T11:08:23","modified_gmt":"2021-04-21T09:08:23","slug":"chiffrement-dune-image-de-container","status":"publish","type":"post","link":"https:\/\/www.unicoda.com\/?p=4311","title":{"rendered":"Chiffrement d&rsquo;une image de container"},"content":{"rendered":"\n<p>Le chiffrement d&rsquo;une image de container est un sujet assez peu \u00e9voqu\u00e9. Les premiers exemples de solution n&rsquo;apparaissant qu&rsquo;\u00e0 partir de 2019, pouss\u00e9 en particulier par Brandon Lum de IBM.<\/p>\n\n\n\n<p>Le support de ces fonctionnalit\u00e9s ne semble pas tr\u00e8s r\u00e9pandu pour le moment. Du c\u00f4t\u00e9 des outils, nous parlons actuellement de <code>buildah<\/code> et <code>skopeo<\/code> pour la partie build, <code>containerd<\/code> et <code>cri-o<\/code> pour la partie runtime et enfin docker distribution pour la partie registry. A priori, il ne semble pas y avoir de support dans docker, mais un commentaire au d\u00e9tour d&rsquo;une issue GitHub semblait indiquer que cela sera le cas. Je n&rsquo;ai en revanche pas trouv\u00e9 d&rsquo;annonce ou de roadmap permettant de valider ce point.<\/p>\n\n\n\n<p>Voici \u00e0 la suite, les \u00e9tapes de mon test de chiffrement d&rsquo;une image de container, r\u00e9alis\u00e9 sous ArchLinux, mais transposable \u00e0 toute autre distribution, \u00e0 condition de pouvoir installer l&rsquo;ensemble de d\u00e9pendances.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00e9paration<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">Installation des D\u00e9pendances<\/h4>\n\n\n\n<p>Sous ArchLinux, installation des composants:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo pacman -S docker containerd buildah podman minikube kubectl helm\n$ sudo systemctl start docker\n$ sudo gpasswd -a &lt;user&gt; docker<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Registre d&rsquo;image local<\/h4>\n\n\n\n<p>D\u00e9marrage d&rsquo;un registre local pour y stocker l&rsquo;image chiffr\u00e9e que je vais g\u00e9n\u00e9rer.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo systemctl start docker  \n$ sudo systemctl status docker\n$ sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">G\u00e9n\u00e9ration du couple de cl\u00e9<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">$ openssl genrsa -out testKey.pem 2048\n$ openssl rsa -in testKey.pem -pubout -out testKey.pub.pem<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Cr\u00e9ation d&rsquo;une image basique<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">$ mkdir app\n$ cd app\n$ nano Dockerfile\n$ nano secret-file<\/pre>\n\n\n\n<p>Avec pour contenu du <code>Dockerfile<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">FROM nginx:latest<br>COPY secret-file \/secret-file<\/pre>\n\n\n\n<p>Et <code>secret-file<\/code>, un simple fichier texte contenant une cha\u00eene de caract\u00e8re al\u00e9atoire.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Construction de l&rsquo;image<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo buildah bud -t encrypted-test .<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Export<\/h4>\n\n\n\n<p>Export vers le registre local.<\/p>\n\n\n\n<pre id=\"block-77f67154-0e42-43df-a0b4-3b589bcafc33\" class=\"wp-block-preformatted\">$ sudo buildah push --tls-verify=false --encryption-key jwe:..\/testKey.pub.pem encrypted-test localhost:5000\/vvision\/encrypted-test:latest<\/pre>\n\n\n\n<p>Export local dans une archive oci.<\/p>\n\n\n\n<pre id=\"block-77f67154-0e42-43df-a0b4-3b589bcafc33\" class=\"wp-block-preformatted\">$ sudo buildah push --encryption-key jwe:..\/testKey.pub.pem  encrypted-test oci-archive:encrypted-test:latest<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Nettoyage<\/h4>\n\n\n\n<p>Suppression de toutes les images locales.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo buildah rmi --all<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">R\u00e9cup\u00e9ration de l&rsquo;image<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo buildah pull --tls-verify=false --decryption-key keys\/testKey.pem localhost:5000\/vvision\/encrypted-test<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Ex\u00e9cution<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo podman run -it localhost:5000\/vvision\/encrypted-test<\/pre>\n\n\n\n<pre id=\"block-36c47b42-9057-4c6c-999d-267d9dbf8aa6\" class=\"wp-block-preformatted\">\/bin\/bashroot@3e3c1ccde93c:\/# cat secret-file<br>ASecretSecret<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">V\u00e9rification<\/h4>\n\n\n\n<p>Tentative de r\u00e9cup\u00e9ration de l&rsquo;image depuis le registre local, sans pr\u00e9ciser la clef.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo buildah pull --tls-verify=false localhost:5000\/vvision\/encrypted-test Getting image source signatures\nCopying blob 302a0c0a162e [--------------------------------------] 0.0b \/ 914.0b\nCopying blob 83e2b8dcdf4b [--------------------------------------] 0.0b \/ 27.1MiB\nCopying blob 9b30e9f5d77e [--------------------------------------] 0.0b \/ 617.0b\nCopying blob 0f9f80250abf [--------------------------------------] 0.0b \/ 134.0b\nCopying blob 7c9b3bc4d85b [--------------------------------------] 0.0b \/ 26.3MiB\nCopying blob 538a8875d492 [--------------------------------------] 0.0b \/ 678.0b\nError decrypting layer sha256:83e2b8dcdf4bfca8bea0b23e771e84074e4cc308bf892bd6d63b3a0c9dab0564: missing private key needed for decryption<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Utilisation dans Kubernetes<\/h2>\n\n\n\n<p>D\u00e9marrage d&rsquo;un cluster Kubernetes avec <code>minikube<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ minikube start --network-plugin=cni --enable-default-cni --container-runtime=cri-o --bootstrapper=kubeadm --insecure-registry=\"&lt;local_ip_addr&gt;:5000\"\n$ minikube dashboard<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">M\u00e9canisme de synchronisation des clefs<\/h4>\n\n\n\n<p>Installation du composant responsable d\u00e9ploiement de la clef de d\u00e9chiffrement.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ git clone https:\/\/github.com\/IBM\/k8s-enc-image-operator.git\n$ cd k8s-enc-image-operator\n$ kubectl create namespace enc-key-sync\n$ helm install --namespace=enc-key-sync k8s-enc-image-operator .\/helm-operator\/helm-charts\/enckeysync\/<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Ajout de la cl\u00e9 dans Kubernetes Secret<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">$ kubectl create -n enc-key-sync secret generic --type=key --from-file=testKey.pem test-decryption-key<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">D\u00e9ploiement du container<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">$ kubectl run test-enc --image=localhost:5000\/vvision\/encrypted-test<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Au moment de mes premiers tests, je ne crois pas avoir rencontr\u00e9 de difficult\u00e9 \u00e0 r\u00e9cup\u00e9rer l&rsquo;image dans le registre local. N\u00e9anmoins, lors de tests plus r\u00e9cents, je n&rsquo;ai pas r\u00e9ussi \u00e0 reproduire ce fonctionnement sur d&rsquo;autres plateformes. En revanche, une r\u00e9cup\u00e9ration depuis le registre docker, ou celui propos\u00e9 dans la Google Cloud Plateform fonctionne.<\/p>\n\n\n\n<p>Il me reste maintenant \u00e0 reproduire ce m\u00e9canisme sur un cas r\u00e9el complet, c&rsquo;est-\u00e0-dire, de l&rsquo;int\u00e9gration au processus et aux outils de CI\/CD, \u00e0 la configuration du cluster Kubernetes cible, avec pour objectif un d\u00e9ploiement de la solution en production.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/developer.ibm.com\/articles\/encrypted-container-images-for-container-image-security-at-rest\/\" target=\"_blank\" rel=\"noreferrer noopener\">Encrypted container images for container image security at rest<\/a><\/li><li><a href=\"https:\/\/developer.ibm.com\/articles\/advancing-image-security-encrypted-container-images\/\" target=\"_blank\" rel=\"noreferrer noopener\">Advancing container image security with encrypted container images<\/a><\/li><li>DockerCon2019 &#8211; 05\/2019 &#8211; <a rel=\"noreferrer noopener\" href=\"https:\/\/www.youtube.com\/watch?v=9LyPUy4XYbs\" target=\"_blank\">Enabling High Assurance\/Sensitive Container Workloads with Encrypted Images<\/a> &#8211; <a rel=\"noreferrer noopener\" href=\"https:\/\/static.sched.com\/hosted_files\/kccncosschn19eng\/05\/Kubecon%20CN%202019_%20Encrypted%20Container%20Images%20%282%29.pdf\" target=\"_blank\">Support visuel<\/a><\/li><li>Open Source Summit &#8211; 07\/2019 &#8211; <a rel=\"noreferrer noopener\" href=\"https:\/\/www.youtube.com\/watch?v=jOsEdbPRrM0\" target=\"_blank\">Protecting Sensitive Code with Encrypted Container Images on Kubernetes<\/a> &#8211; Brandon Lum &amp; Harshal Patil, IBM<\/li><li>Cloud Native Computing Foundation &#8211; Webinar 07\/2020 &#8211; <a rel=\"noreferrer noopener\" href=\"https:\/\/www.youtube.com\/watch?v=dYXhAxxPkqA\" target=\"_blank\">Advancing image security and compliance through Container Image Encryption!<\/a><\/li><li>KubeCon2020 &#8211; 09\/2020 &#8211; <a rel=\"noreferrer noopener\" href=\"https:\/\/www.youtube.com\/watch?v=tRWMxuMEy9I\" target=\"_blank\">Where Are Your Images Running? Stop Worrying and Start Encrypting!<\/a> &#8211; Brandon Lum &amp; Harshal Patil &#8211; <a rel=\"noreferrer noopener\" href=\"https:\/\/static.sched.com\/hosted_files\/kccnceu20\/c4\/KubeCon_Virtual_2020_ECI.pdf\" target=\"_blank\">Support visuel<\/a><\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/medium.com\/@lumjjb\/encrypting-container-images-with-skopeo-f733afb1aed4\" target=\"_blank\">Encrypting container images with skopeo<\/a> &#8211; 01\/2020<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Le chiffrement d&rsquo;une image de container est un sujet assez peu \u00e9voqu\u00e9. Les premiers exemples de solution n&rsquo;apparaissant qu&rsquo;\u00e0 partir de 2019, pouss\u00e9 en particulier par Brandon Lum de IBM. Le support de ces fonctionnalit\u00e9s ne semble pas tr\u00e8s r\u00e9pandu pour le moment. Du c\u00f4t\u00e9 des outils, nous parlons actuellement de buildah et skopeo pour &hellip; <a href=\"https:\/\/www.unicoda.com\/?p=4311\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Chiffrement d&rsquo;une image de container&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[377],"tags":[562,380,581,181,582],"class_list":["post-4311","post","type-post","status-publish","format-standard","hentry","category-crypto","tag-buildah","tag-chiffrement","tag-container","tag-docker","tag-encryption"],"_links":{"self":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/4311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4311"}],"version-history":[{"count":19,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/4311\/revisions"}],"predecessor-version":[{"id":4552,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/4311\/revisions\/4552"}],"wp:attachment":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}