<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
    <title>La Forge - docker</title>
    <subtitle>Le blog de la Forge</subtitle>
    <link rel="self" type="application/atom+xml" href="https://staging.lafor.ge/tags/docker/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://staging.lafor.ge"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2021-03-24T00:00:00+00:00</updated>
    <id>https://staging.lafor.ge/tags/docker/atom.xml</id>
    <entry xml:lang="fr">
        <title>Stocker et vérifier ses images de container</title>
        <published>2021-03-24T00:00:00+00:00</published>
        <updated>2021-03-24T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://staging.lafor.ge/harbor/"/>
        <id>https://staging.lafor.ge/harbor/</id>
        
        <content type="html" xml:base="https://staging.lafor.ge/harbor/">&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://raw.githubusercontent.com/goharbor/website/master/docs/img/readme/harbor_logo.png&quot; alt=&quot;&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;Bonjour à toutes et tous&lt;/p&gt;
&lt;p&gt;Aujourd’hui je vais ouvrir une boîte Pandore 🧐&lt;/p&gt;
&lt;p&gt;Depuis quelques mois, je me suis plongé profondément dans l’écosystème du cloud native,
Docker, images, containers et Kubernetes.&lt;/p&gt;
&lt;p&gt;Jusqu’à maintenant je ne m’étais pas réellement préoccupé de la sécurité de ce que je faisais.&lt;/p&gt;
&lt;p&gt;Mes images étaient basées sur les images officielles que l’on pouvait trouver sur docker hub et je les considérais comme sécurisées.&lt;/p&gt;
&lt;p&gt;Ce que je n’avais pas compris ou fait semblant de ne pas comprendre, c’est que les images sont une
représentation  figée de l’état d’un système de fichier. Et donc par conséquent les failles de sécurité
ne sont pas corrigées, il faut sans cesse vérifier si de nouvelles images sont crées et encore on est
complètement dépendant du bon vouloir des éditeurs d’images pour les sécuriser.&lt;/p&gt;
&lt;p&gt;Dans cet article, je vais vous proposer deux manières de vérifier le niveau de sécurité de vos images
Docker. La première méthode se fera sur le site Gilab.com et la deuxième via un projet
open-source qui peut s’auto-héberger poussé par VMware.&lt;/p&gt;
&lt;p&gt;Pour chacune des deux manières je vais vous montrer comment les mettre en place, pour bénéficier d’une automatisation
vérification des images qui seront poussés sur le registry Docker.&lt;/p&gt;
&lt;p&gt;C’est parti ! :D&lt;/p&gt;
&lt;h2 id=&quot;methode-gitlab-com&quot;&gt;Méthode Gitlab.com&lt;/h2&gt;
&lt;p&gt;Gitlab propose &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://docs.gitlab.com/ee/user/application_security/container_scanning/&quot;&gt;un outil&lt;/a&gt; de vérification de containers
et d’images directement intégré au sytème de CI.&lt;/p&gt;
&lt;p&gt;Pour cela, il vous faut un compte sur &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://gitlab.com&quot;&gt;gitlab.com&lt;/a&gt;, celui ci est gratuit et vous permet de bénéficier
de fonctionnalités avancées qui ne sont disponibles normalement que dans les paliers payants d’abonnements.&lt;/p&gt;
&lt;p&gt;Dans ces fonctionnalités nous avons par exemple, la visualisation des failles de sécurité dans l’interface de
contrôle des merge-requests.&lt;/p&gt;
&lt;p&gt;Je considère que vous savez créer un projet sur Gitlab, dans le cas contraire la &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://docs.gitlab.com/13.8/ee/gitlab-basics/create-project.html&quot;&gt;documentation&lt;/a&gt; est extrêmement fournie.&lt;/p&gt;
&lt;p&gt;Dans ce projet à la racine vous aller créer 2 fichiers&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;FROM&lt;/span&gt;&lt;span&gt; ubuntu:20.04&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce sera celui qui sera utilisé pour construire l’image que l’on désire tester.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;.gitlab-ci.yml&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ariables&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  D&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;OCKER_DRIVER&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; o&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;verlay2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;uild&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;est&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;uild&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;mage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ocker:stable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;uild&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ervices&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ocker:19.03.12-dind&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ariables&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    I&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;MAGE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;cript&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ocker info&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ocker login -u &amp;quot;$CI_REGISTRY_USER&amp;quot; -p &amp;quot;$CI_REGISTRY_PASSWORD&amp;quot; $CI_REGISTRY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ocker build -t $IMAGE .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ocker push $IMAGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;nclude&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l z-l-hl z-d-hl&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;emplate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; C&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ontainer-Scanning.gitlab-ci.yml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce pipeline est composé de deux étapes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une étape de build et de push de l’image dans le registry Docker de Gitlab&lt;/li&gt;
&lt;li&gt;une étape de réalisation des opérations de vérifications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L’étape de vérification est entièrement contenue dans la ligne surlignée.&lt;/p&gt;
&lt;p&gt;Elle inclue tout la logique du système de contrôle de sécurité.&lt;/p&gt;
&lt;p&gt;Aujourd’hui celui-ci est basé sur un projet nommé &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://www.redhat.com/fr/topics/containers/what-is-clair&quot;&gt;Clair&lt;/a&gt;. Mais
dans l’avenir si le système change, votre pipeline n’aura pas besoin d’être modifié.&lt;/p&gt;
&lt;p&gt;Pour tester le système, créez une branche peut importe le nom, je vais appeler la mienne &lt;code&gt;dev&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Créez ensuite une merge-request de &lt;code&gt;dev&lt;/code&gt; sur &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Allez sur la branche &lt;code&gt;dev&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Modifiez le Dockerfile&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;FROM&lt;/span&gt;&lt;span&gt; ubuntu&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis committez les changements.&lt;/p&gt;
&lt;p&gt;Après un petit moment vous devriez voir apparaître dans votre merge-request, une nouvelle ligne qui
vous indique le nombre de failles.&lt;/p&gt;
&lt;p&gt;Ici l’image &lt;code&gt;busybox:latest&lt;/code&gt; ne contient ( et heureusement ) aucune failles de sécurités&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/security-0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Il est possible de visualiser le détail de ces vulnérabilités en cliquant sur le bouton “View full report”.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/security-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On peut essayer avec plusieurs images:&lt;/p&gt;
&lt;h3 id=&quot;ubuntu-21-04&quot;&gt;ubuntu:21.04&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/security-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;De même, occupe vulnérabilité à déplorer :D&lt;/p&gt;
&lt;h3 id=&quot;ubuntu-20-04&quot;&gt;ubuntu:20.04&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/security-7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On voit déjà quelques vulnérabilités mais elles sont considérées comme modérées.&lt;/p&gt;
&lt;p&gt;On peut visualiser le détail d’une CVE en particulier en cliquant sur le bouton information (flèche rouge)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/security-8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Une description de l’exploit vous indique l’impact de la faille sur le système.&lt;/p&gt;
&lt;p&gt;A vous de juger si l’image doit être ou non corrigée.&lt;/p&gt;
&lt;h3 id=&quot;tomcat-10-0-jdk11-openjdk&quot;&gt;tomcat:10.0-jdk11-openjdk&lt;/h3&gt;
&lt;p&gt;Commençons par une image particulièrement vulnérable&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/security-4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On est sur un nombre très importants de vulnérabiltés (106)!&lt;/p&gt;
&lt;p&gt;Il est vivement recommandé de patcher ces vulnérabilités.&lt;/p&gt;
&lt;p&gt;Comme pour tout à l’heure on peut vérifier les détails.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/security-9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;tomcat-10-0-jdk11-corretto&quot;&gt;tomcat:10.0-jdk11-corretto&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/security-5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Modifier l’image de base permet de diminuer de manière drastique les failles de sécurité
présentes dans l’image.&lt;/p&gt;
&lt;p&gt;Il y en a toujours mais elles sont bien moins nombreuses et bien moins dangeureuses qu’avec la
version &lt;code&gt;openjdk&lt;/code&gt; basée sur debian 10.&lt;/p&gt;
&lt;p&gt;Et c’est à peu près tout ce que vous devez faire sur Gitlab.com pour avoir l’assurance de la sécurité de vos images.&lt;/p&gt;
&lt;p&gt;Après tout système est imparfait, Clair se base sur une base de données limité pour vérifier les différentes CVE et comme
celles-ci apparaissent tous les jours c’est une course perdue d’avance. Tout ce qu’on peut faire c’est limité les risques.&lt;/p&gt;
&lt;p&gt;Passons à la seconde méthode. :)&lt;/p&gt;
&lt;h2 id=&quot;methode-harbor&quot;&gt;Méthode Harbor&lt;/h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://goharbor.io/&quot;&gt;Harbor&lt;/a&gt; est un service de registry d’images de container et de charts helm.&lt;/p&gt;
&lt;p&gt;Le projet est opensource, gratuit, permet de pouvoir stocker, vérifier et distribuer ses images.&lt;/p&gt;
&lt;p&gt;Il dispose aussi d’un système d’ACL assez poussé et de tout un tas de fonctionnalité sympas.&lt;/p&gt;
&lt;p&gt;L’une d’elle va nous intéresser tout particulièrement: il s’agit de l’intégration &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://github.com/aquasecurity/trivy&quot;&gt;Trivy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Comme son github l’indique, le rôle de Trivy est de scanner les vulnérabilités des containers et de réaliser
un rapport détaillé et lisible afin qu’un humain puisse comprendre les problèmes et les fixer si
besoin est.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Exactement comme pour la méthode gitlab.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mais vous vous demandez surement pourquoi je vous parle de Harbor alors que le scan des images est très facile sur Gitlab.&lt;/p&gt;
&lt;p&gt;Et bien, il y a une subtilité : en version auto-hébergée, Gitlab gratuit propose bien le scan des images mais
pas la jolie interface de rapport.&lt;/p&gt;
&lt;p&gt;Tout ce que vous aurez dans l’interface de votre merge request c’est un lien pour télécharger le rapport au
format JSON.&lt;/p&gt;
&lt;p&gt;Mais on doit se l’avouer c’est presque inutilisable, surtout lorsque le nombre de vulnérabilités est grand.&lt;/p&gt;
&lt;p&gt;On sait d’expérience que si un outil n’est pas pratique on ne l’utilise pas. Et ce fichier JSON à télécharger
est l’exemple type !&lt;/p&gt;
&lt;p&gt;C’est pour cette raison je propose d’installer le service Harbor.&lt;/p&gt;
&lt;h3 id=&quot;installer-harbor&quot;&gt;Installer Harbor&lt;/h3&gt;
&lt;p&gt;Heureusement pour nous Harbor est très facile à installer. Il se présente sous une collection d’images docker
rassemblé sous un docker-compose.&lt;/p&gt;
&lt;p&gt;Les pré-requis sont donc d’avoir une machine possédant docker et docker-compose.&lt;/p&gt;
&lt;p&gt;Il vous faut aussi un nom de domaine, soit vous avez un enregistrement DNS soit vous modifiez votre &lt;code&gt;/etc/hosts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Je ferai mon installation sur une ubuntu 20.04.&lt;/p&gt;
&lt;p&gt;Vous pouvez récupérer la dernière release sur cette &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://github.com/goharbor/harbor/releases&quot;&gt;page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La version &lt;em&gt;online&lt;/em&gt; est infiniment plus légère que la &lt;em&gt;offline&lt;/em&gt; et donc je propose de l’utiliser, le résultat sera le même de toute façon. :)&lt;/p&gt;
&lt;p&gt;Avant tout on va récupérer un certificat.&lt;/p&gt;
&lt;p&gt;Si vous n’avez pas de nom de domaine réel, vous pouvez utiliser un certificat auto-signé, mais attention, vous risquez d’avoir des alertes de sécurité pour plusieurs choses.&lt;/p&gt;
&lt;p&gt;Nous allons préférer l’utilisation de Let’s Encrypt qui permet d’obtenir des certificats signés par une
autorité et donc parfaitement reconnu sans les problèmes de sécurités dont je vous ai mentionné l’existence
plus haut.&lt;/p&gt;
&lt;p&gt;Pour cela il existe un utilitaire extrêmement pratique nommé &lt;code&gt;certbot&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On l’installe.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;snap install certbot --classic&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;J’utilise &lt;code&gt;snap&lt;/code&gt; car le package apt est à une version bien inférieure.&lt;/p&gt;
&lt;p&gt;Vérifiez bien que votre nom de domaine résout bien l’IP de votre serveur harbor.&lt;/p&gt;
&lt;p&gt;Vous pouvez vous aidez de:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;nslookup&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; harbor.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ensuite on génère le certificat&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;certbot&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; certonly&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; me@example.com&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-agree-tos&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-standalone&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; harbor.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Après quelques instants vous devriez&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;IMPORTANT NOTES:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; - Congratulations! Your certificate and chain have been saved at:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   /etc/letsencrypt/live/harbor.example.com/fullchain.pem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Your key file has been saved at:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   /etc/letsencrypt/live/harbor.example.com/privkey.pem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Your certificate will expire on 2021-07-10. To obtain a new or&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   tweaked version of this certificate in the future, simply run&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   certbot again. To non-interactively renew *all* of your&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   certificates, run &amp;quot;certbot renew&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; - If you like Certbot, please consider supporting our work by:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Donating to ISRG / Let&amp;#39;s Encrypt:   https://letsencrypt.org/donate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Donating to EFF:                    https://eff.org/donate-le&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Téléchargez la release:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wget&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; https://github.com/goharbor/harbor/releases/download/v2.2.1/harbor-online-installer-v2.2.1.tgz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Modifier la version si besoin est.&lt;/p&gt;
&lt;p&gt;Décompressez l’archive&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;tar&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; xzvf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; harbor-online-installer-v2.2.1.tgz&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; /opt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Copiez le fichier de configuration&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; /opt/harbor/harbor.yml.tmpl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; /opt/harbor/harbor.yml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Modifier le fichier &lt;code&gt;/opt/harbor/harbor.yml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour faire correspondre à votre nom de domaine et aux chemins des certificats.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ostname&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; h&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;arbor.example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ttps&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ort&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ertificate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;etc/letsencrypt/live/harbor.example.com/fullchain.pem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;rivate_key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;etc/letsencrypt/live/harbor.example.com/privkey.pem&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous pouvez aussi modifier les mots de passes, je vais les laisser tel quel mais en production c’est évidemment
une très mauvaise idée !!&lt;/p&gt;
&lt;p&gt;Nous allons installer Harbor avec 3 composants supplémentaires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://github.com/helm/chartmuseum&quot;&gt;chartmuseum&lt;/a&gt; : permet de stocker les helm chart de Kubernetes&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://docs.docker.com/notary/getting_started/&quot;&gt;notary&lt;/a&gt; : signature des layers&lt;/li&gt;
&lt;li&gt;trivy : notre scanner d’images&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; /opt/harbor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;./install.sh&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-with-notary&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-with-trivy&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-with-chartmuseum&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce script à pour rôle de télécharger les images docker de Harbor, de configurer tout ce qui est à configurer
et de lancer le tout.&lt;/p&gt;
&lt;p&gt;Après quelques instants, vous pouvez vous rendre sur &lt;code&gt;https://harbor.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Connectez vous avec les identifiants:&lt;/p&gt;
&lt;p&gt;Par défaut:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;user: admin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;password: Harbor12345&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Vous arrivez sur l’interfaces des projets, dans le jargon de Harbor, le projet est une isolation qui permet de
limiter les accès aux images à un certain nombre d’utilisateurs.&lt;/p&gt;
&lt;p&gt;Par défaut un projet &lt;code&gt;library&lt;/code&gt; est déjà présent.&lt;/p&gt;
&lt;p&gt;Cliquez sur le lien en bleu &lt;code&gt;library&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Dans configuration coché la case &lt;code&gt;Automatically scan images on push&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ceci va permettre de lancer automatiquement des scan de sécurité des images.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On va créer un utilisateur robot qui nous permettra de pousser nos images sur le repository.&lt;/p&gt;
&lt;ol start=&quot;0&quot;&gt;
&lt;li&gt;Cliquez dans la side-bar sur &lt;code&gt;Robot accounts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cliquez sur &lt;code&gt;New Robot Account&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Donnez un nom à votre compte.
Modifiez l’expiration du token si besoin&lt;/li&gt;
&lt;li&gt;Donnez les droits au robot sur le projet &lt;code&gt;library&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Le token ne sera plus remontré. Stockez-le quelque part. Il va être réutilisé tout de suite.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Et pour la forme je vous montre que trivy tourne bien ^^&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;configurer-gitlab&quot;&gt;Configurer Gitlab&lt;/h3&gt;
&lt;p&gt;On va modifier notre pipeline Gitlab défini à la partie &lt;a href=&quot;https://staging.lafor.ge/harbor/#methode-gitlab-com&quot;&gt;précédente&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tout d’abord on se créé une nouvelle branche dérivée de &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;puis on modifie ainsi le &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;uild&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;uild&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;uild&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;mage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ame&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;cr.io/kaniko-project/executor:debug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ntrypoint&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ariables&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    I&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;MAGE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;buntu:21.04&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    R&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;EGISTRY&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; h&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;arbor.laforge.works&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;cript&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;at $HARBOR_ROBOT_AUTH_FILE &amp;gt; /kaniko/.docker/config.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-bg5 z-d-12 z-d-bg4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;      /kaniko/executor \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;      --context=$CI_PROJECT_DIR \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;      --dockerfile=$CI_PROJECT_DIR/Dockerfile \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;      --destination=$REGISTRY/library/$IMAGE \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;      --build-arg=IMAGE=$IMAGE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On utilise un projet appelé &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://github.com/GoogleContainerTools/kaniko&quot;&gt;kaniko&lt;/a&gt;, celui ci
remplace avantageusement le runtime docker par une solution plus rapide, plus légère moins contraignante et plus sécurisée.&lt;/p&gt;
&lt;p&gt;En effet, kaniko, ne nécéssite pas de container privilégié pour construire les images puis les
pousser dans un registry, ici pour nous notre Harbor.&lt;/p&gt;
&lt;p&gt;On modifie aussi notre &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;ARG&lt;/span&gt;&lt;span&gt; $IMAGE=busybox:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;FROM&lt;/span&gt;&lt;span&gt; $IMAGE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette modification permet de ne changer l’image que dans la variable de lancement du pipeline.&lt;/p&gt;
&lt;p&gt;Il nous manque juste l’authentification de notre robot sur harbor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/gitlab-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Rendez-vous dans l’interface de gestion des varaibles de CI/CD.&lt;/p&gt;
&lt;p&gt;Et ajoutez une nouvelle variable.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/gitlab-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Dans le champ &lt;code&gt;key&lt;/code&gt; indiqué la chaîne de caractères &lt;code&gt;HARBOR_ROBOT_AUTH_FILE&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans &lt;code&gt;value&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Remplissez la avec:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;auths&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;harbor.example.com&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;         &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;robot$$gitlab&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;         &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;***********************&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Modifiez &lt;code&gt;harbor.example.com&lt;/code&gt; par le domaine de votre instance Harbor et le veillez bien à doubler le symbole dollar &lt;code&gt;$$&lt;/code&gt; sinon la deuxième partie sera considéré comme
une variable d’environnement.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;Modifiez le type par &lt;code&gt;File&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Décochez le &lt;code&gt;Protect variable&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajoutez la variable.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C’est bon on est prêt à tester notre pipeline :D&lt;/p&gt;
&lt;h3 id=&quot;tests-des-images&quot;&gt;Tests des images&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/gitlab-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Pour lancer un pipeline de construction et d’upload de notre image, vous devez vous rendre dans la section
CI/CD -&amp;gt; Pipelines de notre projet Gitlab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/gitlab-4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Puis&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Modifier la branche utiliser comme source&lt;/li&gt;
&lt;li&gt;Ajouter une varible appelée &lt;code&gt;IMAGE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ajouter un nom d’image à construire ici par exemple: &lt;code&gt;busybox:latest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Lancer votre pipeline&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Après quelques instants vous pouvez retourner sur Harbor dans le projet library.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-check-0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Vous y trouverez une image &lt;code&gt;busybox&lt;/code&gt;, et comme vous le constatez 0 vulnérabilté à constater.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-check-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;ubuntu-21-04-1&quot;&gt;ubuntu:21.04&lt;/h3&gt;
&lt;p&gt;Réitérez les steps du dessus avec comme l’image &lt;code&gt;ubuntu:21.04&lt;/code&gt; comme valeur de &lt;code&gt;IMAGE&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-check-ubuntu-21-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Comme pour les checks Gitlab, aucune vulnérabilité à signaler.&lt;/p&gt;
&lt;h3 id=&quot;ubuntu-20-04-1&quot;&gt;ubuntu:20.04&lt;/h3&gt;
&lt;p&gt;On essaie avec une &lt;code&gt;ubuntu:20.04&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-check-ubuntu-20-04-part1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Cette fois, pour l’image &lt;code&gt;ubuntu:20.04&lt;/code&gt; on voit un &lt;code&gt;M&lt;/code&gt; jaune. Cela signifie que l’image possède
des vulnérabilités de sévérité modérées.&lt;/p&gt;
&lt;p&gt;En cliquant sur le sha1 de l’&lt;code&gt;ubuntu:20.04&lt;/code&gt; on peut visualiser les détails des vulnérabilités.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-check-ubuntu-20-04-part2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Comme on peut le voir, chaque vulnérabilité possède sa CVE et donc le détail du problème de sécurité.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-check-ubuntu-20-04-part3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Avec la flèche on peut même bénéficier d’un abstract du problème.&lt;/p&gt;
&lt;h3 id=&quot;tomcat-10-0-jdk11-openjdk-1&quot;&gt;tomcat:10.0-jdk11-openjdk&lt;/h3&gt;
&lt;p&gt;Allons y pour notre image trouée la &lt;code&gt;tomcat:10.0-jdk11-openjdk&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Elle nous donne le résultat suivant&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-check-tomcat-10.0-jdk11-openjdk-part1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Et les détails sont encore plus alarmants… 😨&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-check-tomcat-10.0-jdk11-openjdk-part2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Le résultat est clair, il ne faut pas utiliser sous aucun prétexte cette image en production! 😡&lt;/p&gt;
&lt;h3 id=&quot;tomcat-10-0-jdk11-corretto-1&quot;&gt;tomcat:10.0-jdk11-corretto&lt;/h3&gt;
&lt;p&gt;Réparons tout ça avec la &lt;code&gt;tomcat:10.0-jdk11-corretto&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/docker-security/harbor-check-tomcat-10.0-jdk11-corretto.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ouf :D&lt;/p&gt;
&lt;p&gt;Sur Harbor il existe tout un système de Harbor de webhooks, je planche actuellement sur une intégration Mattermost pour m’avertir
lorsqu’une vulnérabilité apparaît sur une image.&lt;/p&gt;
&lt;p&gt;Je ferai un article sur le sujet quand j’aurai un peu plus avancé ^^&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Cet article devait être court et ce ne fut pas le cas 😁&lt;/p&gt;
&lt;p&gt;Ce que je vous est montré aujourd’hui je l’utilise désormais tous les jours.&lt;/p&gt;
&lt;p&gt;Dans un prochain article sur la sécurité, je vous expliquerai comment créer des images
extrêmement légères et donc avec une surface d’attaque extrêmement réduite.&lt;/p&gt;
&lt;p&gt;Cette méthode s’appelle le multi-stage building et l’utilisation de &lt;code&gt;scratch&lt;/code&gt; comme base.&lt;/p&gt;
&lt;p&gt;Je vous remercie de m’avoir lu et je vous dis à la prochaine :)&lt;/p&gt;
</content>
        
    </entry>
</feed>
