Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
elearning:workbooks:docker3:drf06 [2021/11/21 11:48] – created adminelearning:workbooks:docker3:drf06 [2024/02/21 13:40] (Version actuelle) admin
Ligne 1: Ligne 1:
 ~~PDF:LANDSCAPE~~ ~~PDF:LANDSCAPE~~
  
-Version : **2021.01**+Version : **2024.01**
  
 Dernière mise-à-jour : ~~LASTMOD~~ Dernière mise-à-jour : ~~LASTMOD~~
  
-======DOF607 - Gestion du Réseau avec Docker======+======DOF607 - Gestion de la Sécurité de Docker======
  
 =====Contenu du Module===== =====Contenu du Module=====
  
-  * **DOF607 - Gestion du Réseau avec Docker**+  * **DOF607 - Gestion de la Sécurité de Docker**
     * Contenu du Module     * Contenu du Module
-    * L'Approche Réseau Docker +    * LAB #1 - Utilisation des Docker Secrets 
-    * LAB #Les Réseaux Docker ayant un Scope Local +    * LAB #2 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker 
-      * 1.1 - Bridge +    * LAB #Le Script docker-bench-security.sh 
-        Liens +    * LAB #4 - Sécurisation de la Configuration de l'Hôte Docker 
-      * 1.2 - Host +    * LAB #5 - Sécurisation de la Configuration du daemon Docker 
-      * 1.3 - None +      * 5.1 - Le Fichier /etc/docker/daemon.json 
-      * 1.4 - Lancer Wordpress dans un container +    LAB #6 - Sécurisation des Images et les Fichiers de Construction 
-      1.5 - Gestion d'une Architecture de Microservices +    * LAB #7 - Sécurisation du Container Runtime 
-    * LAB #Gestion du Réseau overlay +    * LAB #8 - Sécurisation des Images avec Docker Content Trust 
-      * 2.1 - Création d'un Réseau overlay +      * 8.- DOCKER_CONTENT_TRUST 
-      * 2.2 - Création d'un Service +      * 8.2 - DCT et la commande docker pull 
-      * 2.3 - Déplacer le Service vers un autre Réseau overlay +        * L'option disable-content-trust 
-      * 2.4 - DNS container discovery +      * 8.3 - DCT et la commande docker push 
-      * 2.5 - Création d'un Réseau overlay Personnalisé +      * 8.4 - DCT et la commande docker build 
-    * LAB #3 - Gestion de l'Architecture des Microservices +        * Créer un deuxième Repositry 
-      * 3.1 - Mise en Place avec Docker Swarm avec des réseaux Overlay+        Supprimer une Signature 
 +    * LAB #Sécurisation du Socket du Daemon Docker 
 +      * 9.1 - Création du Certificat de l'Autorité de Certification 
 +      * 9.2 - Création du Certificat du Serveur Hôte du Daemon Docker 
 +      * 9.3 - Création du Certificat du Client 
 +      * 9.4 - Démarrage du Daemon Docker avec une Invocation Directe 
 +      * 9.5 - Configuration du Client
  
-=====L'Approche Réseau Docker=====+=====LAB #1 - Utilisation des Docker Secrets=====
  
-L'approche réseau de Docker est **libnetwork** qui implémente le **C**ontainer **N**etwork **M**odel (CNM)Dans ce modèle on trouve trois composants :+Les secrets Docker sont une façon sécurisée de stocker des informations sensibles telles les noms d'utiisateurs, les mots de passe voire les fichiers. Ils ne sont compatibles qu'avec Docker en mode Swarm
  
-  * Sandbox, +Considérez l'exemple suivant d'un fichier Docker stack servant à créer un conteneur PostgreSQL :
-    * contient la configuration réseau du conteneur à savoir, la gestion des interfaces, la table de routage et le DNS, +
-  * Endpoint, +
-    * relie un sandbox à un network, +
-  * Network, +
-    * un groupe d'endpoints qui communiquent directement.+
  
-{{ :elearning:workbooks:docker:docker-3.jpg?direct&600 |image}}+<file> 
 +version'3.1'
  
-=====LAB #1 - Les Réseaux Docker ayant un Scope Local=====+services:
  
-Docker fournit trois réseaux par défaut :+  db: 
 +    image: postgres 
 +    environment: 
 +      POSTGRES_USER: postgres 
 +      POSTGRES_PASSWORD: postgres 
 +      POSTGRES_DB: database
  
-<code> +  adminer: 
-root@debian9:~# docker network ls +    imageadminer 
-NETWORK ID          NAME                DRIVER              SCOPE +    ports: 
-495b3db75b0d        bridge              bridge              local +     - 8080:8080 
-e1ed4de2f947        host                host                local +</file>
-6bda460c97c6        none                null                local +
-</code>+
  
-====1.1 Bridge====+On peut constater dans ce fichier la présence des informations sensibles en non-sécurisées :
  
-Ce type de réseau est limité aux conteneurs d'un hôte unique exécutant Docker. Les conteneurs ne peuvent communiquer qu'entre eux et ils ne sont pas accessibles depuis l'extérieur. Pour que les conteneurs sur le réseau puissent communiquer ou être accessibles du monde extérieur, il faut configurer le mappage de port.+  * POSTGRES_USER 
 +  * POSTGRES_PASSWORD 
 +  * POSTGRES_DB
  
-Par défaut Docker fonctionne en mode **Pont** ou (//Bridge//) et crée une interface intermédiaire à cet effet appelé **docker0** :+Afin de sécuriser ces informations, commencez par créer le contexte **postgres** :
  
 <code> <code>
-root@debian9:~# ip addr show docker0 +root@manager:~# mkdir postgres
-3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default  +
-    link/ether 02:42:38:f1:e7:ee brd ff:ff:ff:ff:ff:ff +
-    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 +
-       valid_lft forever preferred_lft forever+
 </code> </code>
  
-Démarrez un conteneur dénommé **resotest** à partir d'une image de CentOS +Créez ensuite un Docker Secret appelé **pg_user** :
  
 <code> <code>
-root@debian9:~# docker run -itd --name=resotest centos +root@manager:~# cd postgres 
-2169360fcbfdbd6e68ea969a95edeb6fc42603c23ee42f03ceec286276519855+root@manager:~/postgres# echo "postgres"docker secret create pg_user 
 +lpk8eq80qvfiqw7z1686fmj5t
 </code> </code>
  
-Lancez ensuite la commande **docker network inspect bridge** à partir de la machine virtuelle hôte de Debian_9 :+<WRAP center round important 50%> 
 +**Important** : Notez l'utilisation du caractère **-** à la fin de la ligne. Celui-ci indique à la commande **docker secret** de lire le contenu du secret pg_user à partir de l'entrée standard. 
 +</WRAP> 
 + 
 +Pour visualiser la liste des secrets, utilisez la commande docker secrets **ls** :
  
 <code> <code>
-root@debian9:~# docker network inspect bridge +root@manager:~/postgres# docker secret ls 
-+ID                          NAME                DRIVER              CREATED              UPDATED 
-    { +lpk8eq80qvfiqw7z1686fmj5t   pg_user                                 About a minute ago   About a minute ago
-        "Name": "bridge", +
-        "Id": "495b3db75b0d4bfcfc6da7c3e2af5f6addcdc227aa8b69b1e59a998be1819d12", +
-        "Created": "2017-09-07T07:44:49.942615596+01:00", +
-        "Scope": "local", +
-        "Driver": "bridge", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config": [ +
-                +
-                    "Subnet": "172.17.0.0/16", +
-                    "Gateway": "172.17.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "2169360fcbfdbd6e68ea969a95edeb6fc42603c23ee42f03ceec286276519855":+
-                "Name": "resotest", +
-                "EndpointID": "fc74e519d69b9a2112be959c92cda22b67671b52efbbd36fadf66097ccbb1271", +
-                "MacAddress": "02:42:ac:11:00:03", +
-                "IPv4Address": "172.17.0.3/16", +
-                "IPv6Address": "" +
-            }, +
-        }, +
-        "Options":+
-            "com.docker.network.bridge.default_bridge": "true", +
-            "com.docker.network.bridge.enable_icc": "true", +
-            "com.docker.network.bridge.enable_ip_masquerade": "true", +
-            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", +
-            "com.docker.network.bridge.name": "docker0", +
-            "com.docker.network.driver.mtu": "1500" +
-        }, +
-        "Labels": {} +
-    } +
-]+
 </code> </code>
  
-<WRAP center round important> +<WRAP center round important 50%
-**Important** : Notez ici que le conteneur **resotest** ne dispose pas de la même adresse que l'interface **docker0** de la machine hôteCependant les adresses se trouvent dans le même segment - **172.17.0.0/16** indiqué par la sortie **"Subnet": "172.17.0.0/16"**.+**Important** : Notez que la colonne **DRIVER** est videCeci indique que le gestion des secrets est accomplie par Docker lui-même au lieu d'être déléguée à un plugin tiers.
 </WRAP> </WRAP>
  
-Vous pouvez déconnecter un conteneur du réseau en utilisant la commande suivante :+Créez maintenant les secrets **pg_password** et **pg_database** :
  
 <code> <code>
-root@debian9:~# docker network disconnect bridge resotest +root@manager:~/postgresecho "postgres"docker secret create pg_password - 
-root@debian9:~# docker network inspect bridge +h9tsfbfwz6o0sd35roklwpopi 
-+root@manager:~/postgresecho "database| docker secret create pg_database 
-    { +5lx4zydpfocwgpdto0yy1jod9
-        "Name": "bridge", +
-        "Id": "495b3db75b0d4bfcfc6da7c3e2af5f6addcdc227aa8b69b1e59a998be1819d12", +
-        "Created": "2017-09-07T07:44:49.942615596+01:00", +
-        "Scope": "local", +
-        "Driver": "bridge", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "172.17.0.0/16", +
-                    "Gateway": "172.17.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":  +
-        }, +
-        "Options":+
-            "com.docker.network.bridge.default_bridge": "true", +
-            "com.docker.network.bridge.enable_icc": "true", +
-            "com.docker.network.bridge.enable_ip_masquerade": "true", +
-            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", +
-            "com.docker.network.bridge.name": "docker0", +
-            "com.docker.network.driver.mtu": "1500" +
-        }, +
-        "Labels": {} +
-    } +
-]+
 </code> </code>
  
-Créez maintenant votre propre réseau ponté appelé **my-bridged-network** :+<WRAP center round important 50%> 
 +**Important** : Notez qu'un secret Docker est immuable. 
 +</WRAP> 
 + 
 +Vérifiez la prise en compte de vos commandes :
  
 <code> <code>
-root@debian9:~# docker network create -d bridge --subnet 172.25.0.0/16 --gateway 172.25.0.1 my-bridged-network +root@manager:~/postgres# docker secret ls 
-ceb7ba7493933c55d181bc92b1f799ca07bfe84b168d52a6ac648c1a906093f3 +ID                          NAME                DRIVER              CREATED             UPDATED 
-root@debian9:~# docker network ls +5lx4zydpfocwgpdto0yy1jod9   pg_database                             2 minutes ago       2 minutes ago 
-NETWORK ID          NAME                 DRIVER              SCOPE +h9tsfbfwz6o0sd35roklwpopi   pg_password                             3 minutes ago       3 minutes ago 
-495b3db75b0d        bridge               bridge              local +lpk8eq80qvfiqw7z1686fmj5t   pg_user                                 5 minutes ago       5 minutes ago
-e1ed4de2f947        host                 host                local +
-ceb7ba749393        my-bridged-network   bridge              local +
-6bda460c97c6        none                 null                local             +
 </code> </code>
  
-Bien évidementce réseau est actuellement vide :+Pour obtenir de l'information concernant un secretil convient d'utiliser la commande docker secret **inspect** :
  
 <code> <code>
-root@debian9:~# docker network inspect my-bridged-network+root@manager:~/postgres# docker secret inspect pg_database
 [ [
     {     {
-        "Name": "my-bridged-network", +        "ID": "5lx4zydpfocwgpdto0yy1jod9", 
-        "Id": "ceb7ba7493933c55d181bc92b1f799ca07bfe84b168d52a6ac648c1a906093f3", +        "Version": { 
-        "Created": "2017-09-07T10:03:17.063730665+01:00", +            "Index": 23
-        "Scope": "local", +
-        "Driver": "bridge", +
-        "EnableIPv6": false, +
-        "IPAM": { +
-            "Driver": "default", +
-            "Options": {}, +
-            "Config":+
-                { +
-                    "Subnet": "172.25.0.0/16", +
-                    "Gateway": "172.25.0.1" +
-                } +
-            ]+
         },         },
-        "Internal": false+        "CreatedAt": "2021-04-15T03:49:36.344367554Z"
-        "Attachable": false, +        "UpdatedAt": "2021-04-15T03:49:36.344367554Z", 
-        "Ingress": false+        "Spec": { 
-        "ConfigFrom": { +            "Name": "pg_database", 
-            "Network": "" +            "Labels": {} 
-        }+        }
-        "ConfigOnly": false, +
-        "Containers": {}, +
-        "Options": {}, +
-        "Labels": {}+
     }     }
 ] ]
 </code> </code>
  
-Lancez maintenant deux conteneurs et consultez les informations concernant le réseau +<WRAP center round important 50%> 
 +**Important** : On peut constater dans la sortie de cette commande la valeur **CreatedAt** qui correspond à la date de création du secret ainsi que **UpdatedAt** qui correspond à la date de modification du secret. 
 +</WRAP> 
 + 
 +L'option **--pretty** de la commande fait apparaître ces informations plus clairement :
  
 <code> <code>
-root@debian9:~# docker run -itd --name=centos1 centos +root@manager:~/postgres# docker secret inspect --pretty pg_database 
-9f36a628c72b383edfd4dc13ee4e4b2eaf5be0078d780f0334fcb8be0d977d0e+ID:              5lx4zydpfocwgpdto0yy1jod9 
 +Name:              pg_database 
 +Driver:             
 +Created at:        2021-04-15 03:49:36.344367554 +0000 utc 
 +Updated at:        2021-04-15 03:49:36.344367554 +0000 utc 
 +</code>
  
-root@debian9:~# docker run -itd --name=centos2 centos +Créez maintenant le fichier compose **postgres-secrets.yaml** :
-aaed3bc8e404ee1bccd6c87b39de32332940b5391514691fc70188edb17c1d7c+
  
-root@debian9:~# docker inspect --format='{{json .NetworkSettings.Networks}}'  centos1 +<code> 
-{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"495b3db75b0d4bfcfc6da7c3e2af5f6addcdc227aa8b69b1e59a998be1819d12","EndpointID":"d7b87875688b45258fc867b6bb8b0a0592f5c5fa16857fe136e55b87b6698219","Gateway":"172.17.0.1","IPAddress":"172.17.0.3","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:03","DriverOpts":null}}+root@manager:~/postgresvi postgres-secrets.yaml 
 +root@manager:~/postgres# cat postgres-secrets.yaml 
 +version'3.1'
  
-root@debian9:~# docker inspect --format='{{json .NetworkSettings.Networks}}'  centos2 +services:
-{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"495b3db75b0d4bfcfc6da7c3e2af5f6addcdc227aa8b69b1e59a998be1819d12","EndpointID":"2bfe090dccef89495d437d8deba5765996a917544ab7fde28ef5199f4e907eb1","Gateway":"172.17.0.1","IPAddress":"172.17.0.4","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:04","DriverOpts":null}}+
  
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos1 +    db: 
-172.17.0.3+        image: postgres 
 +        restart: always 
 +        environment: 
 +            POSTGRES_USER_FILE: /run/secrets/pg_user 
 +            POSTGRES_PASSWORD_FILE: /run/secrets/pg_password 
 +            POSTGRES_DB_FILE: /run/secrets/pg_database 
 +        secrets: 
 +           pg_password 
 +           pg_user 
 +           - pg_database
  
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos2 +    adminer 
-172.17.0.4+        image: adminer  
 +        ports:  
 +         8080:8080 
 + 
 +secrets: 
 +  pg_user: 
 +    external: true 
 +  pg_password: 
 +    external: true 
 +  pg_database: 
 +    external: true
 </code> </code>
  
-Mettez le conteneur **centos1** dans le réseau **my-bridged-network** :+Notez que dans ce fichier les trois variables **POSTGRES_USER**, **POSTGRES_PASSWORD** et **POSTGRES_DB** ont un suffixe **_FILE** car elles référencent des **fichiers** contenant des informations plutôt que des informations elles-mêmes. Ces fichiers se trouvent dans le répertoire **/run/secrets** du **conteneur**.
  
-<code> +Deuxièmement la section suivantes spécifie les noms des secrets à utiliser avec le service :
-root@debian9:~# docker network connect my-bridged-network centos1+
  
-root@debian9:~# docker network inspect my-bridged-network +<file> 
-+        secrets: 
-    { +           pg_password 
-        "Name""my-bridged-network", +           pg_user 
-        "Id": "ceb7ba7493933c55d181bc92b1f799ca07bfe84b168d52a6ac648c1a906093f3", +           pg_database 
-        "Created": "2017-09-07T10:03:17.063730665+01:00", +</file>
-        "Scope": "local", +
-        "Driver": "bridge", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": {}, +
-            "Config":+
-                { +
-                    "Subnet": "172.25.0.0/16", +
-                    "Gateway": "172.25.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "9f36a628c72b383edfd4dc13ee4e4b2eaf5be0078d780f0334fcb8be0d977d0e":+
-                "Name": "centos1", +
-                "EndpointID": "71e10e4e34ce8c42ef029e302f6ed372357f6fde8fd87fc2cbc1b14c2bdf6bb5", +
-                "MacAddress": "02:42:ac:19:00:02", +
-                "IPv4Address": "172.25.0.2/16", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options": {}, +
-        "Labels": {} +
-    } +
-]+
  
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos1 +La dernière section spécifie que les secrets sont **externes** :
-172.17.0.3172.25.0.2 +
-</code>+
  
-<WRAP center round important> +<file> 
-**Important** : Notez  que le conteneur **centos1** se trouve dans deux réseaux.+secrets: 
 +  pg_user: 
 +    external: true 
 +  pg_password: 
 +    external: true 
 +  pg_database: 
 +    external: true 
 +</file> 
 + 
 +<WRAP center round important 50%
 +**Important** : Le terme **externe** indique que les secrets ne seront pas stockés dans l'image construite mais **uniquement** dans le conteneur créé.
 </WRAP> </WRAP>
  
-Faites la même chose pour le conteneur **centos2** :+Déployez maintenant le service en utilisant la commande **docker stack** :
  
 <code> <code>
-root@debian9:~# docker network connect my-bridged-network centos2+root@manager:~/postgres# docker stack deploy -c postgres-secrets.yaml postgres 
 +Ignoring unsupported options: restart
  
-root@debian9:~# docker network inspect my-bridged-network +Creating network postgres_default 
-+Creating service postgres_db 
-    { +Creating service postgres_adminer
-        "Name": "my-bridged-network", +
-        "Id": "ceb7ba7493933c55d181bc92b1f799ca07bfe84b168d52a6ac648c1a906093f3", +
-        "Created": "2017-09-07T10:03:17.063730665+01:00", +
-        "Scope": "local", +
-        "Driver": "bridge", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": {}, +
-            "Config":+
-                { +
-                    "Subnet": "172.25.0.0/16", +
-                    "Gateway": "172.25.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "9f36a628c72b383edfd4dc13ee4e4b2eaf5be0078d780f0334fcb8be0d977d0e":+
-                "Name": "centos1", +
-                "EndpointID": "71e10e4e34ce8c42ef029e302f6ed372357f6fde8fd87fc2cbc1b14c2bdf6bb5", +
-                "MacAddress": "02:42:ac:19:00:02", +
-                "IPv4Address": "172.25.0.2/16", +
-                "IPv6Address": "" +
-            }, +
-            "aaed3bc8e404ee1bccd6c87b39de32332940b5391514691fc70188edb17c1d7c":+
-                "Name": "centos2", +
-                "EndpointID": "34f533622f134b995097f1d3e6ce935158c1e5644201f896b42336738a81819c", +
-                "MacAddress": "02:42:ac:19:00:03", +
-                "IPv4Address": "172.25.0.3/16", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options": {}, +
-        "Labels": {} +
-    } +
-+
- +
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos2 +
-172.17.0.4172.25.0.3+
 </code> </code>
  
-Connectez-vous au conteneur **centos1** en lançant bash :+<WRAP center round important 50%> 
 +**Important** : Notez a présence de l'erreur **Ignoring unsupported options: restart**. Celle-ci est due au fait que la directive **restart** est compatible avec la commande **docker-compose** mais pas avec la commande **docker stack**. La directive qui aurait du être utilisée dans le fichier est **restart_policy:**. 
 +</WRAP>
  
-<code> +Connectez-vous maintenant à Apache Guacamole et ouvrez un navigateur web dans la machine virtuelle. Naviguez ensuite à l'adresse du Manager sur le port **8080** et renseignez les valeurs des secrets :
-root@debian9:~# docker exec -it centos1 bash +
-</code>+
  
-Vérifiez que la connectivité fonctionne :+{{ :elearning:workbooks:docker2:2021-04-15.png?direct&600 |}} 
 + 
 +Validez le formulaire et vérifiez que les secrets ont été pris en compte : 
 + 
 +{{ :elearning:workbooks:docker2:2021-04-15_1_.png?direct&600 |}} 
 + 
 +Dernièrement, supprimez le service :
  
 <code> <code>
-[root@9f36a628c72b /]ping 172.25.0.3 +root@manager:~/postgresdocker stack ls 
-PING 172.25.0.3 (172.25.0.3) 56(84) bytes of data. +NAME                SERVICES            ORCHESTRATOR 
-64 bytes from 172.25.0.3: icmp_seq=1 ttl=64 time=0.100 ms +postgres                              Swarm 
-64 bytes from 172.25.0.3: icmp_seq=ttl=64 time=0.050 ms +root@manager:~/postgres# docker stack rm postgres 
-64 bytes from 172.25.0.3icmp_seq=3 ttl=64 time=0.050 ms +Removing service postgres_adminer 
-^C +Removing service postgres_db 
---- 172.25.0.3 ping statistics --- +Removing network postgres_default
-3 packets transmitted, 3 received, 0% packet loss, time 1998ms +
-rtt min/avg/max/mdev = 0.050/0.066/0.100/0.025 ms+
 </code> </code>
  
-Les options possibles au niveau de la gestion du réseau sont vaste. Voici deux exemples supplémentaires.+=====LAB #2 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker=====
  
-Il est possible d'ajouter une adresse d'un serveur DNS au lancement d'un conteneur :+Au contraire des solutions classiques de gestion de machines virtuelles où l'accès est souvent conditionné à l'attribution de rôles, Docker ne possède pas ce type de mécanisme. De ce fait toute personne ayant accès à l'hôte soit par **sudo** soit en étant membre du groupe **docker** peut accéder à tous les conteneurs voire les arrêter, supprimer et en créer d'autres.
  
 <code> <code>
-[root@9f36a628c72b /]exit +root@manager:~cat /etc/group | grep docker 
-exit +docker:x:999: 
-root@debian9:~# docker stop resotest +root@manager:~# usermod -aG docker trainee 
-mongo2 +root@manager:~# exit 
-root@debian9:~# docker rm resotest +déconnexion 
-mongo2 +trainee@manager:~docker ps 
-root@debian9:~docker run -it --name=resotest --dns 8.8.8.8 centos bash +Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/jsondial unix /var/run/docker.sock: connect: permission denied 
-root@735599480b45:/# cat /etc/resolv.conf  +trainee@manager:~$ newgrp docker 
-search home +trainee@manager:~$ docker ps -a 
-nameserver 8.8.8.8 +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                 NAMES 
-root@735599480b45:/+d02c6115724c        alpine              "/bin/sh"                6 days ago          Exited (0) 6 days ago                               alpine1 
 +trainee@manager:~$ docker rm alpine1 
 +alpine1 
 +trainee@manager:~$ docker run -d --name alpine1 alpine sleep 99999 
 +a214e2df0499c97e8da25a6c9ea751ac75344c9bcd7d238f8cb8d5c777510ab9 
 +trainee@manager:~$ docker ps -a 
 +CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 
 +a214e2df0499        alpine              "/bin/sh"           6 seconds ago       Up 5 seconds                            alpine1
 </code> </code>
  
-ou de passer une entrée pour le fichier **/etc/hosts** :+=====LAB #3 - Le Script docker-bench-security.sh===== 
 + 
 +Le **Center for Internet Security (CIS)** est une organisation indépendante à but non-lucratif qui publie des best practices dans de nombreux domaines de l'informatique. Le guide pour Docker peut être téléchargé à partir de l'adresse [[https://www.cisecurity.org/benchmark/docker/]]. 
 + 
 +Le guide est divisé en plusieurs sections : 
 + 
 +  * La configuration de l'hôte Docker, 
 +  * La configuration du daemon Docker, 
 +  * Les fichiers de configuration du daemon Docker, 
 +  * Les images ainsi que les fichiers servant à la construction des images, 
 +  * Le container runtime, 
 +  * Les opérations sécuritaires relatives à Docker, 
 +  * La configuration de Docker Swarm. 
 + 
 +Ce guide est à utiliser avec le script **Docker Benchmark Security**. 
 + 
 +Clonez le script **docker-bench-security.sh** en utilisant **git** :
  
 <code> <code>
-root@735599480b45:/# exit +trainee@manager:~$ su 
-exit +Passwordfenestros
-root@debian9:~# docker stop resotest +
-mongo2 +
-root@debian9:~# docker rm resotest +
-mongo2 +
-root@debian9:~# docker run -it --name=resotest --add-host mickeymouse:127.0.0.1 centos bash +
-root@718e7eab814f:/# cat /etc/hosts +
-127.0.0.1 localhost +
-::1 localhost ip6-localhost ip6-loopback +
-fe00::0 ip6-localnet +
-ff00::0 ip6-mcastprefix +
-ff02::1 ip6-allnodes +
-ff02::2 ip6-allrouters +
-127.0.0.1 mickeymouse +
-172.17.0.2 718e7eab814f +
-</code>+
  
-===Liens===+root@manager:~# git clone https://github.com/docker/docker-bench-security.git 
 +Cloning in 'docker-bench-security'... 
 +remote: Enumerating objects: 18, done. 
 +remote: Counting objects: 100% (18/18), done. 
 +remote: Compressing objects: 100% (16/16), done. 
 +remote: Total 1921 (delta 5), reused 6 (delta 2), pack-reused 1903 
 +Receiving objects: 100% (1921/1921), 2.90 MiB | 908.00 KiB/s, done. 
 +Delta resolution: 100% (1339/1339), done. 
 +</code>
  
-Le mécanisme des liens entre conteneurs est très puissant et permet d'atteindre un autre conteneur facilement à condition que les deux conteneurs soient dans le même réseau. Créez donc un conteneur dénommé **centos3** qui est lié au conteneur **centos2** qu'il connait aussi sous l'alias **alias** :+Exécutez maintenant le script **Docker Benchmark Security** :
  
 <code> <code>
-root@332aa9930f30:/exit +root@manager:~cd docker-bench-security/
-exit+
  
-root@debian9:~# docker run -itd --name centos3 --link centos2:alias centos +root@manager:~/docker-bench-security./docker-bench-security.sh 
-6a315259b2946c3bf2bb69f608cbe910d87edaadedb4f805e7a4dbf6af1eb916+# -------------------------------------------------------------------------------------------- 
 +# Docker Bench for Security v1.6.0 
 +
 +# Docker, Inc. (c) 2015-2023 
 +
 +# Checks for dozens of common best-practices around deploying Docker containers in production. 
 +# Based on the CIS Docker Benchmark 1.6.0. 
 +# --------------------------------------------------------------------------------------------
  
-root@debian9:~# docker ps -+Initializing 2023-12-17T14:22:08+01:00
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES +
-6a315259b294        centos              "/bin/bash"              33 seconds ago      Up 32 seconds                                     centos3 +
-332aa9930f30        i2tch/mongodb2      "docker-entrypoint..."   3 minutes ago       Exited (127) 39 seconds ago                       mongo2 +
-aaed3bc8e404        centos              "/bin/bash"              16 minutes ago      Up 16 minutes                                     centos2 +
-9f36a628c72b        centos              "/bin/bash"              16 minutes ago      Up 16 minutes                                     centos1 +
-2169360fcbfd        centos              "/bin/bash"              20 minutes ago      Up 20 minutes                                     resotest +
-ea239635e141        testcache           "more /tmp/moment"       7 hours ago         Exited (0) 7 hours ago                            test1 +
-21b0490a93dd        i2tch/mydocker      "/entrypoint.sh my..."   7 hours ago         Exited (137) 6 hours ago                          myDocker +
-bdb4bc0f81de        i2tch/mongodb1      "docker-entrypoint..."   18 hours ago        Created                       27017/tcp           mongo1 +
-f5b45072b831        i2tch/mongodb       "bash"                   19 hours ago        Exited (137) 6 hours ago                          mongo +
-9731a48f126a        nginx               "nginx -g 'daemon ..."   19 hours ago        Exited (0) 6 hours ago                            cocky_gates +
-eacd70596e23        nginx               "nginx -g 'daemon ..."   19 hours ago        Exited (0) 19 hours ago                           adoring_yonath +
-cffb4456e9c4        ubuntu              "/bin/bash"              20 hours ago        Exited (0) 20 hours ago                           i2tch+
  
-root@debian9:~# docker exec -it centos3 bash 
  
-[root@6a315259b294 /]# ping centos2 +Section A Check results
-PING alias (172.17.0.4) 56(84) bytes of data. +
-64 bytes from alias (172.17.0.4): icmp_seq=1 ttl=64 time=0.116 ms +
-64 bytes from alias (172.17.0.4): icmp_seq=2 ttl=64 time=0.069 ms +
-64 bytes from alias (172.17.0.4): icmp_seq=3 ttl=64 time=0.068 ms +
-64 bytes from alias (172.17.0.4): icmp_seq=4 ttl=64 time=0.070 ms +
-^C +
---- alias ping statistics --- +
-4 packets transmitted, 4 received, 0% packet loss, time 2999ms +
-rtt min/avg/max/mdev = 0.068/0.080/0.116/0.023 ms+
  
-[root@6a315259b294 /]# cat /etc/hosts +[INFO] 1 - Host Configuration 
-127.0.0.1 localhost +[INFO] 1.1 - Linux Hosts Specific Configuration 
-::1 localhost ip6-localhost ip6-loopback +[WARN] 1.1.1 - Ensure a separate partition for containers has been created (Automated) 
-fe00::0 ip6-localnet +[INFO] 1.1.2 - Ensure only trusted users are allowed to control Docker daemon (Automated) 
-ff00::0 ip6-mcastprefix +[INFO]       * Users: trainee 
-ff02::1 ip6-allnodes +[WARN] 1.1.3 - Ensure auditing is configured for the Docker daemon (Automated) 
-ff02::2 ip6-allrouters +[WARN] 1.1.4 - Ensure auditing is configured for Docker files and directories -/run/containerd (Automated) 
-172.17.0.4 alias aaed3bc8e404 centos2 +[WARN1.1.5 - Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated) 
-172.17.0.2 6a315259b294+[WARN] 1.1.6 - Ensure auditing is configured for Docker files and directories - /etc/docker (Automated) 
 +[WARN] 1.1.7 - Ensure auditing is configured for Docker files and directories - docker.service (Automated) 
 +[INFO] 1.1.8 - Ensure auditing is configured for Docker files and directories - containerd.sock (Automated) 
 +[INFO]        * File not found 
 +[WARN] 1.1.9 Ensure auditing is configured for Docker files and directories docker.socket (Automated) 
 +[WARN] 1.1.10 Ensure auditing is configured for Docker files and directories - /etc/default/docker (Automated) 
 +[INFO] 1.1.11 Ensure auditing is configured for Dockerfiles and directories - /etc/docker/daemon.json (Automated) 
 +[INFO]        * File not found 
 +[WARN] 1.1.12 1.1.12 Ensure auditing is configured for Dockerfiles and directories - /etc/containerd/config.toml (Automated) 
 +[INFO] 1.1.13 Ensure auditing is configured for Docker files and directories - /etc/sysconfig/docker (Automated) 
 +[INFO]        * File not found 
 +[WARN] 1.1.14 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated) 
 +[WARN] 1.1.15 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated) 
 +[INFO] 1.1.16 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v1 (Automated) 
 +[INFO]         * File not found 
 +[INFO] 1.1.17 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v2 (Automated) 
 +[INFO]         * File not found 
 +[WARN] 1.1.18 - Ensure auditing is configured for Docker files and directories - /usr/bin/runc (Automated) 
 +[INFO] 1.2 - General Configuration 
 +[NOTE] 1.2.1 - Ensure the container host has been Hardened (Manual) 
 +[PASS] 1.2.2 - Ensure that the version of Docker is up to date (Manual) 
 +[INFO]        * Using 19.03.4, verify is it up to date as deemed necessary
  
-[root@6a315259b294 /]# exit +[INFO] 2 - Docker daemon configuration 
-exit+[NOTE] 2.1 - Run the Docker daemon as a non-root user, if possible (Manual) 
 +[WARN2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored) 
 +[PASS] 2.3 - Ensure the logging level is set to 'info' (Scored) 
 +[PASS] 2.4 - Ensure Docker is allowed to make changes to iptables (Scored) 
 +[PASS] 2.5 - Ensure insecure registries are not used (Scored) 
 +[PASS] 2.6 - Ensure aufs storage driver is not used (Scored) 
 +[INFO] 2.7 - Ensure TLS authentication for Docker daemon is configured (Scored) 
 +[INFO]      * Docker daemon not listening on TCP 
 +[INFO] 2.8 - Ensure the default ulimit is configured appropriately (Manual) 
 +[INFO]      * Default ulimit doesn't appear to be set 
 +[WARN] 2.9 - Enable user namespace support (Scored) 
 +[PASS] 2.10 - Ensure the default cgroup usage has been confirmed (Scored) 
 +[PASS] 2.11 - Ensure base device size is not changed until needed (Scored) 
 +[WARN] 2.12 - Ensure that authorization for Docker client commands is enabled (Scored) 
 +[WARN] 2.13 - Ensure centralized and remote logging is configured (Scored) 
 +[WARN] 2.14 - Ensure containers are restricted from acquiring new privileges (Scored) 
 +[WARN] 2.15 - Ensure live restore is enabled (Scored) 
 +[WARN] 2.16 - Ensure Userland Proxy is Disabled (Scored) 
 +[PASS] 2.17 - Ensure that a daemon-wide custom seccomp profile is applied if appropriate (Manual) 
 +[PASS] 2.18 - Ensure that experimental features are not implemented in production (Scored)
  
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos3 +[INFO] 3 - Docker daemon configuration files 
-172.17.0.2 +[PASS] 3.1 - Ensure that the docker.service file ownership is set to root:root (Automated) 
-</code>+[PASS] 3.2 - Ensure that docker.service file permissions are appropriately set (Automated) 
 +[PASS] 3.3 Ensure that docker.socket file ownership is set to root:root (Automated) 
 +[PASS] 3.4 Ensure that docker.socket file permissions are set to 644 or more restrictive (Automated) 
 +[PASS] 3.5 - Ensure that the /etc/docker directory ownership is set to root:root (Automated) 
 +[PASS] 3.6 - Ensure that /etc/docker directory permissions are set to 755 or more restrictively (Automated) 
 +[INFO] 3.7 - Ensure that registry certificate file ownership is set to root:root (Automated) 
 +[INFO]      * Directory not found 
 +[INFO] 3.8 - Ensure that registry certificate file permissions are set to 444 or more restrictively (Automated) 
 +[INFO]      * Directory not found 
 +[INFO] 3.9 - Ensure that TLS CA certificate file ownership is set to root:root (Automated) 
 +[INFO]      * No TLS CA certificate found 
 +[INFO] 3.10 - Ensure that TLS CA certificate file permissions are set to 444 or more restrictively (Automated) 
 +[INFO]       * No TLS CA certificate found 
 +[INFO] 3.11 - Ensure that Docker server certificate file ownership is set to root:root (Automated) 
 +[INFO]       * No TLS Server certificate found 
 +[INFO] 3.12 - Ensure that the Docker server certificate file permissions are set to 444 or more restrictively (Automated) 
 +[INFO]       * No TLS Server certificate found 
 +[INFO] 3.13 - Ensure that the Docker server certificate key file ownership is set to root:root (Automated) 
 +[INFO]       * No TLS Key found 
 +[INFO] 3.14 - Ensure that the Docker server certificate key file permissions are set to 400 (Automated) 
 +[INFO]       * No TLS Key found 
 +[PASS] 3.15 - Ensure that the Docker socket file ownership is set to root:docker (Automated) 
 +[PASS] 3.16 - Ensure that the Docker socket file permissions are set to 660 or more restrictively (Automated) 
 +[INFO] 3.17 - Ensure that the daemon.json file ownership is set to root:root (Automated) 
 +[INFO]       * File not found 
 +[INFO] 3.18 - Ensure that daemon.json file permissions are set to 644 or more restrictive (Automated) 
 +[INFO]       * File not found 
 +[PASS] 3.19 - Ensure that the /etc/default/docker file ownership is set to root:root (Automated) 
 +[PASS] 3.20 - Ensure that the /etc/default/docker file permissions are set to 644 or more restrictively (Automated) 
 +[INFO] 3.21 - Ensure that the /etc/sysconfig/docker file permissions are set to 644 or more restrictively (Automated) 
 +[INFO]       * File not found 
 +[INFO] 3.22 - Ensure that the /etc/sysconfig/docker file ownership is set to root:root (Automated) 
 +[INFO]       * File not found 
 +[PASS] 3.23 - Ensure that the Containerd socket file ownership is set to root:root (Automated) 
 +[PASS] 3.24 - Ensure that the Containerd socket file permissions are set to 660 or more restrictively (Automated)
  
-Notez cependant qu le lien est unidirectionnel :+[INFO] 4 - Container Images and Build File 
 +[INFO] 4.1 - Ensure that a user for the container has been created (Automated) 
 +[INFO]      * No containers running 
 +[NOTE] 4.2 - Ensure that containers use only trusted base images (Manual) 
 +[NOTE] 4.3 - Ensure that unnecessary packages are not installed in the container (Manual) 
 +[NOTE] 4.4 - Ensure images are scanned and rebuilt to include security patches (Manual) 
 +[WARN] 4.5 - Ensure Content trust for Docker is Enabled (Automated) 
 +[WARN] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images (Automated) 
 +[WARN]      * No Healthcheck found[nginx:latest] 
 +[WARN]      * No Healthcheck found: [alpine:latest] 
 +[WARN]      * No Healthcheck found: [ubuntu:latest] 
 +[WARN]      * No Healthcheck found: [centos:latest] 
 +[PASS] 4.7 - Ensure update instructions are not used alone in the Dockerfile (Manual) 
 +[NOTE] 4.8 - Ensure setuid and setgid permissions are removed (Manual) 
 +[PASS] 4.9 - Ensure that COPY is used instead of ADD in Dockerfiles (Manual) 
 +[NOTE] 4.10 - Ensure secrets are not stored in Dockerfiles (Manual) 
 +[NOTE] 4.11 - Ensure only verified packages are installed (Manual) 
 +[NOTE] 4.12 - Ensure all signed artifacts are validated (Manual)
  
-<code> +[INFO] 5 Container Runtime 
-root@debian9:~# docker exec -it centos2 bash+[INFO]   * No containers running, skipping Section 5
  
-[root@aaed3bc8e404 /]# ping centos3 +[INFO6 - Docker Security Operations 
-pingcentos3: Name or service not known+[INFO] 6.1 - Ensure that image sprawl is avoided (Manual) 
 +[INFO]      * There are currently4 images 
 +[INFO]      * Only 0 out of 4 are in use 
 +[INFO] 6.2 - Ensure that container sprawl is avoided (Manual) 
 +[INFO]      * There are currently a total of 0 containers, with 0 of them currently running
  
-[root@aaed3bc8e404 /]# ping 172.17.0.2 +[INFO7 - Docker Swarm Configuration 
-PING 172.17.0.2 (172.17.0.2) 56(84bytes of data. +[WARN] 7.1 - Ensure swarm mode is not Enabled, if not needed (Automated) 
-64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.054 ms +[PASS] 7.2 - Ensure that the minimum number of manager nodes have been created in a swarm (Automated) (Swarm mode not enabled
-64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.035 ms +[PASS] 7.3 - Ensure that swarm services are bound to a specific host interface (Automated) (Swarm mode not enabled) 
-64 bytes from 172.17.0.2: icmp_seq=ttl=64 time=0.051 ms +[PASS] 7.4 - Ensure that all Docker swarm overlay networks are encrypted (Automated) 
-64 bytes from 172.17.0.2: icmp_seq=ttl=64 time=0.071 ms +[PASS] 7.5 Ensure that Docker's secret management commands are used for managing secrets in a swarm cluster (Manual) (Swarm mode not enabled) 
-^C +[PASS] 7.6 Ensure that swarm manager is run in auto-lock mode (Automated) (Swarm mode not enabled) 
---- 172.17.0.2 ping statistics --- +[PASS] 7.Ensure that the swarm manager auto-lock key is rotated periodically (Manual) (Swarm mode not enabled) 
-4 packets transmitted, 4 received, 0% packet loss, time 2997ms +[PASS] 7.8 Ensure that node certificates are rotated as appropriate (Manual) (Swarm mode not enabled) 
-rtt min/avg/max/mdev = 0.035/0.052/0.071/0.015 ms+[PASS] 7.9 - Ensure that CA certificates are rotated as appropriate (Manual) (Swarm mode not enabled) 
 +[PASS] 7.10 - Ensure that management plane traffic is separated from data plane traffic (Manual) (Swarm mode not enabled)
  
-[root@aaed3bc8e404 /]#  
-</code> 
  
-Dans le cas ci-dessus, **centos2** peut atteindre **centos3** en utilisant l'adresse IP **172.17.0.2** car **centos2** se trouve dans les deux réseaux avec les adresses IP 172.17.0.4 et 172.25.0.3  :+Section C Score
  
-<code> +[INFOChecks86 
-[root@aaed3bc8e404 /]# exit +[INFO] Score: 1
-exit +
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos2 +
-172.17.0.4172.25.0.3+
 </code> </code>
  
-====1.2 - Host====+Ce script sert à automatiser le contrôle des points précédemment cités et produit un rapport contenant des annotations :
  
-Ce type de réseau est utilisé dans le cas où le réseau ne doit pas être isolé de l'hôte tout en isolant les autres aspects du conteneur. Les conteneurs utilisent la même interface que l'hôte en prenant la même adresse IP que la machine hôte.+  * **[PASS]** : Concerne les points qui n'ont pas besoin d'être modifiés, 
 +  * **[WARN]** : Concerne les points qui **doivent** être modifiés, 
 +  * **[INFO]** : Concerne les points qui doivent être passés en revue selon les besoins de votre configuration, 
 +  * **[NOTE]** : Vous informe d'un **best practice**.
  
-Dans le cas de la machine virtuelle, l'adresse IP de l'interface connectée au réseau local est **10.0.2.60** :+=====LAB #4 - Sécurisation de la Configuration de l'Hôte Docker=====
  
-<code> +Lors de l'exécution du scriptvous devez obtenir un résultat similaire à ceci en ce qui concerne la Sécurité de la Configuration de l'hôte Docker :
-root@debian9:~# ip addr show ens18 +
-2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 +
-    link/ether 08:00:27:2e:77:01 brd ff:ff:ff:ff:ff:ff +
-    inet 10.0.2.60/24 brd 10.0.2.255 scope global dynamic ens18 +
-       valid_lft 83772sec preferred_lft 83772sec +
-    inet6 fe80::a00:27ff:fe2e:7701/64 scope link  +
-       valid_lft forever preferred_lft forever +
-</code>+
  
-Démarrez un conteneur à partir de l'image **centos** dans un réseau de type **host** :+<file> 
 +... 
 +[INFO] 1 - Host Configuration 
 +[INFO] 1.1 - Linux Hosts Specific Configuration 
 +[WARN] 1.1.1 - Ensure a separate partition for containers has been created (Automated) 
 +[INFO] 1.1.2 - Ensure only trusted users are allowed to control Docker daemon (Automated) 
 +[INFO]       Users: trainee 
 +[WARN] 1.1.3 - Ensure auditing is configured for the Docker daemon (Automated) 
 +[WARN] 1.1.4 - Ensure auditing is configured for Docker files and directories -/run/containerd (Automated) 
 +[WARN] 1.1.5 - Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated) 
 +[WARN] 1.1.6 - Ensure auditing is configured for Docker files and directories - /etc/docker (Automated) 
 +[WARN] 1.1.7 - Ensure auditing is configured for Docker files and directories - docker.service (Automated) 
 +[INFO] 1.1.8 - Ensure auditing is configured for Docker files and directories - containerd.sock (Automated) 
 +[INFO]        File not found 
 +[WARN] 1.1.9 - Ensure auditing is configured for Docker files and directories - docker.socket (Automated) 
 +[WARN] 1.1.10 - Ensure auditing is configured for Docker files and directories - /etc/default/docker (Automated) 
 +[INFO] 1.1.11 - Ensure auditing is configured for Dockerfiles and directories - /etc/docker/daemon.json (Automated) 
 +[INFO]        File not found 
 +[WARN] 1.1.12 - 1.1.12 Ensure auditing is configured for Dockerfiles and directories - /etc/containerd/config.toml (Automated) 
 +[INFO] 1.1.13 - Ensure auditing is configured for Docker files and directories - /etc/sysconfig/docker (Automated) 
 +[INFO]        File not found 
 +[WARN] 1.1.14 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated) 
 +[WARN] 1.1.15 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated) 
 +[INFO] 1.1.16 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v1 (Automated) 
 +[INFO]         File not found 
 +[INFO] 1.1.17 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v2 (Automated) 
 +[INFO]         File not found 
 +[WARN] 1.1.18 - Ensure auditing is configured for Docker files and directories - /usr/bin/runc (Automated) 
 +[INFO] 1.2 - General Configuration 
 +[NOTE] 1.2.1 - Ensure the container host has been Hardened (Manual) 
 +[PASS] 1.2.2 - Ensure that the version of Docker is up to date (Manual) 
 +[INFO]        Using 19.03.4, verify is it up to date as deemed necessary 
 +... 
 +</file>
  
-<code> +Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**.
-root@debian9:~# docker run -it --rm --network host --name centos3 centos bash +
-[root@debian9 /]# ip a +
-1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 +
-    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 +
-    inet 127.0.0.1/8 scope host lo +
-       valid_lft forever preferred_lft forever +
-    inet6 ::1/128 scope host  +
-       valid_lft forever preferred_lft forever +
-2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 +
-    link/ether 08:00:27:2e:77:01 brd ff:ff:ff:ff:ff:ff +
-    inet 10.0.2.60/24 brd 10.0.2.255 scope global dynamic ens18 +
-       valid_lft 82102sec preferred_lft 82102sec +
-    inet6 fe80::a00:27ff:fe2e:7701/64 scope link  +
-       valid_lft forever preferred_lft forever +
-3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default  +
-    link/ether 02:42:38:f1:e7:ee brd ff:ff:ff:ff:ff:ff +
-    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 +
-       valid_lft forever preferred_lft forever +
-    inet6 fe80::42:38ff:fef1:e7ee/64 scope link  +
-       valid_lft forever preferred_lft forever +
-[root@debian9 /]# hostname +
-debian9 +
-[root@debian9 /]# exit +
-</code>+
  
-Le but de ce type de réseau est de permettre l'accès à des services dans le conteneur directement à partir de l'adresse IP de l'hôte DockerPar exemple, un nginx dans le conteneur pourrait être joint directement sur 10.0.2.60:80 **sans** avoir besoin de passer par l'exposition du port+====[WARN] 1.1.1 - Ensure a separate partition for containers has been created (Automated)====
  
-Pour cette raison, dans le cas de l'option **-p** utilisé dans la cas du réseau **host**, cette option n'est pas prise en compte et produit l'avertissement **WARNING: Published ports are discarded when using host network mode**. L'utilité majeure donc du réseau **host** se trouve dans le cas où de multiples ports dans le conteneur doivent être joignables.+Par défauttous les fichiers de Docker sont stockés dans le répertoire **/var/lib/docker**, y compris toutes les images, tous les conteneurs et tous les volumes. Sur un système hôte n'ayant qu'une seule partition il y a un risque, tous comme le risque lié au répertoire **/var/log/**, que le disque devient saturé.
  
-<WRAP center round important 50%> +====[WARN] 1.1.3 - Ensure auditing is configured for the Docker daemon (Automated)====
-**Important** : Notez  que le réseau de type **host** ne fonctionne que sous LinuxIl est donc incompatible avec Docker Desktop pour Mac, Docker Desktop pour Windows et Docker EE pour Windows Server. +
-</WRAP>+
  
-====1.None====+<file> 
 +[WARN] 1.1.4 - Ensure auditing is configured for Docker files and directories -/run/containerd (Automated) 
 +[WARN] 1.1.5 - Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated) 
 +[WARN] 1.1.6 - Ensure auditing is configured for Docker files and directories - /etc/docker (Automated) 
 +[WARN] 1.1.7 - Ensure auditing is configured for Docker files and directories - docker.service (Automated) 
 +[WARN] 1.1.9 - Ensure auditing is configured for Docker files and directories - docker.socket (Automated) 
 +[WARN] 1.1.10 - Ensure auditing is configured for Docker files and directories - /etc/default/docker (Automated) 
 +[WARN] 1.1.12 - Ensure auditing is configured for Dockerfiles and directories - /etc/containerd/config.toml (Automated) 
 +[WARN] 1.1.14 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated) 
 +[WARN] 1.1.15 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated) 
 +[WARN] 1.1.18 - Ensure auditing is configured for Docker files and directories /usr/bin/runc (Automated) 
 +</file>
  
-Ce type de réseau est utilisé principalement dans le cas de l'utilisation d'un plugin réseau disponible dans le **[[https://hub.docker.com/search/?category=network&q=&type=plugin|Docker Hub]]**.+Ces avertissements sont présents parce que **auditd** n'est pas installé et parce qu'il n'y a pas de règles spécifiques au daemon Docker et ses répertoires et fichiers associés
  
-Il est donc possible de lancer un conteneur totalement étanche grâce au réseau **none** :+Editez le fichier **/etc/apt/sources.list** selon l'exemple suivant :
  
 <code> <code>
-root@718e7eab814f:/# exit +root@manager:~/docker-bench-security# vi /etc/apt/sources.list
-exit +
-root@debian9:~# docker stop mongo2 +
-mongo2 +
-root@debian9:~# docker rm mongo2 +
-mongo2 +
-root@debian9:~# docker run -it --name mongo2 --network none i2tch/mongodb2 bash +
-root@332aa9930f30:/#  +
-</code>+
  
-====1.Lancer Wordpress dans un container====+root@manager:~/docker-bench-security# cat /etc/apt/sources.list 
 +deb http://archive.debian.org/debian/ stretch main 
 +deb-src http://archive.debian.org/debian/ stretch main 
 +deb http://archive.debian.org/debian-security stretch/updates main 
 +deb-src http://archive.debian.org/debian-security stretch/updates main 
 +deb [arch=amd64] https://download.docker.com/linux/debian stretch stable 
 +</code>
  
-Créez le répertoire ~/wordpress et placez-vous dedans :+Exécutez la commande **apt-update** :
  
 <code> <code>
-root@debian9:~# mkdir ~/wordpress && cd ~/wordpress+root@manager:~/docker-bench-securityapt update 
 +Ign:1 http://archive.debian.org/debian stretch InRelease 
 +Atteint:2 http://archive.debian.org/debian-security stretch/updates InRelease 
 +Atteint:3 http://archive.debian.org/debian stretch Release 
 +Réception de:4 https://download.docker.com/linux/debian stretch InRelease [44,8 kB] 
 +44,8 ko réceptionnés en 0s (107 ko/s)                      
 +Lecture des listes de paquets... Fait 
 +Construction de l'arbre des dépendances        
 +Lecture des informations d'état... Fait 
 +254 packages can be upgraded. Run 'apt list --upgradable' to see them.
 </code> </code>
  
-Créez un conteneur dénommé **wordpressdb** à partir de l'image **mariadb:latest** :+Pour installer auditd, utilisez **apt-get** : 
  
 <code> <code>
-root@debian9:~/wordpress# docker run -e MYSQL_ROOT_PASSWORD=fenestros -e MYSQL_DATABASE=wordpress --name wordpressdb -v "$PWD/database":/var/lib/mysql -d mariadb:latest +root@manager:~/docker-bench-security# apt-get install auditd -y
-Unable to find image 'mariadb:latest' locally +
-latest: Pulling from library/mariadb +
-f2b6b4884fc8: Pull complete  +
-26d8bdca4f3e: Pull complete  +
-74f09e820cce: Pull complete  +
-5390f1fe4554: Pull complete  +
-3d3f1706a741: Pull complete  +
-2942f66426ea: Pull complete  +
-97ee11d39c75: Pull complete  +
-590c46ef722b: Pull complete  +
-32eb4b9666e5: Pull complete  +
-fc883f98a064: Pull complete  +
-bb8bee61bc1e: Pull complete  +
-Digest: sha256:6135f5b851e7fe263dcf0edf3480cdab1ab28c4287e867c5d83fbe967412ea14 +
-Status: Downloaded newer image for mariadb:latest +
-67831dacf002bdc21dc79b0e8483f538235d00ddd2e8aae175ef3ebf189ae14d+
 </code> </code>
  
-Vérifiez que le conteneur fonctionne :+Modifiez ensuite le fichier **/etc/audit/rules.d/audit.rules** :
  
 <code> <code>
-root@debian9:~/wordpress# docker ps +root@manager:~/docker-bench-security# vi /etc/audit/rules.d/audit.rules 
-CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES + 
-67831dacf002        mariadb:latest      "docker-entrypoint.s…"   About a minute ago   Up 45 seconds       3306/tcp            wordpressdb+root@manager:~/docker-bench-security# cat /etc/audit/rules.d/audit.rules 
 +## First rule - delete all 
 +-D 
 + 
 +## Increase the buffers to survive stress events. 
 +## Make this bigger for busy systems 
 +-b 8192 
 + 
 +## This determine how long to wait in burst of events 
 +--backlog_wait_time 0 
 + 
 +## Set failure mode to syslog 
 +-f 1 
 + 
 +##Docker 
 +-w /usr/bin/docker -p wa 
 +-w /var/lib/docker -p wa 
 +-w /etc/docker -p wa 
 +-w /lib/systemd/system/docker.service -p wa 
 +-w /lib/systemd/system/docker.socket -p wa 
 +-w /etc/default/docker -p wa 
 +-w /etc/docker/daemon.json -p wa 
 +-w /usr/bin/docker-containerd -p wa 
 +-w /usr/bin/docker-runc -p wa 
 +-w /usr/bin/containerd -p wa 
 +-w /run/containerd -p wa 
 +-w /etc/containerd/config.toml -p wa 
 +-w /usr/bin/containerd-shim -p wa 
 +-w /usr/bin/runc -p wa
 </code> </code>
  
-Créez un conteneur appellé **wordpress** lié au conteneur wordpressdb :+<WRAP center round important 50%> 
 +**Important** : L'option **-w** indique **watch** et concerne le fichier qui suit. L'option **-p** journalise les modifications éventuelles. 
 +</WRAP> 
 + 
 +Re-démarrez ensuite auditd :
  
 <code> <code>
-root@debian9:~/wordpress# docker run -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=fenestros --name wordpress --link wordpressdb:mysql -p 10.0.2.60:80:80 -v "$PWD/html":/var/www/html -d wordpress +root@manager:~/docker-bench-security# systemctl restart auditd
-Unable to find image 'wordpress:latest' locally +
-latest: Pulling from library/wordpress +
-2a72cbf407d6: Pull complete  +
-273cd543cb15: Pull complete  +
-ec5ac8875de7: Pull complete  +
-9106e19b56c1: Pull complete  +
-ee2f70ac7c7d: Pull complete  +
-7257ad6985e8: Pull complete  +
-18f5c2055da2: Pull complete  +
-85293a6fdd80: Pull complete  +
-9e797eeb0c14: Pull complete  +
-f16178842884: Pull complete  +
-13899c06d3f8: Pull complete  +
-70c27fe4c3c5: Pull complete  +
-d32c8ad2d9d7: Pull complete  +
-07fe445494e6: Pull complete  +
-63b8de7b32fe: Pull complete  +
-e4b721952e22: Pull complete  +
-d9ede6dd6f74: Pull complete  +
-0af4f74bfd92: Pull complete  +
-e4e7c47b969f: Pull complete  +
-69aff47f3112: Pull complete  +
-Digest: sha256:201d004f55669dd2c0884f00fc44145fb0da8cafa465bf22cbaacecaf81138d4 +
-Status: Downloaded newer image for wordpress:latest +
-9eb2f7fbfbd25307ed2f463c7eb3bef40bfa556174e68750bb76b8d032546129+
 </code> </code>
  
-Vérifiez que le conteneur fonctionne :+Vérifiez ensuite la prise en charge des règles :
  
 <code> <code>
-root@debian9:~/wordpress# docker ps +root@manager:~/docker-bench-securitycat /etc/audit/audit.rules 
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES +## This file is automatically generated from /etc/audit/rules.d 
-9eb2f7fbfbd2        wordpress           "docker-entrypoint.s…"   2 minutes ago       Up About a minute   10.0.2.60:80->80/tcp   wordpress +-D 
-67831dacf002        mariadb:latest      "docker-entrypoint.s…"   9 minutes ago       Up 8 minutes        3306/tcp               wordpressdb+-b 8192 
 +-f 1 
 +--backlog_wait_time 0 
 +-w /usr/bin/docker -p wa 
 +-w /var/lib/docker -p wa 
 +-w /etc/docker -p wa 
 +-w /lib/systemd/system/docker.service -p wa 
 +-w /lib/systemd/system/docker.socket -p wa 
 +-w /etc/default/docker -p wa 
 +-w /etc/docker/daemon.json -p wa 
 +-w /usr/bin/docker-containerd -p wa 
 +-w /usr/bin/docker-runc -p wa 
 +-w /usr/bin/containerd -p wa 
 +-w /run/containerd -p wa 
 +-w /etc/containerd/config.toml -p wa 
 +-w /usr/bin/containerd-shim -p wa 
 +-w /usr/bin/runc -p wa
 </code> </code>
  
-Vérifiez que le Wordpress fonctionne :+<WRAP center round important 50%> 
 +**Important** - Pour plus d'information concernant la création de règles personalisées avec auditd, consultez cette **[[https://www.linux.com/tutorials/customized-file-monitoring-auditd/|page]]**. 
 +</WRAP> 
 + 
 +Ré-exécutez le script **Docker Benchmark Security** :
  
 <code> <code>
-root@debian9:~/wordpresslynx --dump http://10.0.2.60 +root@manager:~/docker-bench-security./docker-bench-security.sh  
-   [1]WordPress +... 
-   Select a default language [English (United States)________]+[PASS] 1.1.4 - Ensure auditing is configured for Docker files and directories -/run/containerd (Automated) 
 +[PASS] 1.1.5 - Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated) 
 +[PASS] 1.1.6 - Ensure auditing is configured for Docker files and directories - /etc/docker (Automated) 
 +[PASS] 1.1.7 - Ensure auditing is configured for Docker files and directories - docker.service (Automated) 
 +[PASS1.1.9 - Ensure auditing is configured for Docker files and directories - docker.socket (Automated) 
 +[PASS] 1.1.10 - Ensure auditing is configured for Docker files and directories - /etc/default/docker (Automated) 
 +[PASS] 1.1.12 - Ensure auditing is configured for Dockerfiles and directories - /etc/containerd/config.toml (Automated) 
 +[PASS1.1.14 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated) 
 +[PASS] 1.1.15 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated) 
 +[PASS] 1.1.18 - Ensure auditing is configured for Docker files and directories - /usr/bin/runc (Automated) 
 +... 
 +</code>
  
-   Continue+=====LAB #5 - Sécurisation de la Configuration du daemon Docker=====
  
-References+Exécutez de nouveau le script **docker-bench-security.sh**. Vous devez obtenir un résultat similaire à ceci en ce qui concerne la sécurité de la configuration du daemon Docker :
  
-   1. https://wordpress.org/+<file> 
 +... 
 +[INFO] 2 - Docker daemon configuration 
 +[NOTE] 2.- Run the Docker daemon as a non-root user, if possible (Manual) 
 +[WARN] 2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored) 
 +[PASS] 2.3 - Ensure the logging level is set to 'info' (Scored) 
 +[PASS] 2.4 - Ensure Docker is allowed to make changes to iptables (Scored) 
 +[PASS] 2.5 - Ensure insecure registries are not used (Scored) 
 +[PASS] 2.6 - Ensure aufs storage driver is not used (Scored) 
 +[INFO] 2.7 - Ensure TLS authentication for Docker daemon is configured (Scored) 
 +[INFO]      * Docker daemon not listening on TCP 
 +[INFO] 2.8 - Ensure the default ulimit is configured appropriately (Manual) 
 +[INFO]      * Default ulimit doesn't appear to be set 
 +[WARN] 2.9 - Enable user namespace support (Scored) 
 +[PASS] 2.10 - Ensure the default cgroup usage has been confirmed (Scored) 
 +[PASS] 2.11 - Ensure base device size is not changed until needed (Scored) 
 +[WARN] 2.12 - Ensure that authorization for Docker client commands is enabled (Scored) 
 +[WARN] 2.13 - Ensure centralized and remote logging is configured (Scored) 
 +[WARN] 2.14 - Ensure containers are restricted from acquiring new privileges (Scored) 
 +[WARN] 2.15 - Ensure live restore is enabled (Scored) 
 +[WARN] 2.16 - Ensure Userland Proxy is Disabled (Scored) 
 +[PASS] 2.17 - Ensure that a daemon-wide custom seccomp profile is applied if appropriate (Manual) 
 +[PASS] 2.18 - Ensure that experimental features are not implemented in production (Scored) 
 +... 
 +</file>
  
-root@debian9:~/wordpress# docker inspect wordpress | grep IPAddress +Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**.
-            "SecondaryIPAddresses": null, +
-            "IPAddress": "172.17.0.3", +
-                    "IPAddress": "172.17.0.3", +
-                     +
-root@debian9:~/wordpress# lynx --dump http://172.17.0.3 +
-   [1]WordPress +
-   Select a default language [English (United States)________]+
  
-   Continue+====[WARN] 2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored)====
  
-References+Par défaut Docker permet un trafic réseau sans restrictions entre des conteneurs sur le même hôte. Il est cependant possible de modifier la configuration par défaut. Pour empêcher ceci, il faut fixer la valeur de **icc** à **false**. De cette façon, docker crée des conteneurs qui peuvent communiquer entre eux **uniquement** s'il existe un lien.
  
-   1. https://wordpress.org/ +Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/userguide/networking/|page]]**.
-</code>+
  
-====1.Gestion d'une Architecture de Microservices====+====[WARN] 2.Enable user namespace support (Scored)====
  
-Vous allez mettre en place une application simple sous forme de microservicesdéveloppé par Docker et appelé **demo-voting-app**,  :+Cet avertissement nous indique que l'utilisation des **user namespaces** n'est pas activée. Le support des **user namespaces** du noyau Linux permet d'attribuer une plage d'UIDs et de GIDs unique à un processus et donc à un conteneuren dehors de la plage traditionnelle utilisée par l'hôte Docker. L'avantage ici est que les processus ayant l'UID de root dans le conteneur seront mappés à un UID sans privilèges dans l'hôte Docker. Pour utiliser user namespace, il faut fixer la valeur de **userns-remap** à **default**. Dans ce cas précis Docker crée un utilisateur dénommé **dockremap**. Notez qu'il est aussi possible de fixer vos propres valeurs avec **"userns-remap""user:group"**.
  
-{{ :elearning:workbooks:debian:6:avance:app.png?direct&400 |}}+Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/security/userns-remap/|page]]**.
  
-Dans cette application le conteneur **voting-app** permet de voter pour des **chats** ou des **chiens**Cette application tourne sous Python et fournit une interface HTML :+====[WARN] 2.12 - Ensure that authorization for Docker client commands is enabled (Scored)====
  
-{{ :elearning:workbooks:debian:6:avance:kubernetes15.png?direct&800 |}}+Par défaut, Docker permet un accès sans restrictions aux daemon DockerIl est possible de restreindre l'accès à des utilisateurs authentifiés en utilisant un plug-in. Cette ligne est sans importance parce que l'accès au socket local Docker est limité aux membres du groupe **docker** (voir DOF202 - La Sécurité de la Configuration de l'Hôte Docker)
  
-Lors de la votele résultat de celle-ci est stocké dans **Redis** dans une base de données en mémoireLe résultat est ensuite passé au conteneur **Worker** qui tourne sous .NET et qui met à jour la base de données persistante dans le conteneur **db** qui tourne sous PostgreSQL.+Pour plus d'informationsconsultez cette **[[https://docs.docker.com/engine/extend/plugins_authorization/|page]]**.
  
-L'application **result-app** qui tourne sous NodeJS lit ensuite la table dans la base de données PostgreSQL et affiche le résultat sous forme HTML :+====[WARN] 2.13 Ensure centralized and remote logging is configured (Scored)====
  
-{{ :elearning:workbooks:debian:6:avance:kubernetes16.png?direct&800 |}}+Cet avertissement indique que la configuration de rsyslog ne permet pas l'envoie des traces vers un serveur de journalisation distant. Elle indique aussi que la valeur de **log-driver** n'a pas été spécifiée. Pour activer cette configuration, il faut fixer la valeur de **log-driver** à **syslog** puis configurer **syslog** ainsi que la valeur de **log-opts** correctement.
  
-Cette application peut être mise en place sous docker avec les commandes suivantes :+Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/admin/logging/overview/|page]]**.
  
-<code> +====[WARN] 2.14 Ensure containers are restricted from acquiring new privileges (Scored)====
-docker run -d --name=redis redis +
-docker run -d --name=db -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres postgres:9.4  +
-docker run -d --name=vote -p 5000:80 --link redis:redis dockersamples/examplevotingapp_vote +
-docker run -d --name=result -p 5001:80 --link db:db dockersamples/examplevotingapp_result +
-docker run -d --name=worker --link db:db --link redis:redis dockersamples/examplevotingapp_worker +
-</code>+
  
-Cette solution utilise un réseau de type Bridge. Ce type de réseau est limité aux conteneurs d'un hôte unique exécutant Docker. Les conteneurs ne peuvent communiquer qu'entre eux et ils ne sont pas accessibles depuis l'extérieur. Pour que les conteneurs sur le réseau puissent communiquer ou être accessibles du monde extérieur, il faut configurer le mappage de port.+Par défaut un conteneur peut obtenir une escalade de privilèges en utilisant les binaires setuid ou setgid. Pour interdire ceci il faut fixer la valeur de **no-new-privileges** à **true**.
  
-Ouvrez le navigateur web **Firefox** ou **Chrome** dans **votre** machine et saisissez l'URL selon le tableau ci-dessous :+Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/userguide/networking/default_network/binding/|page]]**.
  
-^ ID ^ URL Notez http: et non https: ^  +====[WARN] 2.15 - Ensure live restore is enabled (Scored)====
-| Trainee10 | http://compute01.ittraining.network | +
-| Trainee11 | http://compute02.ittraining.network | +
-| Trainee12 | http://compute03.ittraining.network | +
-| Trainee13 | http://compute04.ittraining.network | +
-| Trainee14 | http://compute05.ittraining.network | +
-| Trainee15 | http://compute06.ittraining.network | +
-| Trainee16 | http://compute07.ittraining.network | +
-| Trainee17 | http://compute08.ittraining.network |  +
-| Trainee18 | http://compute09.ittraining.network | +
-| Trainee19 | http://compute10.ittraining.network | +
-| Trainee20 | http://compute01.ittraining.network | +
-| Trainee21 | http://compute02.ittraining.network | +
-| Trainee22 | http://compute03.ittraining.network | +
-| Trainee23 | http://compute04.ittraining.network | +
-| Trainee24 | http://compute05.ittraining.network | +
-| Trainee25 | http://compute06.ittraining.network | +
-| Trainee26 | http://compute07.ittraining.network | +
-| Trainee27 | http://compute08.ittraining.network |  +
-| Trainee28 | http://compute09.ittraining.network | +
-| Trainee29 | http://compute10.ittraining.network |+
  
-Dans la boîte de connexion d'Apache Guacamole, entrez votre ID **traineeXX** et le mot de passe qui vous a été fourni par votre formateur+L'option --live-restore permet une prise en charge complète des conteneurs sans démon dans Docker. Elle garantit que Docker n'arrête pas les conteneurs lors de l'arrêt ou de la restauration et qu'il se reconnecte correctement au conteneur lors du redémarrage.
  
-Cliquez sur la connexion **TraineeXX_VNC** et testez ensuite votre application en utilisant le navigateur web de la machine virtuelle.+====[WARN] 2.16 - Ensure Userland Proxy is Disabled (Scored)====
  
-=====LAB #2 - Gestion du Réseau overlay=====+Il existe deux méthodes pour qu'un conteneur puisse router vers l'extérieur :
  
-En plus des réseaux **bridge**, **host** et **none**, Docker propose deux autres types de réseaux, à savoir **overlay** et **macvlan**. Ce module concerne overlay. Pour plus d'informations concernant le type **macvlan**, consultez le site de la documentation de Docker **[[https://docs.docker.com/network/network-tutorial-macvlan/|ici]]**.+  le mode **Hairpin NAT**, 
 +  * **Userland Proxy**.
  
-Comme son nom indique, un réseau overlay est un réseau qui se positionne au-dessus du réseau des hôtes. Lors de la création d'un réseau overlaycelui-ci n'est disponible par défaut qu'aux services swarm. Par contre il est possible de connecter des conteneurs autonomes au réseau overlay si l'option **--attachable** est spécifiée lors de sa création. Ce type d'utilisation du réseau overlay n'est pas recommandé par Docker qui dit que le support de cette fonctionnalité pourrait être retiré. +Il est préférable d'utiliser le mode Hairpin NAT qui peut utilise Iptables et qui possède de meilleures performances. La plupart des systèmes d'opération modernes peuvent utiliser le mode Hairpin NAT. Pour désactiver Userland Proxy, il faut fixer la valeur de **userland-proxy** à **false**.
-  +
-Le trafic lié à la gestion des services swarm est crypté par défaut avec l’algorithme AES en mode GCM. Afin de crypter le trafic des données liées aux applications il est possible d'utiliser l'option **--opt encrypted** lors de la création du réseau overlay. Dans ce cas, Docker crée des tunnels IPSEC entre chaque nœud qui utilise le même algorithme que le trafic des services swarm. Il y a donc une dégradation des performances à évaluer avant la mise en production. Dans les deux cas les clefs sont modifiées toutes les 12 heures (voir [[https://www.vaultproject.io/docs/internals/rotation.html]])+
  
-<WRAP center round important 60%> +Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/userguide/networking/default_network/binding/|page]]**.
-**ATTENTION** : Le cryptage des données liées aux applications n'est pas compatible avec Windows(tm)Lors de la connexion du nœud Windows(tm) à un réseau overlay crypté, aucune erreur ne sera rapportéePar contre le nœud sera incapable de communiquer. +
-</WRAP>+
  
-Commencez par re-créer un swarm en utilisant les machines virtuelles **manager**, **worker1** et **worker2** :+====5.1 Le Fichier /etc/docker/daemon.json ==== 
 + 
 +Créez le fichier **/etc/docker/daemon.json** : 
  
 <code> <code>
-trainee@traineeXX:~$ ssh -l trainee 10.0.2.62 +root@manager:~/docker-bench-securityvi /etc/docker/daemon.json
-... +
-root@manager:~docker swarm leave +
-Node left the swarm. +
-root@manager:~# docker swarm init --advertise-addr 10.0.2.62 +
-Swarm initialized: current node (tpn1zsk20sfsfafmk2cvefqjc) is now a manager.+
  
-To add a worker to this swarmrun the following command:+root@manager:~/docker-bench-security# cat /etc/docker/daemon.json 
 +
 +    "icc": false, 
 +    "userns-remap": "default", 
 +    "log-driver": "syslog", 
 +    "live-restore": true, 
 +    "userland-proxy": false, 
 +    "no-new-privileges"true 
 +
 +</code>
  
-    docker swarm join --token SWMTKN-1-23d7n1fkkk9rvlhty106q9390bfpf9daljjguq3s807le6c5qs-e0s1yqsajvmi7s8t9l9mw48ao 10.0.2.62:2377+Re-démarrez le service Docker :
  
-To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. +<code> 
-root@manager:~# exit +root@manager:~/docker-bench-securitysystemctl restart docker
-trainee@manager:~# exit+
 </code> </code>
  
-ou+Vérifiez la présence de l'utilisateur dénommé **dockremap** :
  
 <code> <code>
-trainee@traineeXX:~$ ssh -l trainee 10.0.2.42+root@manager:~/docker-bench-security# id dockremap 
 +uid=116(dockremap) gid=121(dockremap) groupes=121(dockremap) 
 +</code> 
 + 
 +Ré-exécutez le script **Docker Benchmark Security** : 
 + 
 +<code> 
 +root@manager:~/docker-bench-security# ./docker-bench-security.sh 
 ... ...
-root@manager:~# docker swarm leave +[PASS] 2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored) 
-Node left the swarm+[PASS] 2.3 - Ensure the logging level is set to 'info' (Scored) 
-root@manager:~# docker swarm init --advertise-addr 10.0.2.42 +[PASS] 2.4 - Ensure Docker is allowed to make changes to iptables (Scored) 
-Swarm initialized: current node (tpn1zsk20sfsfafmk2cvefqjc) is now manager.+[PASS] 2.5 Ensure insecure registries are not used (Scored) 
 +[PASS] 2.6 Ensure aufs storage driver is not used (Scored) 
 +[PASS] 2.9 Enable user namespace support (Scored) 
 +[PASS] 2.10 - Ensure the default cgroup usage has been confirmed (Scored) 
 +[PASS] 2.11 - Ensure base device size is not changed until needed (Scored) 
 +[PASS] 2.13 - Ensure centralized and remote logging is configured (Scored) 
 +[PASS] 2.14 - Ensure containers are restricted from acquiring new privileges (Scored) 
 +[PASS] 2.15 - Ensure live restore is enabled (Scored) 
 +[PASS] 2.16 - Ensure Userland Proxy is Disabled (Scored) 
 +[PASS] 2.17 - Ensure that daemon-wide custom seccomp profile is applied if appropriate (Manual) 
 +[PASS] 2.18 - Ensure that experimental features are not implemented in production (Scored) 
 +... 
 +</code>
  
-To add a worker to this swarmrun the following command:+Pour plus d'informationsconsultez cette **[[https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file/|page]]**.
  
-    docker swarm join --token SWMTKN-1-23d7n1fkkk9rvlhty106q9390bfpf9daljjguq3s807le6c5qs-e0s1yqsajvmi7s8t9l9mw48ao 10.0.2.42:2377+=====LAB #6 Sécurisation des Images et les Fichiers de Construction=====
  
-To add a manager to this swarm, run 'docker swarm join-token managerand follow the instructions+Créez le conteneur mysql : 
-root@manager:~# exit + 
-trainee@manager:~# exit+<code> 
 +root@manager:~/docker-bench-security# apt install  --only-upgrade docker-ce 
 +Lecture des listes de paquets... Fait 
 +Construction de l'arbre des dépendances        
 +Lecture des informations d'état... Fait 
 +Le paquet suivant a été installé automatiquement et n'est plus nécessaire : 
 +  libsasl2-modules 
 +Veuillez utiliser « apt autoremove » pour le supprimer. 
 +Les paquets suivants seront mis à jour : 
 +  docker-ce 
 +1 mis à jour, 0 nouvellement installés, 0 à enlever et 252 non mis à jour. 
 +Il est nécessaire de prendre 22,7 Mo dans les archives. 
 +Après cette opération, 497 ko d'espace disque supplémentaires seront utilisés. 
 +Réception de:1 https://download.docker.com/linux/debian stretch/stable amd64 docker-ce amd64 5:19.03.15~3-0~debian-stretch [22,7 MB] 
 +22,7 Mo réceptionnés en 0s (26,0 Mo/s) 
 +Lecture des fichiers de modifications (« changelog »)... Terminé 
 +(Lecture de la base de données... 112865 fichiers et répertoires déjà installés.) 
 +Préparation du dépaquetage de .../docker-ce_5%3a19.03.15~3-0~debian-stretch_amd64.deb ... 
 +Dépaquetage de docker-ce (5:19.03.15~3-0~debian-stretch) sur (5:19.03.4~3-0~debian-stretch) ... 
 +Paramétrage de docker-ce (5:19.03.15~3-0~debian-stretch) ... 
 +Traitement des actions différées (« triggers ») pour systemd (232-25+deb9u14) ... 
 + 
 +root@manager:~/docker-bench-securitydocker container run -d --name mysql -e MYSQL_ROOT_PASSWORD=password mysql 
 +Unable to find image 'mysql:latest' locally 
 +latest: Pulling from library/mysql 
 +e9f2695d7e5b: Pull complete  
 +80c6055edb33: Pull complete  
 +c646ab461d8b: Pull complete  
 +012006c6a591: Pull complete  
 +929d5fa34b95: Pull complete  
 +17e0243877fa: Pull complete  
 +1850b459cd2f: Pull complete  
 +8dceaed53baf: Pull complete  
 +197b834ea1cd: Pull complete  
 +8df78c25b227: Pull complete  
 +Digest: sha256:ceb98918916bd5261b3e9866ac8271d75d276b8a4db56f1dc190770342a77a9b 
 +Status: Downloaded newer image for mysql:latest 
 +e503dd98f88992ae6ed5ec4dcaa2e18982ade8ec74966869515a120763418f74 
 + 
 +root@manager:~/docker-bench-securitydocker ps -a 
 +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES 
 +e503dd98f889        mysql               "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        3306/tcp, 33060/tcp   mysql
 </code> </code>
  
-Connectez-vous au **worker1** :+Exécutez de nouveau le script **docker-bench-security.sh**. Vous devez obtenir un résultat similaire à ceci en ce qui concerne la sécurité des images et les fichiers de leur construction :
  
 <code> <code>
-trainee@traineeXX:~$ ssh -l trainee 10.0.2.63+root@manager:~/docker-bench-security# ./docker-bench-security.sh 
 +... 
 +[INFO] 4 - Container Images and Build File 
 +[WARN] 4.1 - Ensure that a user for the container has been created (Automated) 
 +[WARN]      * Running as root: mysql 
 +[NOTE] 4.2 - Ensure that containers use only trusted base images (Manual) 
 +[NOTE] 4.3 - Ensure that unnecessary packages are not installed in the container (Manual) 
 +[NOTE] 4.4 - Ensure images are scanned and rebuilt to include security patches (Manual) 
 +[WARN] 4.5 - Ensure Content trust for Docker is Enabled (Automated) 
 +[WARN] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images (Automated) 
 +[WARN]      * No Healthcheck found: [mysql:latest] 
 +[PASS] 4.7 - Ensure update instructions are not used alone in the Dockerfile (Manual) 
 +[NOTE] 4.8 - Ensure setuid and setgid permissions are removed (Manual) 
 +[PASS] 4.9 - Ensure that COPY is used instead of ADD in Dockerfiles (Manual) 
 +[NOTE] 4.10 - Ensure secrets are not stored in Dockerfiles (Manual) 
 +[NOTE] 4.11 - Ensure only verified packages are installed (Manual) 
 +[NOTE] 4.12 - Ensure all signed artifacts are validated (Manual)
 ... ...
-root@worker1:~# docker swarm leave 
-Node left the swarm. 
-root@worker1:~# docker swarm join --token SWMTKN-1-23d7n1fkkk9rvlhty106q9390bfpf9daljjguq3s807le6c5qs-e0s1yqsajvmi7s8t9l9mw48ao 10.0.2.62:2377 
-This node joined a swarm as a worker. 
-root@worker1:~# exit 
-trainee@worker1:~# exit 
 </code> </code>
  
-ou+====[WARN] 4.1 - Ensure that a user for the container has been created (Automated)==== 
 + 
 +Les processus dans le conteneur **mysql** tourne sous l'UID de root. Ceci est l'action par défaut de Docker. 
 + 
 +Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/security/security/|page]]**. 
 + 
 +====[WARN] 4.5 - Ensure Content trust for Docker is Enabled (Automated)==== 
 + 
 +Cette ligne indique que le support de Content trust n'a pas été activé. Content trust permet de s'assurer de la provenance des images utilisées car celles-ci sont signées. 
 + 
 +Pour activer le Content trust, il faut positionner la valeur de la variable **DOCKER_CONTENT_TRUST** à **1** :
  
 <code> <code>
-trainee@traineeXX:~$ ssh -l trainee 10.0.2.43 +root@manager:~/docker-bench-security# echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment 
-... +DOCKER_CONTENT_TRUST=1 
-root@worker1:~# docker swarm leave + 
-Node left the swarm. +root@manager:~/docker-bench-securitysource /etc/environment
-root@worker1:~# docker swarm join --token SWMTKN-1-23d7n1fkkk9rvlhty106q9390bfpf9daljjguq3s807le6c5qs-e0s1yqsajvmi7s8t9l9mw48ao 10.0.2.42:2377 +
-This node joined swarm as a worker. +
-root@worker1:~# exit +
-trainee@worker1:~# exit+
 </code> </code>
  
-Connectez-vous au **worker2** :+Re-démarrez la machine virtuelle **Manager** et démarrez le conteneur **mysql** :
  
 <code> <code>
-trainee@traineeXX:~$ ssh -l trainee 10.0.2.64 +root@manager:~/docker-bench-security# reboot 
-... +Connection to 10.0.2.62 closed by remote host. 
-root@worker2:~# docker swarm leave +Connection to 10.0.2.62 closed. 
-Node left the swarm+ 
-root@worker2:~# docker swarm join --token SWMTKN-1-23d7n1fkkk9rvlhty106q9390bfpf9daljjguq3s807le6c5qs-e0s1yqsajvmi7s8t9l9mw48ao 10.0.2.62:2377 +root@debian11:~# ssh -l trainee 10.0.2.62 
-This node joined a swarm as a worker. +trainee@10.0.2.62's passwordtrainee 
-root@worker2:~# exit +Linux manager.i2tch.loc 4.9.0-8-amd64 #SMP Debian 4.9.130-2 (2018-10-27) x86_64 
-trainee@worker2:~# exit+ 
 +The programs included with the Debian GNU/Linux system are free software; 
 +the exact distribution terms for each program are described in the 
 +individual files in /usr/share/doc/*/copyright. 
 + 
 +Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent 
 +permitted by applicable law. 
 +Last login: Sun Dec 17 18:39:07 2023 from 10.0.2.46 
 + 
 +trainee@manager:~$ su - 
 +Mot de passe : fenestros 
 + 
 +root@manager:~# cd docker-bench-security/ 
 + 
 +root@manager:~/docker-bench-security# 
 + 
 +root@manager:~/docker-bench-security# docker start mysql 
 +mysql
 </code> </code>
  
-ou :+Exécutez de nouveau le script et notez le contenu de la section 4 :
  
 <code> <code>
-trainee@traineeXX:~$ ssh -l trainee 10.0.2.44+root@manager:~/docker-bench-security# ./docker-bench-security.sh 
 +... 
 +[INFO] 4 - Container Images and Build File 
 +[WARN] 4.1 - Ensure that a user for the container has been created (Automated) 
 +[WARN]      * Running as root: mysql 
 +[NOTE] 4.2 - Ensure that containers use only trusted base images (Manual) 
 +[NOTE] 4.3 - Ensure that unnecessary packages are not installed in the container (Manual) 
 +[NOTE] 4.4 - Ensure images are scanned and rebuilt to include security patches (Manual) 
 +[PASS] 4.5 - Ensure Content trust for Docker is Enabled (Automated) 
 +[WARN] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images (Automated) 
 +[WARN]      * No Healthcheck found: [mysql:latest] 
 +[PASS] 4.7 - Ensure update instructions are not used alone in the Dockerfile (Manual) 
 +[NOTE] 4.8 - Ensure setuid and setgid permissions are removed (Manual) 
 +[PASS] 4.9 - Ensure that COPY is used instead of ADD in Dockerfiles (Manual) 
 +[NOTE] 4.10 - Ensure secrets are not stored in Dockerfiles (Manual) 
 +[NOTE] 4.11 - Ensure only verified packages are installed (Manual) 
 +[NOTE] 4.12 - Ensure all signed artifacts are validated (Manual)
 ... ...
-root@worker2:~# docker swarm leave 
-Node left the swarm. 
-root@worker2:~# docker swarm join --token SWMTKN-1-23d7n1fkkk9rvlhty106q9390bfpf9daljjguq3s807le6c5qs-e0s1yqsajvmi7s8t9l9mw48ao 10.0.2.42:2377 
-This node joined a swarm as a worker. 
-root@worker2:~# exit 
-trainee@worker2:~# exit 
 </code> </code>
  
-Vérifiez l'état du swarm :+Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/security/trust/content_trust/|page]]**. 
 + 
 +====[WARN] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images==== 
 + 
 +Quand une image est construite il est possible d'y mettre un **HEALTHCHECK** dont le statut peut être vérifié par Docker afin de relancer le conteneur si nécessaire.  
 + 
 +Pour mettre en place un HEALTHCHECK, il conviendrait, par exemple, d'inclure la ligne suivante dans le fichier DOCKERFILE servant à construire l'image : 
 + 
 +<file> 
 +HEALTHCHECK --interval=20s --timeout=3s CMD curl -f http://localhost:8000/ || exit 1 
 +</file> 
 + 
 +Ce test permet de vérifier que le conteneur peut atteindre l'URL indiqué tous les 20 secondes et produit une erreur au bout de 3 secondes. 
 + 
 +Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/reference/builder/#healthcheck|page]]**. 
 + 
 +=====LAB #7 - Sécurisation du Container Runtime===== 
 + 
 +Exécutez de nouveau le script **docker-bench-security.sh**, vous devez obtenir un résultat similaire à ceci en ce qui concerne la sécurité du Container Runtime :
  
 <code> <code>
-trainee@traineeXX:~$ ssh -l trainee 10.0.2.62+root@manager:~/docker-bench-security# ./docker-bench-security.sh 
 +... 
 +[INFO] 5 - Container Runtime 
 +[WARN] 5.1 - Ensure that, if applicable, an AppArmor Profile is enabled (Automated) 
 +[WARN]      * No AppArmorProfile Found: mysql 
 +[WARN] 5.2 - Ensure that, if applicable, SELinux security options are set (Automated) 
 +[WARN]      * No SecurityOptions Found: mysql 
 +[PASS] 5.3 - Ensure that Linux kernel capabilities are restricted within containers (Automated) 
 +[PASS] 5.4 - Ensure that privileged containers are not used (Automated) 
 +[PASS] 5.5 - Ensure sensitive host system directories are not mounted on containers (Automated) 
 +[PASS] 5.6 - Ensure sshd is not run within containers (Automated) 
 +[PASS] 5.7 - Ensure privileged ports are not mapped within containers (Automated) 
 +[PASS] 5.8 - Ensure that only needed ports are open on the container (Manual) 
 +[PASS] 5.9 - Ensure that the host's network namespace is not shared (Automated) 
 +[WARN] 5.10 - Ensure that the memory usage for containers is limited (Automated) 
 +[WARN]       * Container running without memory restrictions: mysql 
 +[WARN] 5.11 - Ensure that CPU priority is set appropriately on containers (Automated) 
 +[WARN]       * Container running without CPU restrictions: mysql 
 +[WARN] 5.12 - Ensure that the container's root filesystem is mounted as read only (Automated) 
 +[WARN]       * Container running with root FS mounted R/W: mysql 
 +[PASS] 5.13 - Ensure that incoming container traffic is bound to a specific host interface (Automated) 
 +[WARN] 5.14 - Ensure that the 'on-failure' container restart policy is set to '5' (Automated) 
 +[WARN]       * MaximumRetryCount is not set to 5: mysql 
 +[PASS] 5.15 - Ensure that the host's process namespace is not shared (Automated) 
 +[PASS] 5.16 - Ensure that the host's IPC namespace is not shared (Automated) 
 +[PASS] 5.17 - Ensure that host devices are not directly exposed to containers (Manual) 
 +[INFO] 5.18 - Ensure that the default ulimit is overwritten at runtime if needed (Manual) 
 +[INFO]       * Container no default ulimit override: mysql 
 +[PASS] 5.19 - Ensure mount propagation mode is not set to shared (Automated) 
 +[PASS] 5.20 - Ensure that the host's UTS namespace is not shared (Automated) 
 +[PASS] 5.21 - Ensure the default seccomp profile is not Disabled (Automated) 
 +[NOTE] 5.22 - Ensure that docker exec commands are not used with the privileged option (Automated) 
 +[NOTE] 5.23 - Ensure that docker exec commands are not used with the user=root option (Manual) 
 +[PASS] 5.24 - Ensure that cgroup usage is confirmed (Automated) 
 +[PASS] 5.25 - Ensure that the container is restricted from acquiring additional privileges (Automated) 
 +[WARN] 5.26 - Ensure that container health is checked at runtime (Automated) 
 +[WARN]       * Health check not set: mysql 
 +[INFO] 5.27 - Ensure that Docker commands always make use of the latest version of their image (Manual) 
 +[WARN] 5.28 - Ensure that the PIDs cgroup limit is used (Automated) 
 +[WARN]       * PIDs limit not set: mysql 
 +[INFO] 5.29 - Ensure that Docker's default bridge 'docker0' is not used (Manual) 
 +[INFO]       * Container in docker0 network: mysql 
 +[PASS] 5.30 - Ensure that the host's user namespaces are not shared (Automated) 
 +[PASS] 5.31 - Ensure that the Docker socket is not mounted inside any containers (Automated)
 ... ...
-root@manager:~# docker node ls 
-ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION 
-b85hxlixbr1mh1txd1hrfe4us *   manager.i2tch.loc   Ready               Active              Leader              19.03.4 
-4sui75vvdhmet4qvt0zbvzlzl     worker1.i2tch.loc   Ready               Active                                  19.03.4 
-lbjtg5o9kw3x6xg7frm07jfuw     worker2.i2tch.loc   Ready               Active                                  19.03.4 
-root@manager:~# docker node ls --filter role=manager 
-ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION 
-b85hxlixbr1mh1txd1hrfe4us *   manager.i2tch.loc   Ready               Active              Leader              19.03.4 
-root@manager:~# docker node ls --filter role=worker 
-ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION 
-4sui75vvdhmet4qvt0zbvzlzl     worker1.i2tch.loc   Ready               Active                                  19.03.4 
-lbjtg5o9kw3x6xg7frm07jfuw     worker2.i2tch.loc   Ready               Active                                  19.03.4 
 </code> </code>
  
-ou :+Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**. 
 + 
 +====[WARN] 5.1 - Ensure that, if applicable, an AppArmor Profile is enabled (Automated)==== 
 + 
 +Cet avertissement est présent parce que le conteneur n'utilise pas AppArmor. 
 + 
 +Pour plus d'informations, consultez cette **[[https://cloud.google.com/container-optimized-os/docs/how-to/secure-apparmor|page]]**. 
 + 
 +====[WARN] 5.2 - Ensure that, if applicable, SELinux security options are set (Automated)==== 
 + 
 +Cet avertissement est présent parce que le conteneur n'utilise pas SELinux. 
 + 
 +Pour plus d'informations, consultez cette **[[https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_atomic_host/7/html/container_security_guide/docker_selinux_security_policy|page]]**. 
 + 
 +====[WARN] 5.10 - Ensure that the memory usage for containers is limited (Automated)==== 
 + 
 +Cet avertissement est du au fait que les conteneurs ont automatiquement accès à la totalité de la RAM de l'hôte Docker :
  
 <code> <code>
-trainee@traineeXX:~$ ssh -l trainee 10.0.2.42 +root@manager:~# docker run -d -p 8081:80 nginx 
-... +b04b2a6f0dd93da21a8b7640afc319406e42868a141f90936dbcf52ab5bffb0d 
-root@manager:~# docker node ls +root@manager:~# docker stats 
-ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION +CONTAINER ID        NAME                 CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS 
-b85hxlixbr1mh1txd1hrfe4us *   manager.i2tch.loc   Ready               Active              Leader              19.03.4 +b04b2a6f0dd9        dazzling_blackburn   0.00%               1.789MiB / 1.957GiB   0.09%               2.38kB / 0B         0B / 0B             2 
-4sui75vvdhmet4qvt0zbvzlzl     worker1.i2tch.loc   Ready               Active                                  19.03.4 +^C
-lbjtg5o9kw3x6xg7frm07jfuw     worker2.i2tch.loc   Ready               Active                                  19.03.4 +
-root@manager:~# docker node ls --filter role=manager +
-ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION +
-b85hxlixbr1mh1txd1hrfe4us *   manager.i2tch.loc   Ready               Active              Leader              19.03.+
-root@manager:~# docker node ls --filter role=worker +
-ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION +
-4sui75vvdhmet4qvt0zbvzlzl     worker1.i2tch.loc   Ready               Active                                  19.03.4 +
-lbjtg5o9kw3x6xg7frm07jfuw     worker2.i2tch.loc   Ready               Active                                  19.03.4+
 </code> </code>
  
-Vérifiez la présence du réseau overlay **ingress** ainsi que le réseau ponté **docker_gwbridge** :+Supprimez le conteneur et re-créez le avec une limite de mémoire :
  
 <code> <code>
-root@manager:~# docker network ls +root@manager:~/docker-bench-security# docker run -d -p 8081:80 nginx 
-NETWORK ID          NAME                DRIVER              SCOPE +Unable to find image 'nginx:latest' locally 
-4edb7186dcc9        bridge              bridge              local +sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee: Pulling from library/nginx 
-d4c9b0c9437a        docker_gwbridge     bridge              local +1f7ce2fa46ab: Pull complete  
-f3cb3bc3c581        host                host                local +9b16c94bb686: Pull complete  
-r8htcvc8oxmz        ingress             overlay             swarm +9a59d19f9c5b: Pull complete  
-de563e30d473        none                null                local+9ea27b074f71: Pull complete  
 +c6edf33e2524: Pull complete  
 +84b1ff10387b: Pull complete  
 +517357831967: Pull complete  
 +Digest: sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee 
 +Status: Downloaded newer image for nginx@sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee 
 +Tagging nginx@sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee as nginx:latest 
 +e14d5112c2feb71e6f37252bcf99d03603d6b7a3e200bff0d55611a0e9a25e2b 
 + 
 +root@manager:~/docker-bench-security# docker stats 
 +CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS 
 +e14d5112c2fe        strange_bassi       0.00%               2.215MiB / 1.957GiB   0.11%               2.16kB / 0B         0B / 0B             2 
 +e503dd98f889        mysql               0.51%               351.3MiB / 1.957GiB   17.53%              5.54kB / 0B         167MB / 118MB       37 
 +^C
 </code> </code>
  
-<WRAP center round info 60%> +Supprimez le conteneur et re-créez-le avec une limite de mémoire :
-**Info** : Le réseau **docker_gwbridge** relie le réseau **ingress** à l'adaptateur réseau de l'hôte et par conséquent relie le démon Docker aux autres démons Docker qui participent dans swarm. +
-</WRAP>+
  
-<WRAP center round tip 60%+<code
-**Best Practice** Docker recommande l'utilisation de réseaux de type overlay différents pour chaque application ou groupe d'applications. +root@manager:~/docker-bench-security# docker ps -a 
-</WRAP>+CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                  NAMES 
 +e14d5112c2fe        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8081->80/tcp   strange_bassi 
 +e503dd98f889        mysql               "docker-entrypoint.s…"   18 minutes ago       Up 7 minutes        3306/tcp, 33060/tcp    mysql
  
-====2.2 Création d'un Réseau overlay====+root@manager:~/docker-bench-security# docker rm -f e14 
 +e14
  
-A partir du Manager, créez un réseau de type overlay appelé **nginx-net** :+root@manager:~/docker-bench-security# docker run -d -p 8081:80 --memory="256m" nginx 
 +38e91e096c83f7cbe78089617a4d70110bd273f53339f8fed8df2503d3cd65ca
  
-<code> +root@manager:~/docker-bench-security# docker stats 
-root@manager:~docker network create -d overlay nginx-net +CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS 
-j57jhtug4kjxp22ai1y664lqr +38e91e096c83        sweet_vaughan       0.00%               2.223MiB / 256MiB     0.87%               2.16kB / 0B         0B / 0B             2 
-root@manager:~# docker network ls +e503dd98f889        mysql               0.49%               351.3MiB / 1.957GiB   17.53%              5.61kB / 0B         167MB / 118MB       37 
-NETWORK ID          NAME                DRIVER              SCOPE +^C
-dde514eea83f        bridge              bridge              local +
-d4c9b0c9437a        docker_gwbridge     bridge              local +
-f3cb3bc3c581        host                host                local +
-r8htcvc8oxmz        ingress             overlay             swarm +
-j57jhtug4kjx        nginx-net           overlay             swarm +
-de563e30d473        none                null                local+
 </code> </code>
  
-====2.2 - Création d'un Service====+Pour plus d'informations, consultez cette **[[https://docs.docker.com/config/containers/resource_constraints/|page]]**.
  
-Créez un service nginx qui utilise le réseau **nginx-net** :+====[WARN] 5.11 Ensure that CPU priority is set appropriately on containers (Automated)====
  
-<code> +Cet avertissement est du au fait que les conteneurs ont automatiquement accès à tous les CPU de l'hôte Docker. Pour limiter cet accèsplusieurs options sont possibles dont le plus couramment utilisée est **--cpu-shares**.
-root@manager:~# docker service create --name my-nginx --publish target=80,published=80 --replicas=5 --network nginx-net nginx +
-fpydgix3e1rc1qum72gvwcb7f +
-overall progress: 5 out of 5 tasks  +
-1/5: running   [==================================================>]  +
-2/5: running   [==================================================>]  +
-3/5: running   [==================================================>]  +
-4/5: running   [==================================================>]  +
-5/5: running   [==================================================>]  +
-verify: Service converged  +
-</code>+
  
-<WRAP center round info 60%> +La valeur de cpu-shares est relative à la valeur par défaut de **1024**. Un valeur de 512 permet au conteneur d'accéder à 50% des cycles du CPU mais uniquement quand les cycles sont limitésQuand les cycles de CPU ne sont par restreints, chaque conteneur utilise autant qu'il en a besoin
-**Info** : Le service publie le port 80 qui est visible de l'extérieurLes conteneurs communiquent entre eux sans ouvrir de ports supplémentaires+ 
-</WRAP>+Pour plus d'informations, consultez cette **[[https://docs.docker.com/config/containers/resource_constraints/|page]]**.
  
-Vérifiez que le service fonctionne avant de poursuivre :+====[WARN] 5.12 - Ensure that the container's root filesystem is mounted as read only (Automated)==== 
 + 
 +Afin de minimiser le risque de compromettre un conteneur par la présence de code malicieux, il est conseillé de démarrer les conteneurs en lecture seule, sauf pour les volumes qui nécessitent un accès en écriture/lecture. 
 + 
 +Créez le fichier **write_a_file** dans le conteneur **mysql** :
  
 <code> <code>
-root@manager:~docker service ls +root@manager:~/docker-bench-security# docker container exec mysql touch /write_a_file
-ID                  NAME                MODE                REPLICAS            IMAGE               PORTS +
-fpydgix3e1rc        my-nginx            replicated          5/5                 nginx:latest        *:80->80/tcp+
 </code> </code>
  
-Consultez maintenant les détails du service :+La Commande **docker container diff** indique les différences apportées au conteneur par rapport à l'image dont il est issu :
  
 <code> <code>
-root@manager:~# docker service inspect my-nginx +root@manager:~/docker-bench-security# docker diff mysql 
-[ +C /run 
-    { +C /run/mysqld 
-        "ID": "fpydgix3e1rc1qum72gvwcb7f", +A /run/mysqld/mysqld.pid 
-        "Version":+A /run/mysqld/mysqld.sock 
-            "Index": 40 +A /run/mysqld/mysqld.sock.lock 
-        }, +A /run/mysqld/mysqlx.sock 
-        "CreatedAt": "2019-10-28T06:23:29.17883246Z", +A /run/mysqld/mysqlx.sock.lock 
-        "UpdatedAt": "2019-10-28T06:23:29.183438696Z", +/write_a_file
-        "Spec":+
-            "Name": "my-nginx", +
-            "Labels": {}, +
-            "TaskTemplate":+
-                "ContainerSpec":+
-                    "Image": "nginx:latest@sha256:922c815aa4df050d4df476e92daed4231f466acc8ee90e0e774951b0fd7195a4", +
-                    "Init": false, +
-                    "StopGracePeriod": 10000000000, +
-                    "DNSConfig": {}, +
-                    "Isolation": "default" +
-                }, +
-                "Resources":+
-                    "Limits": {}, +
-                    "Reservations": {} +
-                }, +
-                "RestartPolicy":+
-                    "Condition": "any", +
-                    "Delay": 5000000000, +
-                    "MaxAttempts":+
-                }, +
-                "Placement":+
-                    "Platforms":+
-                        { +
-                            "Architecture": "amd64", +
-                            "OS": "linux" +
-                        }, +
-                        { +
-                            "OS": "linux" +
-                        }, +
-                        { +
-                            "Architecture": "arm64", +
-                            "OS": "linux" +
-                        }, +
-                        { +
-                            "Architecture": "386", +
-                            "OS": "linux" +
-                        }, +
-                        { +
-                            "Architecture": "ppc64le", +
-                            "OS": "linux" +
-                        }, +
-                        { +
-                            "Architecture": "s390x", +
-                            "OS": "linux" +
-                        } +
-                    ] +
-                }, +
-                "Networks":+
-                    { +
-                        "Target": "j57jhtug4kjxp22ai1y664lqr" +
-                    } +
-                ], +
-                "ForceUpdate": 0, +
-                "Runtime": "container" +
-            }, +
-            "Mode":+
-                "Replicated":+
-                    "Replicas":+
-                } +
-            }, +
-            "UpdateConfig":+
-                "Parallelism": 1, +
-                "FailureAction": "pause", +
-                "Monitor": 5000000000, +
-                "MaxFailureRatio": 0, +
-                "Order": "stop-first" +
-            }, +
-            "RollbackConfig":+
-                "Parallelism": 1, +
-                "FailureAction": "pause", +
-                "Monitor": 5000000000, +
-                "MaxFailureRatio": 0, +
-                "Order": "stop-first" +
-            }, +
-            "EndpointSpec":+
-                "Mode": "vip", +
-                "Ports":+
-                    { +
-                        "Protocol": "tcp", +
-                        "TargetPort": 80, +
-                        "PublishedPort": 80, +
-                        "PublishMode": "ingress" +
-                    } +
-                ] +
-            } +
-        }, +
-        "Endpoint":+
-            "Spec":+
-                "Mode": "vip", +
-                "Ports":+
-                    { +
-                        "Protocol": "tcp", +
-                        "TargetPort": 80, +
-                        "PublishedPort": 80, +
-                        "PublishMode": "ingress" +
-                    } +
-                ] +
-            }, +
-            "Ports":+
-                { +
-                    "Protocol": "tcp", +
-                    "TargetPort": 80, +
-                    "PublishedPort": 80, +
-                    "PublishMode": "ingress" +
-                } +
-            ], +
-            "VirtualIPs":+
-                { +
-                    "NetworkID": "r8htcvc8oxmzy896xvwvv87k5", +
-                    "Addr": "10.255.0.5/16" +
-                }, +
-                { +
-                    "NetworkID": "j57jhtug4kjxp22ai1y664lqr", +
-                    "Addr": "10.0.0.2/24" +
-                } +
-            ] +
-        } +
-    } +
-]+
 </code> </code>
  
-<WRAP center round important 60%> +<WRAP center round important 50%> 
-**Important** : Notez ici les informations concernant les ports et les Endpoints utilisés par le service.+**Important** : Notez que la sortie indique les changements apportés au conteneur.
 </WRAP> </WRAP>
  
-====2.3 - Déplacer le Service vers un autre Réseau overlay====+Arrêtez et supprimez le conteneur :
  
-Consultez le réseau overlay **nginx-net** sur les trois nœuds :+<code> 
 +root@manager:~/docker-bench-security# docker stop mysql 
 +mysql
  
-<code> +root@manager:~/docker-bench-security# docker rm  mysql 
-root@manager:~docker inspect nginx-net +mysql
-+
-    { +
-        "Name": "nginx-net", +
-        "Id": "j57jhtug4kjxp22ai1y664lqr", +
-        "Created": "2019-10-28T07:23:29.492986337+01:00", +
-        "Scope": "swarm", +
-        "Driver": "overlay", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "10.0.0.0/24", +
-                    "Gateway": "10.0.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "b2e882e530b10f8fd0b2481f851007f864ce1495bc9fdedcf51a475c0fc03aeb":+
-                "Name": "my-nginx.2.bo4q3us1f6m0uwxhqgtau1yg5", +
-                "EndpointID": "f6f82bcb81ba82191f3988702b0e91f7f5f139c5c88899ad7c95e12ab189e055", +
-                "MacAddress": "02:42:0a:00:00:04", +
-                "IPv4Address": "10.0.0.4/24", +
-                "IPv6Address": "" +
-            }, +
-            "c0a76b54dad58b0faf80d2f915a10072aa7d726c46036caa3157d22c30dba843":+
-                "Name": "my-nginx.4.aqj5vafpqtkc8f4rn4v04x4kn", +
-                "EndpointID": "813bef65edc4de42d5ec4357013f5b711cd21ce7d1a1c8361c1d989d0d709071", +
-                "MacAddress": "02:42:0a:00:00:06", +
-                "IPv4Address": "10.0.0.6/24", +
-                "IPv6Address": "" +
-            }, +
-            "lb-nginx-net":+
-                "Name": "nginx-net-endpoint", +
-                "EndpointID": "d087f5fe91481b12ca0b966d01584d143b25c746952bb517441cfad6beba90de", +
-                "MacAddress": "02:42:0a:00:00:08", +
-                "IPv4Address": "10.0.0.8/24", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options":+
-            "com.docker.network.driver.overlay.vxlanid_list": "4097" +
-        }, +
-        "Labels": {}, +
-        "Peers":+
-            { +
-                "Name": "1199cab4a6dd", +
-                "IP": "10.0.2.62" +
-            }, +
-            { +
-                "Name": "69676ae46ab9", +
-                "IP": "10.0.2.63" +
-            }, +
-            { +
-                "Name": "d058d363197d", +
-                "IP": "10.0.2.64" +
-            } +
-        ] +
-    } +
-]+
 </code> </code>
 +
 +Lancez un conteneur mysql en lecture seule :
  
 <code> <code>
-root@worker1:~# docker inspect nginx-net +root@manager:~/docker-bench-security# docker run ---name mysql --read-only -v /var/lib/mysql -v /tmp -v /var/run/mysqld -e MYSQL_ROOT_PASSWORD=password mysql 
-+711ab28bdfb41220c84246c1658bcde398681a78291bbbe7d3bbfd9bc317d41b
-    { +
-        "Name": "nginx-net", +
-        "Id": "j57jhtug4kjxp22ai1y664lqr", +
-        "Created": "2019-10-28T07:23:29.561068917+01:00", +
-        "Scope": "swarm", +
-        "Driver": "overlay", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "10.0.0.0/24", +
-                    "Gateway": "10.0.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "50b205e2ed4ccaaad5adc06c508af235557c89c116c819e367a1d925e9c2b564":+
-                "Name": "my-nginx.1.gcz867ezj0y46tsdgoz8j3jz2", +
-                "EndpointID": "a48a43da98acef2748f42ffa992ba302863ed3c417fa3289cbd3aed0e33e97fa", +
-                "MacAddress": "02:42:0a:00:00:03", +
-                "IPv4Address": "10.0.0.3/24", +
-                "IPv6Address": "" +
-            }, +
-            "lb-nginx-net": { +
-                "Name": "nginx-net-endpoint", +
-                "EndpointID": "54ed15511cdd574cb60d37d39257cbf7b30331b24bb069aadb33b457b2864789", +
-                "MacAddress": "02:42:0a:00:00:0a", +
-                "IPv4Address": "10.0.0.10/24", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options":+
-            "com.docker.network.driver.overlay.vxlanid_list": "4097" +
-        }, +
-        "Labels": {}, +
-        "Peers":+
-            { +
-                "Name": "69676ae46ab9", +
-                "IP": "10.0.2.63" +
-            }, +
-            { +
-                "Name": "d058d363197d", +
-                "IP": "10.0.2.64" +
-            }, +
-            { +
-                "Name": "1199cab4a6dd", +
-                "IP": "10.0.2.62" +
-            } +
-        ] +
-    } +
-]+
 </code> </code>
 +
 +Créez le fichier **write_a_file** dans le conteneur **mysql** :
  
 <code> <code>
-root@worker2:~docker inspect nginx-net +root@manager:~/docker-bench-security# docker container exec mysql touch /write_a_file 
-+touchcannot touch '/write_a_file'Read-only file system
-    { +
-        "Name": "nginx-net", +
-        "Id": "j57jhtug4kjxp22ai1y664lqr", +
-        "Created": "2019-10-28T07:23:29.562818383+01:00", +
-        "Scope": "swarm", +
-        "Driver": "overlay", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "10.0.0.0/24", +
-                    "Gateway""10.0.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "31bcb5e553886cd9b3a6b8e70fe0c2bed92fe081bd0def0c94864631a940cbd6":+
-                "Name": "my-nginx.5.t3be85jtp2qlhpmvsl4866s5m", +
-                "EndpointID": "ffa92f5f3bb7fd2665a8be336ef1e4e2d786790852eb152dac1a2c45f18518ba", +
-                "MacAddress": "02:42:0a:00:00:07", +
-                "IPv4Address": "10.0.0.7/24", +
-                "IPv6Address""" +
-            }, +
-            "8e2ce40a6e0d9fb2bc64c264b92164b6ea241a2369d8e6844d00b8952f5729a7":+
-                "Name": "my-nginx.3.dma616z2rkbted13zd824fyo2", +
-                "EndpointID": "99cfb31ce34ccd9b6b15f71c87eddb5f39a84512ec76d215d54bdaaf851d5129", +
-                "MacAddress": "02:42:0a:00:00:05", +
-                "IPv4Address": "10.0.0.5/24", +
-                "IPv6Address": "" +
-            }, +
-            "lb-nginx-net":+
-                "Name": "nginx-net-endpoint", +
-                "EndpointID": "c0816f6f1e5c046ac1deb8163c5a8cf40765a126bf76b6f10bf1bb708a51dfa1", +
-                "MacAddress": "02:42:0a:00:00:09", +
-                "IPv4Address": "10.0.0.9/24", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options":+
-            "com.docker.network.driver.overlay.vxlanid_list": "4097" +
-        }, +
-        "Labels": {}, +
-        "Peers":+
-            { +
-                "Name": "d058d363197d", +
-                "IP": "10.0.2.64" +
-            }, +
-            { +
-                "Name": "69676ae46ab9", +
-                "IP": "10.0.2.63" +
-            }, +
-            { +
-                "Name": "1199cab4a6dd", +
-                "IP": "10.0.2.62" +
-            } +
-        ] +
-    } +
-]+
 </code> </code>
  
-<WRAP center round important 60%> +<WRAP center round important 50%> 
-**Important** : Notez que le réseau **nginx-net** a été créé automatiquement sur les deux Workers. Notez aussi le contenu de la section **Peers** qui liste les nœuds ainsi que la section **Containers** qui liste les conteneurs sur chaque nœud qui sont connectés au réseau overlay.+**Important** : Notez l'erreur **touch: cannot touch '/write_a_file': Read-only file system**.
 </WRAP> </WRAP>
  
-Créez maintenant un deuxième réseau de type overlay, appelé **nginx-net-2** :+Exécutez la commande **docker container diff** : 
  
 <code> <code>
-root@manager:~docker network create -d overlay nginx-net-2 +root@manager:~/docker-bench-security# docker container diff mysql 
-aez5huut9hd472qmldzf2tsud+root@manager:~/docker-bench-security# 
 </code> </code>
  
-Déplacez le service **my-nginx** vers le réseau **nginx-net-2** : +<WRAP center round important 50%> 
 +**Important** : Notez que la commande ne retourne aucune sortie. En effet le conteneur étant en lecture seule, aucun changement ne peut intervenir. 
 +</WRAP> 
 + 
 +====[WARN] 5.14 - Ensure that the 'on-failure' container restart policy is set to '5' (Automated)==== 
 + 
 +Cet avertissement concerne la politique de re-démarrage du conteneur. La politique **on-failure[:max-retries]** implique que le conteneur est re-démarré en cas d'arrêt du à une erreur qui se manifeste en tant que code de retour autre que zéro. La valeur de **max-retries** est le nombre de fois que Docker va essayer de re-démarrer le conteneur. Cette politique peut être mise en place au démarrage du conteneur, par exemple : 
 + 
 +  # docker container run -d --name mysql --read-only --restart on-failure:5 -v /var/lib/mysql -v /tmp -v /var/run/mysqld -e MYSQL_ROOT_PASSWORD=password mysql 
 + 
 +Pour plus d'informations, consultez cette **[[https://docs.docker.com/config/containers/start-containers-automatically/|page]]**. 
 + 
 +====[WARN] 5.26 - Ensure that container health is checked at runtime (Automated)==== 
 + 
 +Voir l'avertissement 4.6. 
 + 
 +====[WARN] 5.28 - Ensure that the PIDs cgroup limit is used (Automated)==== 
 + 
 +Sans l'utilisation de l'option **--pids-limit** un conteneur pourrait être victime d'une attaque de type **[[https://fr.wikipedia.org/wiki/Fork_bomb|Fork Bomb]]**, un type spécifique de dénie de service. Ce type d'attaque peut faire crasher l'hôte Docker et le seul remède est de re-démarrer l'hôte. Voici un exemple d'un Fork Bomb :
  
 <code> <code>
-root@manager:~docker service update --network-add nginx-net-2 --network-rm nginx-net my-nginx +root@manager:~/docker-bench-security# docker run -u 1000 ubuntu bash -c ":() { & }; :; while [[ true ]]; do sleep 1; done"
-my-nginx +
-overall progress5 out of 5 tasks  +
-1/5running   [==================================================>]  +
-2/5running   [==================================================>]  +
-3/5running   [==================================================>]  +
-4/5: running   [==================================================> +
-5/5: running   [==================================================> +
-verify: Service converged +
 </code> </code>
  
-Vérifiez que le service fonctionne avant de poursuivre :+L'hôte Docker **manager** crash. Après avoir re-démarrer la machine virtuelle, créez de nouveau le conteneur en utilisant l'option **--pids-limit** :
  
 <code> <code>
-root@manager:~# docker service ls +root@manager:~/docker-bench-security# docker run -u 1000 --pids-limit 100 ubuntu bash -c ":() { : | : & }; :; while [[ true ]]; do sleep 1; done" 
-ID                  NAME                MODE                REPLICAS            IMAGE               PORTS +Unable to find image 'ubuntu:latest' locally 
-fpydgix3e1rc        my-nginx            replicated          5/5                 nginx:latest        *:80->80/tcp+sha256:6042500cf4b44023ea1894effe7890666b0c5c7871ed83a97c36c76ae560bb9b: Pulling from library/ubuntu 
 +a48641193673: Pull complete  
 +Digest: sha256:6042500cf4b44023ea1894effe7890666b0c5c7871ed83a97c36c76ae560bb9b 
 +Status: Downloaded newer image for ubuntu@sha256:6042500cf4b44023ea1894effe7890666b0c5c7871ed83a97c36c76ae560bb9b 
 +Tagging ubuntu@sha256:6042500cf4b44023ea1894effe7890666b0c5c7871ed83a97c36c76ae560bb9b as ubuntu:latest 
 +environmentfork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +environment: fork: retry: Resource temporarily unavailable 
 +^P^Q
 </code> </code>
  
-Vérifiez qu'aucun conteneur se trouve dans le réseau **nginx-net** :+Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/reference/commandline/run/#options|page]]**
 + 
 +Supprimez maintenant tous les conteneurs déjà créées :
  
 <code> <code>
-root@manager:~docker network inspect nginx-net +root@manager:~/docker-bench-security# docker rm -f `docker ps -aq` 
-+db5ae43c3e55 
-    { +f3b2528fbac0 
-        "Name": "nginx-net", +711ab28bdfb4 
-        "Id": "j57jhtug4kjxp22ai1y664lqr", + 
-        "Created": "2019-10-28T06:21:18.337578134Z", +root@manager:~/docker-bench-security# docker ps -a 
-        "Scope": "swarm", +CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
-        "Driver": "overlay", +
-        "EnableIPv6": false, +
-        "IPAM": { +
-            "Driver""default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "10.0.0.0/24", +
-                    "Gateway": "10.0.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers": null, +
-        "Options":+
-            "com.docker.network.driver.overlay.vxlanid_list": "4097" +
-        }, +
-        "Labels": null +
-    } +
-]+
 </code> </code>
  
-Vérifiez maintenant que les conteneurs se trouvent dans le réseau **nginx-net-2** :+Re-créez le conteneur mysql en intégrant les points vus ci-dessus :
  
 <code> <code>
-root@manager:~# docker network inspect nginx-net-+root@manager:~/docker-bench-security# docker run ---name mysql --read-only --restart on-failure:5 --security-opt="no-new-privileges:true" --pids-limit 100 --memory="256m" --cpu-shares 512 -v /var/lib/mysql -v /tmp -v /var/run/mysqld -e MYSQL_ROOT_PASSWORD=password mysql 
-+f49d1ffdeae2e83435e8cc3a2e03fb2e0b33e5609d266e5a3403ff8859e5d122 
-    { + 
-        "Name": "nginx-net-2", +root@manager:~/docker-bench-security# docker ps -a 
-        "Id": "aez5huut9hd472qmldzf2tsud", +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES 
-        "Created": "2019-10-28T10:09:54.465105557+01:00", +f49d1ffdeae2        mysql               "docker-entrypoint.s…  16 seconds ago      Up 15 seconds       3306/tcp33060/tcp   mysql
-        "Scope": "swarm", +
-        "Driver": "overlay", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "10.0.1.0/24", +
-                    "Gateway": "10.0.1.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "0bf159064e30d5e788a12baca53ee8e9504a2d7300017fb268cb9e90caaea27a":+
-                "Name": "my-nginx.2.81pveqac42zesvuulpbiho7k6", +
-                "EndpointID""25c9587e76cfca10d17b10fa967186bc73ca6b444cc2689e43a7243f5d1795b2", +
-                "MacAddress": "02:42:0a:00:01:05", +
-                "IPv4Address": "10.0.1.5/24"+
-                "IPv6Address": "" +
-            }, +
-            "74e656da8c670fca23270078565af164c4d42415f012ff51ccb02395c6d121e9":+
-                "Name": "my-nginx.3.mjj1bsguaaewk61dw7yxxjdlu", +
-                "EndpointID": "2be3c3e0286d3afb5ba47bbd903151a4d337a45743cb30c46595160223e02fba", +
-                "MacAddress": "02:42:0a:00:01:07", +
-                "IPv4Address": "10.0.1.7/24", +
-                "IPv6Address": "" +
-            }, +
-            "lb-nginx-net-2": { +
-                "Name": "nginx-net-2-endpoint", +
-                "EndpointID": "768a4cc926b5c94a20904e5db500dc62b40a063077a49769ccccc007a6cb61ac", +
-                "MacAddress": "02:42:0a:00:01:06", +
-                "IPv4Address""10.0.1.6/24", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options":+
-            "com.docker.network.driver.overlay.vxlanid_list": "4098" +
-        }, +
-        "Labels": {}, +
-        "Peers":+
-            { +
-                "Name": "69676ae46ab9", +
-                "IP": "10.0.2.63" +
-            }, +
-            { +
-                "Name": "1199cab4a6dd", +
-                "IP": "10.0.2.62" +
-            }, +
-            { +
-                "Name": "d058d363197d", +
-                "IP": "10.0.2.64" +
-            } +
-        ] +
-    } +
-]+
 </code> </code>
  
-Supprimez maintenant le service **my-nginx** ainsi que les deux réseaux overlay **nginx-net** et **nginx-net-2** :+Exécutez de nouveau le script **docker-bench-security.sh**, vous devez obtenir un résultat similaire à ceci en ce qui concerne la sécurité du Container Runtime :
  
 <code> <code>
-root@manager:~docker service rm my-nginx +root@manager:~/docker-bench-security./docker-bench-security.sh 
-my-nginx +... 
-root@manager:~# docker network rm nginx-net nginx-net-2 +[PASS] 5.- Ensure that, if applicable, SELinux security options are set (Automated) 
-nginx-net +[PASS] 5.10 Ensure that the memory usage for containers is limited (Automated) 
-nginx-net-2+[PASS] 5.11 Ensure that CPU priority is set appropriately on containers (Automated) 
 +[PASS] 5.12 Ensure that the container's root filesystem is mounted as read only (Automated) 
 +[PASS] 5.14 - Ensure that the 'on-failure' container restart policy is set to '5' (Automated) 
 +[PASS] 5.28 - Ensure that the PIDs cgroup limit is used (Automated) 
 +...
 </code> </code>
  
-====2.4 DNS container discovery====+=====LAB #8 Sécurisation des Images avec Docker Content Trust=====
  
-Le daemon Docker exécute un server DNS embarqué à l'adresse 127.0.0.11 qui permet la résolution des noms dans un réseau personnalisé. Si ce serveur est incapable de faire la résolutionil transfert la requête à tout serveur externe défini dans le conteneur.+**Docker Content Trust (DCT)** a été introduit avec Docker Engine 1.8 et Docker CS Engine 1.9.0. DCT permet la vérification de l'authenticitéde l'intégrité et la date de publication d'une image Docker dans un registry. Par défaut, DCT est **désactivé**.
  
-Pour que le **DNS container discovery** fonctionne, les ports suivants doivent être ouverts sur les nœuds :+DCT est utilisé par le **Docker Hub Registry** mais peut aussi être mis en place dans des Registry privés, notamment grâce à la mise en place du **[[https://www.docker.com/products/image-registry|Docker Container Registry]]** qui est inclus avec **Docker Enterprise**.
  
-  2377/tcp +DCT est basé sur l'utilisation de l'outil **[[https://docs.docker.com/notary/service_architecture/|Docker Notary]]** pour publier et gérer du contenu ainsi que **[[https://theupdateframework.github.io/|The Update Framework (TUF)]]**.
-  7946/tcp +
-  * 7946/udp +
-  4789/udp+
  
-Créez maintenant le réseau de type overlay **test-net** :+Pour plus d'information concernant DCT, consultez cette **[[https://docs.docker.com/engine/security/trust/content_trust/|page]]**.
  
-<code> +====8.1 DOCKER_CONTENT_TRUST====
-root@manager:~# docker network create --driver=overlay --attachable test-net +
-hrs25w4l951kkickhj6262mjg +
-</code>+
  
-<WRAP center round important 60%> +Pour utiliser **Docker Content Trust (DCT)**, il convient de vérifier que la valeur de la variable **DOCKER_CONTENT_TRUST** est **1** :
-**Important** : Notez que le **NETWORK-ID** ici est **hrs25w4l951kkickhj6262mjg**. +
-</WRAP> +
- +
-Sur le Manager, démarrez un conteneur interactif appelé **alpine1** et qui se connecte au réseau **test-net** :+
  
 <code> <code>
-root@manager:~# docker run -it --name alpine1 --network test-net alpine +root@manager:~# echo $DOCKER_CONTENT_TRUST 
-Unable to find image 'alpine:latest' locally +1
-latest: Pulling from library/alpine +
-89d9c30c1d48: Pull complete  +
-Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a +
-Status: Downloaded newer image for alpine:latest +
-/ # +
 </code> </code>
  
-Listez les réseaux disponibles sur **Worker1** :+Dans le cas contraire, il faut fixer la valeur de la variable à 1 :
  
 <code> <code>
-root@worker1:~# docker network ls +root@manager:~# export DOCKER_CONTENT_TRUST=1 
-NETWORK ID          NAME                DRIVER              SCOPE +root@manager:~# echo $DOCKER_CONTENT_TRUST 
-3fe43b514f9d        bridge              bridge              local +1
-ee22b3e623ca        docker_gwbridge     bridge              local +
-f3cb3bc3c581        host                host                local +
-r8htcvc8oxmz        ingress             overlay             swarm +
-de563e30d473        none                null                local+
 </code> </code>
  
-<WRAP center round important 60%> +====8.2 - DCT et la commande docker pull====
-**Important** : Notez que le réseau **test-net** n'a pas été créé. +
-</WRAP>+
  
-Démarrez maintenant un conteneur **alpine2** sur **Worker1** :+Afin d'utiliser un registry privé du Docker Hub, il est nécessaire de se connecter :
  
 <code> <code>
-root@worker1:~# docker run -dit --name alpine2 --network test-net alpine +root@manager:~# docker login 
-Unable to find image 'alpine:latest' locally +Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. 
-latest: Pulling from library/alpine +Username<votre_compte> 
-89d9c30c1d48Pull complete  +Password<votre_mot_de_passe> 
-Digestsha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a +WARNING! Your password will be stored unencrypted in /root/.docker/config.json. 
-StatusDownloaded newer image for alpine:latest +Configure a credential helper to remove this warning. See 
-5734e84cd460cdd33ce90970d98a96837a0305832a86fc4d86be38aecf51b23b+https://docs.docker.com/engine/reference/commandline/login/#credentials-store 
 + 
 +Login Succeeded
 </code> </code>
  
-Saisissez la commande **docker network ls** sur **Worker1** : +Pour constater l'impact de l'utilisation de DCT, il convient simplement de faire un **pull** d'une image non-signée :
  
 <code> <code>
-root@worker1:~# docker network ls +root@manager:~# docker image pull i2tch/docker:unsigned 
-NETWORK ID          NAME                DRIVER              SCOPE +Error: remote trust data does not exist for docker.io/i2tch/docker: notary.docker.io does not have trust data for docker.io/i2tch/docker
-3fe43b514f9d        bridge              bridge              local +
-ee22b3e623ca        docker_gwbridge     bridge              local +
-f3cb3bc3c581        host                host                local +
-r8htcvc8oxmz        ingress             overlay             swarm +
-de563e30d473        none                null                local +
-hrs25w4l951k        test-net            overlay             swarm+
 </code> </code>
  
-<WRAP center round important 60%> +<WRAP center round important 50%> 
-**Important** : Notez que le réseau **test-net**, ayant le même **NETWORK ID**, a été automatiquement créé lors de la création du conteneur **alpine2**. +**Important** : Notez l'erreur **Error: remote trust data does not exist for docker.io/i2tch/docker ...**. En effet Docker Trust empêche l'utilisation des images non-signées.
 </WRAP> </WRAP>
  
-Listez les réseaux disponibles sur **Worker2** :+Par contre, toutes les images de type **official** sont signées :
  
 <code> <code>
-root@worker2:~# docker network ls +root@manager:~# docker image pull centos 
-NETWORK ID          NAME                DRIVER              SCOPE +Using default tag: latest 
-ff7308310f60        bridge              bridge              local +Pull (1 of 1): centos:latest@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9 
-0ce1d8369c29        docker_gwbridge     bridge              local +sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9: Pulling from library/centos 
-f3cb3bc3c581        host                host                local +729ec3a6ada3: Pull complete  
-r8htcvc8oxmz        ingress             overlay             swarm +Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9 
-de563e30d473        none                null                local+Status: Downloaded newer image for centos@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9 
 +Tagging centos@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9 as centos:latest 
 +docker.io/library/centos:latest
 </code> </code>
  
-<WRAP center round important 60%> +Cette image est maintenant présente sur **manager.i2tch.loc** :
-**Important** : Notez que le réseau **test-net** n'a pas été créé. +
-</WRAP> +
- +
-Attachez vous au conteneur **alpine2** sur **Worker1** et essayez de contacter le conteneur **alpine1** :+
  
 <code> <code>
-root@worker1:~# docker ps -a +root@manager:~# docker images 
-CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES +REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
-ce9097b864dc        alpine              "/bin/sh"           23 minutes ago      Up 23 minutes                           alpine2 +ubuntu              latest              775349758637        9 days ago          64.2MB 
-root@worker1:~# docker attach alpine2 +nginx               latest              540a289bab6c        weeks ago         126MB 
-/ # ping -c alpine1 +alpine              latest              965ea09ff2eb        weeks ago         5.55MB 
-PING alpine1 (10.0.2.2): 56 data bytes +mysql               latest              c8ee894bd2bd        3 weeks ago         456MB 
-64 bytes from 10.0.2.2: seq=0 ttl=64 time=1.874 ms +centos              latest              0f3e07c0138f        5 weeks ago         220MB 
-64 bytes from 10.0.2.2: seq=1 ttl=64 time=1.669 ms+</code>
  
---- alpine1 ping statistics --- +===L'option disable-content-trust===
-2 packets transmitted, 2 packets received, 0% packet loss +
-round-trip min/avg/max 1.669/1.771/1.874 ms +
-/ #  +
-</code>+
  
-Retournez dans la VM **Manager** et essayez de contacter le conteneur **alpine2** à partir du conteneur **alpine1** :+Il est aussi possible d'activer ou de désactiver l'utilisation de DCT avec les options **--disable-content-trust=false/true** lors de l'utilisation des commandes **docker build**, **docker push** et **docker pull**, **docker create** et **docker run** :
  
 <code> <code>
-root@manager:~# docker attach alpine1 +root@manager:~# docker image pull --disable-content-trust=true i2tch/docker:unsigned 
-# ping -c 2 alpine2 +unsigned: Pulling from i2tch/docker 
-PING alpine2 (10.0.0.4)56 data bytes +10d70a43a9f9Pull complete  
-64 bytes from 10.0.0.4seq=0 ttl=64 time=0.666 ms +4f4fb700ef54Pull complete  
-64 bytes from 10.0.0.4seq=1 ttl=64 time=1.239 ms+8951e3a91277Pull complete  
 +d1814ff35b8b: Pull complete  
 +ff2a2bbf6141: Pull complete  
 +b7205da5c3c9: Pull complete  
 +458ea241cc75: Pull complete  
 +74d1c0702786: Pull complete  
 +c66f3692932d: Pull complete  
 +9224bd1b9757: Pull complete  
 +Digest: sha256:885fc831cb853700ded04029b4fa70ed502947042f6f154e432395cb35619d11 
 +Status: Downloaded newer image for i2tch/docker:unsigned 
 +docker.io/i2tch/docker:unsigned
  
---- alpine2 ping statistics --- +root@manager:~# docker image ls 
-packets transmitted, packets received, 0% packet loss +REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
-round-trip min/avg/max = 0.666/0.952/1.239 ms +ubuntu              latest              775349758637        9 days ago          64.2MB 
-#  +nginx               latest              540a289bab6c        weeks ago         126MB 
 +alpine              latest              965ea09ff2eb        weeks ago         5.55MB 
 +mysql               latest              c8ee894bd2bd        3 weeks ago         456MB 
 +centos              latest              0f3e07c0138f        5 weeks ago         220MB 
 +i2tch/docker        unsigned            9b915a241e29        3 years ago         212MB 
 + 
 +root@manager:~# docker rmi i2tch/docker:unsigned 
 +Untagged: i2tch/docker:unsigned 
 +Untagged: i2tch/docker@sha256:885fc831cb853700ded04029b4fa70ed502947042f6f154e432395cb35619d11 
 +Deleted: sha256:9b915a241e29dc2767980445e3109412b1905b6f1617aea7098e7ac1e5837ae2 
 +Deleted: sha256:27eb08aec7b41dbfa2fd49bc2b3fad9b020fe40b0bc8289af7f53770f0843e7d 
 +Deleted: sha256:7ad0aff4b88909fcff6372fdd26c24d688803b06845426b5a90bcd2f2cae93f4 
 +Deleted: sha256:b93bcd594116ac8886f2daa0fc8d75a59da00161731dab24ababea853d031908 
 +Deleted: sha256:54eda0a22e4b2a1b166cf996eb0651a4f53dec7e9dfad3549bbfe6078f2238a4 
 +Deleted: sha256:36575f1e2764d54fdb92b5296cf4e993499836d6dd9a006f32e173865835070e 
 +Deleted: sha256:27074774f844bdeba18e786585604c8b6352e925a7bd560deb66252bc8ccb861 
 +Deleted: sha256:0da68695f8bc66fcea8f09004b5cb078861f5d99748f8b7ed035690e02c41477 
 +Deleted: sha256:5dbda9873cdda8ff912b0ae5c34790ee06d7117fa27b193610fa2f7063bf55ff 
 +Deleted: sha256:149690c37bdc8680ec66b0e2cc138f6d63caad74b091acf86a2a18111b90ea79 
 +Deleted: sha256:2caf8a80130d6e9f4ed22e1ec1c3abd2c3f4330d2df9ec62f3b751300190b9e4 
 +Deleted: sha256:1445a9131f2b28a12ff6396faebd6b4beb2cccd7af8eae28d5ff659d65de03ad 
 +Deleted: sha256:4d9799a0754804f5cd623ab744757d16ec81862ee6e5d6986d9d1b0c5e5d5637 
 +Deleted: sha256:dd833146402e8e6e67c48a6ae79a3c86101123e3d6ab1fc7999685eeea06ccba 
 +Deleted: sha256:08d8e6ed6c3a5ac1bfee00f7b11f0a870d6bdc4af6d34169fa1e032c241a63a6 
 +Deleted: sha256:0f3637356bb908638dda037c9c6aa4a2be8a19dbcf452a00cd733a8a456077ac 
 +Deleted: sha256:aedb1b3b3b6e70ae4a342dfdcea874495b9d095ed6ba8eb4bc08f90ad9e83125 
 +Deleted: sha256:05903cd969529ea56beec880bbeb7e90f1bdc281882f1cf3755760e41b181409 
 +Deleted: sha256:d124781fc06a73b05a8644958397994bae668aba2f06f397fe1387c676b0d86f
 </code> </code>
  
-Créez ensuite le conteneur **alpine3** sur le **Worker2** essayez de contacter le conteneur **alpine1** :+====8.3 - DCT et la commande docker push==== 
 + 
 +Pour envoyer l'image dont l'IMAGE ID est **965ea09ff2eb** dans le registry privé, le tag de l'image doit être modifié :
  
 <code> <code>
-root@worker2:~# docker run -it --rm --name alpine3 --network test-net alpine +root@manager:~# docker image tag alpine:latest <votre_compte>/docker:alpine 
-Unable to find image 'alpine:latest' locally +</code>
-latest: Pulling from library/alpine +
-c9b1b535fdd9Pull complete  +
-Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d +
-Status: Downloaded newer image for alpine:latest +
-# ping -c 2 alpine1 +
-PING alpine1 (10.0.2.2): 56 data bytes +
-64 bytes from 10.0.2.2: seq=0 ttl=64 time=0.642 ms +
-64 bytes from 10.0.2.2: seq=1 ttl=64 time=1.684 ms+
  
---- alpine1 ping statistics --- +L'image dont l'IMAGE ID est **965ea09ff2eb** a maintenant deux tags **alpine:latest** et **<votre_compte>/docker:alpine** : 
-packets transmitted, 2 packets received, 0% packet loss + 
-round-trip min/avg/max = 0.642/1.163/1.684 ms +<code> 
-/ # exit+root@manager:~# docker image ls 
 +REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE 
 +ubuntu                 latest              775349758637        9 days ago          64.2MB 
 +nginx                  latest              540a289bab6c        weeks ago         126MB 
 +<votre_compte>/docker  alpine              965ea09ff2eb        2 weeks ago         5.55MB 
 +alpine                 latest              965ea09ff2eb        2 weeks ago         5.55MB 
 +mysql                  latest              c8ee894bd2bd        3 weeks ago         456MB 
 +centos                 latest              0f3e07c0138f        5 weeks ago         220MB
 </code> </code>
  
-Arrêtez maintenant le conteneur **alpine2** sur **Worker1** :+Lors du push vers le registry privé, il faut créer des passphrases pour **deux** clefs : 
 + 
 +  la **root** key aussi connue sous le nom **offline** key (ID 192fc7e), qui est uniquement demandée la **première** fois après la mise en place de DCT lors de la création d'un **repositry**, 
 +  * la **repository** key aussi connue sous le nom **tagging** key (ID 168c754), utilisée pour signer l'image en y apposant un **tag**. La signature est spécifique au **repositry**.
  
 <code> <code>
-root@worker1:~# docker container stop alpine2 +root@manager:~# docker push <votre_compte>/docker:alpine 
-alpine2+The push refers to repository [docker.io/<votre_compte>/docker] 
 +77cae8ab23bf: Mounted from library/alpine  
 +alpine: digest: sha256:e4355b66995c96b4b468159fc5c7e3540fcef961189ca13fee877798649f531a size: 528 
 +Signing and pushing trust metadata 
 +You are about to create a new root signing key passphrase. This passphrase 
 +will be used to protect the most sensitive key in your signing system. Please 
 +choose a long, complex passphrase and be careful to keep the password and the 
 +key file itself secure and backed up. It is highly recommended that you use a 
 +password manager to generate the passphrase and keep it safe. There will be no 
 +way to recover this key. You can find the key in your config directory. 
 +Enter passphrase for new root key with ID 192fc7e: fenestros 
 +Repeat passphrase for new root key with ID 192fc7e: fenestros 
 +Enter passphrase for new repository key with ID 168c754: fenestros 
 +Repeat passphrase for new repository key with ID 168c754: fenestros 
 +Finished initializing "docker.io/<votre_compte>/docker" 
 +Successfully signed docker.io/<votre_compte>/docker:alpine
 </code> </code>
  
-Saisissez la commande **docker network ls** :+Les clefs sont stockées dans le répertoire **~/.docker/trust/private** :
  
 <code> <code>
-root@worker1:~# docker network ls +root@manager:~# ls -l ~/.docker/trust 
-NETWORK ID          NAME                DRIVER              SCOPE +total 8 
-3bb80f391804        bridge              bridge              local +drwx------ 2 root root 4096 nov.  10 14:49 private 
-ee22b3e623ca        docker_gwbridge     bridge              local +drwx------ 3 root root 4096 nov.   8 13:48 tuf 
-f3cb3bc3c581        host                host                local + 
-r8htcvc8oxmz        ingress             overlay             swarm +root@manager:~# ls -l ~/.docker/trust/private 
-de563e30d473        none                null                local+total 8 
 +-rw------- 1 root root 447 nov.  10 14:49 168c754ea8f36ce7fbcbe2299b6d91fc0f4d594c9ed9b86916687b618d8438ac.key 
 +-rw------- 1 root root 416 nov.  10 14:49 192fc7ed9543ad4bceec58886ab1d605b7433c35f7462d7343d0780d8fddf1db.key 
 +root@manager:~# cat ~/.docker/trust/private/168c754ea8f36ce7fbcbe2299b6d91fc0f4d594c9ed9b86916687b618d8438ac.key  
 +-----BEGIN ENCRYPTED PRIVATE KEY----- 
 +gun: docker.io/i2tch/docker 
 +role: targets 
 + 
 +MIHuMEkGCSqGSIb3DQEFDTA8MBsGCSqGSIb3DQEFDDAOBAhm7HwR0y8FFAICCAAw 
 +HQYJYIZIAWUDBAEqBBC729tU73wKHFQSbmZ1EVZaBIGgmGiFSs4lM5tElSGukl1B 
 +HrELT9aFooFgW7oSXNLM8aFfF/vJ+BSjsgfqWLdvuH+DUXXdUidxcoGMEWnVZNIC 
 +3m40g3MywHilW4rUcjoHVTTUXABGXUQ3f7h+nI15CXcZ11qRLyWbf2uywE9yYH9O 
 +M7GLUcE+pTENJKfZAhRGBEL+LgXNfGI1aAVqaEbBDcDnKKf4Uj1Xu4oLJ7je8+nT 
 +dg== 
 +-----END ENCRYPTED PRIVATE KEY----- 
 + 
 +root@manager:~# cat ~/.docker/trust/private/192fc7ed9543ad4bceec58886ab1d605b7433c35f7462d7343d0780d8fddf1db.key  
 +-----BEGIN ENCRYPTED PRIVATE KEY----- 
 +role: root 
 + 
 +MIHuMEkGCSqGSIb3DQEFDTA8MBsGCSqGSIb3DQEFDDAOBAiAtCzEar3AhgICCAAw 
 +HQYJYIZIAWUDBAEqBBAO7hHWVoqOo6xcETQQDXRdBIGgPUoLzTz07Ajx8K3D8+Vv 
 +2NUiflMYhH/0I9PL6iA2JJCmD0l+8Ueljy+vHRCu7UAIyWXyIHFN5Aab40mk9/Pg 
 +V2BwSlXp7t1Cnqp/ah7g0T40+OnT64JkTS+l3cS0CaCf2E4l6nY8g4cl40hZIFJz 
 +KREO8uEq3v7HcSBBqFm0+TU+92d7hVuDApPaj0lZYP+3f7H6AjUOqu6hUoK8Ck/Y 
 +Ig== 
 +-----END ENCRYPTED PRIVATE KEY-----
 </code> </code>
  
-<WRAP center round important 60%> +====8.4 - DCT et la commande docker build====
-**Important** : Notez que le réseau **test-net** a été supprimé. +
-</WRAP>+
  
-Supprimez le conteneur **alpine2**:+L'exemple suivant démontre un Dockerfile qui référence une image parente non signée :
  
 <code> <code>
-root@worker1:~# docker container rm alpine2 +root@manager:~# mkdir nottrusted 
-alpine2+ 
 +root@manager:~# cd nottrusted/ 
 + 
 +root@manager:~/nottrusted# vi Dockerfile 
 + 
 +root@manager:~/nottrusted# cat Dockerfile 
 +FROM docker/trusttest:latest 
 +RUN echo
 </code> </code>
  
-Arrêtez le conteneur **alpine1** et supprimez le réseau **test-net** sur **Manager** :+Lors du build de l'image **<votre_compte>/docker:nottrusted** qui utilise ce Dockerfile, une erreur est retournée car sa création n'est pas conforme à l'utilisation de DCT :
  
 <code> <code>
-/ # exit +root@manager:~/nottrusted# docker build -t <votre_compte>/docker:nottrusted . 
-root@manager:~# docker container stop alpine1 +Sending build context to Docker daemon  
-alpine1 + 
-root@manager:~# docker network ls +error during connect: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=i2tch%2Fdocker%3Anottrusted&target=&ulimits=null&version=1Error: remote trust data does not exist for docker.io/docker/trusttest: notary.docker.io does not have trust data for docker.io/docker/trusttest
-NETWORK ID          NAME                DRIVER              SCOPE +
-a604e7db6f95        bridge              bridge              local +
-d4c9b0c9437a        docker_gwbridge     bridge              local +
-f3cb3bc3c581        host                host                local +
-jxu667wzmj2u        ingress             overlay             swarm +
-de563e30d473        none                null                local +
-518l09lcjhsp        test-net            overlay             swarm +
-root@manager:~# docker network rm test-net +
-test-net+
 </code> </code>
  
-====2.5 - Création d'un Réseau overlay Personnalisé==== +L'utilisation de l'option **--disable-content-trust** permet la construction de l'image **<votre_compte>/docker:nottrusted** :
- +
-Il est possible de créer un réseau overlay personnalisé. Dans ce cas là, il convient de supprimer le réseau ingress déjà existant :+
  
 <code> <code>
-root@manager:~# docker network rm ingress +root@manager:~/nottrusted# docker build --disable-content-trust -t <votre_compte>/docker:nottrusted . 
-WARNING! Before removing the routing-mesh network, make sure all the nodes in your swarm run the same docker engine versionOtherwise, removal may not be effective and functionality of newly create ingress networks will be impaired+Sending build context to Docker daemon  2.048kB 
-Are you sure you want to continue? [y/N] y +Step 1/2 : FROM docker/trusttest:latest 
-ingress+latest: Pulling from docker/trusttest 
 +Image docker.io/docker/trusttest:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1
 +aac0c133338d: Pull complete  
 +a3ed95caeb02: Pull complete  
 +Digest: sha256:50c0cdd0577cc7ab7c78e73a0a89650b222f6ce2b87d10130ecff055981b702f 
 +Status: Downloaded newer image for docker/trusttest:latest 
 + ---> cc7629d1331a 
 +Step 2/2 : RUN echo 
 + ---> Running in 694e79d3cd88 
 + 
 +Removing intermediate container 694e79d3cd88 
 + ---> 686e85ee76b8 
 +Successfully built 686e85ee76b8 
 +Successfully tagged <votre_compte>/docker:nottrusted
 </code> </code>
  
-Créez ensuite votre réseau personnalisé :+Lors du push de l'image **<votre_compte>/docker:nottrusted** vers le repositry distant, celle-ci est **signée** :
  
 <code> <code>
-root@manager:~# docker network create --driver overlay --ingress --subnet=10.11.0.0/16 --gateway=10.11.0.2 --opt com.docker.network.driver.mtu=1200 my-ingress +root@manager:~/nottrusted# docker push <votre_compte>/docker:nottrusted 
-44ozn3vtg23zkksrvloxuulcl +The push refers to repository [docker.io/<votre_compte>/docker] 
-root@manager:~# docker network ls +5f70bf18a086: Layer already exists  
-NETWORK ID          NAME                DRIVER              SCOPE +c22f7bc058a9Mounted from docker/trusttest  
-24be8a0f0ef5        bridge              bridge              local +nottrusted: digest: sha256:1183c62a5d31e202b5f5f528e9e7cdc36140aa3212c938e1d471c6b3b59f01bc size: 734 
-d4c9b0c9437a        docker_gwbridge     bridge              local +Signing and pushing trust metadata 
-f3cb3bc3c581        host                host                local +Enter passphrase for repository key with ID 168c754: fenestros 
-44ozn3vtg23z        my-ingress          overlay             swarm +Successfully signed docker.io/<votre_compte>/docker:nottrusted
-de563e30d473        none                null                local+
 </code> </code>
  
-Créez de nouveau le service **my-nginx** :+<WRAP center round important 50%> 
 +**Important** : Notez l'utilisation de la même root key que lors du push de l'image **<votre_compte>/docker:alpine** car il s'agit du même repositry.  
 +</WRAP> 
 + 
 +===Créer un deuxième Repositry=== 
 + 
 +Par contre en modifiant le tag de l'image **<votre_compte>/docker:nottrusted** à **<votre_compte>/otherimage:latest**, un autre repositry sera créé lors du push de l'image renommée :
  
 <code> <code>
-root@manager:~# docker service create --name my-nginx --publish target=80,published=80 --replicas=5 nginx +root@manager:~/nottrusted# docker tag <votre_compte>/docker:nottrusted <votre_compte>/otherimage:latest
-gp1iozmbi25dx3skn00m6suoz +
-overall progress: 5 out of 5 tasks  +
-1/5: running   [==================================================>]  +
-2/5running   [==================================================>]  +
-3/5: running   [==================================================>]  +
-4/5: running   [==================================================>]  +
-5/5: running   [==================================================>]  +
-verifyService converged+
  
-root@manager:~# docker service ls +root@manager:~/nottrusted# docker images 
-ID                  NAME                MODE                REPLICAS            IMAGE               PORTS +REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE 
-gp1iozmbi25d        my-nginx            replicated          5/                nginx:latest        *:80->80/tcp+<votre_compte>/docker        nottrusted          686e85ee76b8        9 minutes ago       5.03MB 
 +<votre_compte>/otherimage    latest              686e85ee76b8        9 minutes ago       5.03MB 
 +ubuntu                       latest              775349758637        9 days ago          64.2MB 
 +nginx                        latest              540a289bab6c        2 weeks ago         126MB 
 +<votre_compte>/docker        alpine              965ea09ff2eb        2 weeks ago         5.55MB 
 +alpine                       latest              965ea09ff2eb        2 weeks ago         5.55MB 
 +mysql                        latest              c8ee894bd2bd        3 weeks ago         456MB 
 +centos                       latest              0f3e07c0138f        5 weeks ago         220MB 
 +docker/trusttest             latest              cc7629d1331a        4 years ago         5.03MB
  
-root@manager:~# docker service ps my-nginx +root@manager:~/nottrusted# docker push docker.io/<votre_compte>/otherimage:latest 
-ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS +The push refers to repository [docker.io/<votre_compte>/otherimage] 
-upmbwmtr76cm        my-nginx.1          nginx:latest        worker1.i2tch.loc   Running             Running about a minute ago                        +5f70bf18a086Mounted from <votre_compte>/docker  
-qz6p1li7zmef        my-nginx.2          nginx:latest        worker2.i2tch.loc   Running             Running about a minute ago                        +c22f7bc058a9Mounted from <votre_compte>/docker  
-me50mkhd11yk        my-nginx.3          nginx:latest        manager.i2tch.loc   Running             Running about a minute ago                        +latest: digest: sha256:1183c62a5d31e202b5f5f528e9e7cdc36140aa3212c938e1d471c6b3b59f01bc size: 734 
-sctjud70ihkl        my-nginx.4          nginx:latest        worker1.i2tch.loc   Running             Running about a minute ago                        +Signing and pushing trust metadata 
-kql9qx3phb73        my-nginx.5          nginx:latest        worker2.i2tch.loc   Running             Running about a minute ago    +Enter passphrase for root key with ID 192fc7efenestros 
 +Enter passphrase for new repository key with ID 7b13d02: fenestros 
 +Repeat passphrase for new repository key with ID 7b13d02: fenestros 
 +Finished initializing "docker.io/<votre_compte>/otherimage" 
 +Successfully signed docker.io/<votre_compte>/otherimage:latest
 </code> </code>
  
-Consultez les informations concernant le service **my-nginx** : +<WRAP center round important 50%> 
 +**Important** : Notez la création d'une deuxième repositry key (ID 7b13d02 au lieu de ID 168c754) lors du push de l'image **<votre_compte>/otherimage:latest** car il s'agit d'un autre repositry.  
 +</WRAP> 
 + 
 +La présence de cette deuxième repositry key (**7b13d02d74264624fb201e7ae13ae694286b9f761aa86adddefd0408c7234a58.key**) peut être constatée dans le répertoire **~/.docker/trust/private** :
  
 <code> <code>
-root@manager:~# docker service inspect my-nginx+root@manager:~/nottrustedls -l ~/.docker/trust/private 
 +total 12 
 +-rw------- 1 root root 447 nov.  10 14:49 168c754ea8f36ce7fbcbe2299b6d91fc0f4d594c9ed9b86916687b618d8438ac.key 
 +-rw------- 1 root root 416 nov.  10 14:49 192fc7ed9543ad4bceec58886ab1d605b7433c35f7462d7343d0780d8fddf1db.key 
 +-rw------- 1 root root 451 nov.  10 17:37 7b13d02d74264624fb201e7ae13ae694286b9f761aa86adddefd0408c7234a58.key 
 +</code> 
 + 
 +En inspectant les clefs des images créées, l'utilisation des différentes clefs est démontrées très clairement : 
 + 
 +<code> 
 +root@manager:~/nottrusted# docker trust inspect <votre_compte>/docker:alpine
 [ [
     {     {
-        "ID": "gp1iozmbi25dx3skn00m6suoz", +        "Name": "<votre_compte>/docker:alpine", 
-        "Version"+        "SignedTags": [ 
-            "Index": 230 +            { 
-        }+                "SignedTag": "alpine", 
-        "CreatedAt": "2019-10-28T14:49:33.6719228Z", +                "Digest": "e4355b66995c96b4b468159fc5c7e3540fcef961189ca13fee877798649f531a", 
-        "UpdatedAt": "2019-10-28T14:49:33.679624758Z", +                "Signers": [ 
-        "Spec": { +                    "Repo Admin
-            "Name": "my-nginx", +                ] 
-            "Labels": {}, +            
-            "TaskTemplate": +        ]
-                "ContainerSpec": +        "Signers": []
-                    "Image": "nginx:latest@sha256:922c815aa4df050d4df476e92daed4231f466acc8ee90e0e774951b0fd7195a4"+        "AdministrativeKeys": [ 
-                    "Init": false, +            
-                    "StopGracePeriod": 10000000000, +                "Name": "Root", 
-                    "DNSConfig": {}, +                "Keys": [ 
-                    "Isolation": "default" +                    { 
-                }+                        "ID": "d4074334a4ff5a9a43ebd1320ad77c2df88c990ec812f90eb045c603c01ab698
-                "Resources": +                    
-                    "Limits": {}, +                ]
-                    "Reservations": {} +
-                }+
-                "RestartPolicy": { +
-                    "Condition": "any", +
-                    "Delay": 5000000000, +
-                    "MaxAttempts": 0 +
-                }, +
-                "Placement":+
-                    "Platforms":+
-                        { +
-                            "Architecture": "amd64", +
-                            "OS": "linux" +
-                        }, +
-                        { +
-                            "OS": "linux" +
-                        }+
-                        { +
-                            "Architecture": "arm64"+
-                            "OS": "linux" +
-                        }, +
-                        { +
-                            "Architecture": "386", +
-                            "OS": "linux" +
-                        }, +
-                        { +
-                            "Architecture": "ppc64le", +
-                            "OS": "linux" +
-                        }, +
-                        { +
-                            "Architecture": "s390x", +
-                            "OS": "linux" +
-                        } +
-                    ] +
-                }, +
-                "ForceUpdate": 0, +
-                "Runtime": "container" +
-            }, +
-            "Mode": { +
-                "Replicated": { +
-                    "Replicas":+
-                } +
-            }, +
-            "UpdateConfig": +
-                "Parallelism": 1, +
-                "FailureAction": "pause", +
-                "Monitor": 5000000000, +
-                "MaxFailureRatio": 0, +
-                "Order": "stop-first" +
-            }+
-            "RollbackConfig": { +
-                "Parallelism": 1, +
-                "FailureAction": "pause", +
-                "Monitor": 5000000000, +
-                "MaxFailureRatio": 0, +
-                "Order": "stop-first"+
             },             },
-            "EndpointSpec": +            { 
-                "Mode": "vip", +                "Name": "Repository", 
-                "Ports": [+                "Keys": [
                     {                     {
-                        "Protocol": "tcp", +                        "ID": "168c754ea8f36ce7fbcbe2299b6d91fc0f4d594c9ed9b86916687b618d8438ac"
-                        "TargetPort": 80, +
-                        "PublishedPort": 80, +
-                        "PublishMode": "ingress"+
                     }                     }
                 ]                 ]
             }             }
-        }, +        
-        "Endpoint": { +    } 
-            "Spec": { +
-                "Mode": "vip", +root@manager:~/nottrusted# docker trust inspect <votre_compte>/docker:nottrusted 
-                "Ports": [+
 +    { 
 +        "Name": "<votre_compte>/docker:nottrusted"
 +        "SignedTags": 
 +            { 
 +                "SignedTag": "nottrusted", 
 +                "Digest": "1183c62a5d31e202b5f5f528e9e7cdc36140aa3212c938e1d471c6b3b59f01bc", 
 +                "Signers":
 +                    "Repo Admin" 
 +                ] 
 +            
 +        ], 
 +        "Signers": [], 
 +        "AdministrativeKeys":
 +            
 +                "Name": "Root", 
 +                "Keys": [
                     {                     {
-                        "Protocol": "tcp", +                        "ID": "d4074334a4ff5a9a43ebd1320ad77c2df88c990ec812f90eb045c603c01ab698"
-                        "TargetPort": 80, +
-                        "PublishedPort": 80, +
-                        "PublishMode": "ingress"+
                     }                     }
                 ]                 ]
             },             },
-            "Ports": [ +            { 
-                +                "Name": "Repository", 
-                    "Protocol": "tcp", +                "Keys": [ 
-                    "TargetPort": 80, +                    
-                    "PublishedPort": 80, +                        "ID": "168c754ea8f36ce7fbcbe2299b6d91fc0f4d594c9ed9b86916687b618d8438ac
-                    "PublishMode": "ingress" +                    } 
-                +                ] 
-            ], +            } 
-            "VirtualIPs": [ +        ]
-                +
-                    "NetworkID": "44ozn3vtg23zkksrvloxuulcl", +
-                    "Addr": "10.11.0.1/16" +
-                } +
-            ] +
-        }+
     }     }
 ] ]
 </code> </code>
  
-Vérifiez maintenant que les conteneurs se trouvent dans le réseau **my-ingress** :+<WRAP center round important 50%> 
 +**Important** : Notez que les clefs utilisées sont les mêmes pour les deux images.  
 +</WRAP>
  
 <code> <code>
-root@manager:~# docker inspect my-ingress+root@manager:~/nottrusted# docker trust inspect <votre_compte>/otherimage:latest
 [ [
     {     {
-        "Name": "my-ingress", +        "Name": "<votre_compte>/otherimage:latest", 
-        "Id""l11ucu5ufjfwwz6e0umtygdqy", +        "SignedTags": [ 
-        "Created": "2020-03-10T11:02:38.278429829+01:00", +            { 
-        "Scope": "swarm", +                "SignedTag": "latest", 
-        "Driver": "overlay", +                "Digest": "1183c62a5d31e202b5f5f528e9e7cdc36140aa3212c938e1d471c6b3b59f01bc", 
-        "EnableIPv6": false, +                "Signers": [ 
-        "IPAM":+                    "Repo Admin
-            "Driver": "default", +                ]
-            "Options": null, +
-            "Config": [ +
-                { +
-                    "Subnet": "10.11.0.0/16", +
-                    "Gateway": "10.11.0.2" +
-                } +
-            +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": true, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "6f0168ff5153b899af31098740de34997b12417ef7c0f3824938edf79b2bca7f": +
-                "Name": "my-nginx.3.me50mkhd11ykwz7aj07znloh1", +
-                "EndpointID": "41531d43496f4723cb62cad1d57c5a088faebe79c430d04a1765022e31d8ae17", +
-                "MacAddress": "02:42:0a:0b:00:05", +
-                "IPv4Address": "10.11.0.5/16", +
-                "IPv6Address": "" +
-            }, +
-            "my-ingress-sbox":+
-                "Name": "my-ingress-endpoint", +
-                "EndpointID": "0205796eeb005ef77b3ea382fd1e72c312a58fd717b5a79ca6cacc7e090068e6", +
-                "MacAddress": "02:42:0a:0b:00:0a", +
-                "IPv4Address": "10.11.0.10/16", +
-                "IPv6Address": ""+
             }             }
-        }+        ]
-        "Options": +        "Signers": []
-            "com.docker.network.driver.mtu": "1200", +        "AdministrativeKeys": [
-            "com.docker.network.driver.overlay.vxlanid_list": "4100" +
-        }, +
-        "Labels": {}+
-        "Peers": [+
             {             {
-                "Name": "9a00e8bc72fe", +                "Name": "Root", 
-                "IP": "10.0.2.62"+                "Keys": 
 +                    { 
 +                        "ID": "26f00698f51be2824c6fe85a14722c279bbd487125fe8fa18c0fc8f76dd6280d" 
 +                    } 
 +                ]
             },             },
             {             {
-                "Name": "3ea669d48ca2", +                "Name": "Repository", 
-                "IP": "10.0.2.64"+                "Keys": 
 +                    { 
 +                        "ID": "7b13d02d74264624fb201e7ae13ae694286b9f761aa86adddefd0408c7234a58" 
 +                    } 
 +                ] 
 +            } 
 +        ] 
 +    } 
 +
 +</code> 
 + 
 +<WRAP center round important 50%> 
 +**Important** : Notez que les clefs utilisées sont différentes 
 +</WRAP> 
 + 
 +===Supprimer une Signature=== 
 + 
 +Dernièrement il est possible de supprimer la signature d'une image avec la commande **docker trust revoke** : 
 + 
 +<code> 
 +root@manager:~# docker trust revoke <votre_compte>/docker:alpine 
 +Enter passphrase for repository key with ID 168c754:  
 +Successfully deleted signature for <votre_compte>/docker:alpine 
 +root@manager:~# docker trust inspect <votre_compte>/docker:alpine 
 +
 +    { 
 +        "Name": "<votre_compte>/docker:alpine", 
 +        "SignedTags": [], 
 +        "Signers": [], 
 +        "AdministrativeKeys":
 +            { 
 +                "Name": "Root", 
 +                "Keys":
 +                    { 
 +                        "ID": "d4074334a4ff5a9a43ebd1320ad77c2df88c990ec812f90eb045c603c01ab698" 
 +                    } 
 +                ]
             },             },
             {             {
-                "Name": "f30e39df1704", +                "Name": "Repository", 
-                "IP": "10.0.2.63"+                "Keys": 
 +                    { 
 +                        "ID": "168c754ea8f36ce7fbcbe2299b6d91fc0f4d594c9ed9b86916687b618d8438ac" 
 +                    } 
 +                ]
             }             }
         ]         ]
Ligne 1881: Ligne 1720:
 </code> </code>
  
-Supprimez maintenant le service **my-nginx** :+<WRAP center round important 50%> 
 +**Important** : Il existe un autre mécanisme de signatures cryptographiques qui permet de certifier le contenu des images mises à disposition sur une Registry. Appelé **Notary**, ce système a été développé par la communauté Docker et intègre une partie de la spécification de **[[https://theupdateframework.io/|The Update Framework]]** (TUF). Pour plus d'informations, consultez cet **[[https://blog.octo.com/la-signature-dimages-docker-sur-une-registry-avec-notary/#:~:text=Notary%20est%20un%20m%C3%A9canisme%20de,environnement%20de%20production%20par%20exemple|article]]**. 
 +</WRAP> 
 + 
 +=====LAB #9 - Sécurisation du Socket du Daemon Docker===== 
 + 
 +Par défaut le daemon Docker peut être contacté en utilisant un socket Unix local ce qui implique qu'il faut une connexion SSH vers l'hôte Docker. Docker peut cependant utiliser un socket http. 
 + 
 +Pour pouvoir contacter de daemon Docker via le réseau d'une manière sécurisée il faut installer, configurer et activer le support TLS grâce aux options **tlsverify** et **tlscacert**. 
 + 
 +La configuration implique que : 
 + 
 +  * pour le daemon Docker, seules les connections en provenance de clients authentifiés par un certificat signé par l'**[[https://fr.wikipedia.org/wiki/Autorit%C3%A9_de_certification|autorité de certification]]** (CA) du serveur seront acceptées, 
 +  * pour le client, il ne peut que connecter aux serveurs ayant un certificat signé par le CA du serveur. 
 + 
 +La mise en place nécessite **openssl** :
  
 <code> <code>
-root@manager:~# docker service rm my-nginx +root@manager:~# which openssl 
-my-nginx+/usr/bin/openssl
 </code> </code>
  
-=====LAB #3 Gestion d'une Architecture de Microservices=====+====9.1 Création du Certificat de l'Autorité de Certification====
  
-Vous allez mettre en place une application simple, appelé **demo-voting-app** et développé par Docker, sous forme de microservices :+Commencez par créer une clef privée **ca-key.pem** pour le CA :
  
-{{ :elearning:workbooks:debian:6:avance:app.png?direct&400 |}}+<code> 
 +root@manager:~# openssl genrsa -aes256 -out ca-key.pem 4096 
 +Generating RSA private key, 4096 bit long modulus 
 +......................................................................................................................++++ 
 +...............................................................................................................................................................++++ 
 +e is 65537 (0x010001) 
 +Enter pass phrase for ca-key.pem:fenestros 
 +Verifying - Enter pass phrase for ca-key.pem:fenestros 
 +</code>
  
-Dans cette application le conteneur **voting-app** permet de voter pour des **chats** ou des **chiens**. Cette application tourne sous Python et fournit une interface HTML :+Ensuite, créez le certificat **ca.pem** du CA :
  
-{{ :elearning:workbooks:debian:6:avance:kubernetes15.png?direct&800 |}}+<code> 
 +root@manager:~# openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem 
 +Enter pass phrase for ca-key.pem:fenestros 
 +You are about to be asked to enter information that will be incorporated 
 +into your certificate request. 
 +What you are about to enter is what is called a Distinguished Name or a DN. 
 +There are quite a few fields but you can leave some blank 
 +For some fields there will be a default value, 
 +If you enter '.', the field will be left blank. 
 +----- 
 +Country Name (2 letter code) [AU]:GB 
 +State or Province Name (full name) [Some-State]:SURREY 
 +Locality Name (eg, city) []:ADDLESTONE 
 +Organization Name (eg, company) [Internet Widgits Pty Ltd]:I2TCH LIMITED 
 +Organizational Unit Name (eg, section) []:TRAINING 
 +Common Name (e.g. server FQDN or YOUR name) []:manager.i2tch.loc 
 +Email Address []:infos@i2tch.co.uk 
 +</code>
  
-Lors de la vote, le résultat de celle-ci est stocké dans **Redis** dans une base de données en mémoire. Le résultat est ensuite passé au conteneur **Worker** qui tourne sous .NET et qui met à jour la base de données persistante dans le conteneur **db** qui tourne sous PostgreSQL.+====9.2 Création du Certificat du Serveur Hôte du Daemon Docker====
  
-L'application **result-app** qui tourne sous NodeJS lit ensuite la table dans la base de données PostgreSQL et affiche le résultat sous forme HTML :+Les clefs du CA ayant été créées, créez une clef **server-key.pem** pour le serveur hôte du daemon Docker :
  
-{{ :elearning:workbooks:debian:6:avance:kubernetes16.png?direct&800 |}}+<code> 
 +root@manager:~# openssl genrsa -out server-key.pem 4096 
 +Generating RSA private key, 4096 bit long modulus 
 +.................................................................................................................................++++ 
 +...........................++++ 
 +e is 65537 (0x010001) 
 +</code>
  
-====3.Mise en Place avec Docker Swarm avec des réseaux Overlay====+Créez ensuite un **[[https://fr.wikipedia.org/wiki/Demande_de_signature_de_certificat|Certificate Signing Request]]** (CSR) **server.csr** : 
 + 
 +<code> 
 +root@manager:~# echo $HOSTNAME 
 +manager.i2tch.loc 
 +root@manager:~# openssl req -subj "/CN=`echo $HOSTNAME`" -sha256 -new -key server-key.pem -out server.csr 
 +</code>
  
-Cette application peut être mise en place sous docker swarm avec avec la commande **docker stack**. Un **stack** est un groupe de services. Premièrement, vérifiez l'état du Swarm :+Une connexion TLS peut être effectuée en utilisant un FQDN ou une adresse IP. Pour cette raison, créez le fichier **extfile.cnf** :
  
 <code> <code>
-root@manager:~# docker node ls +root@manager:~# echo subjectAltName = DNS:`echo $HOSTNAME`,IP:10.0.2.62,IP:127.0.0.1 >> extfile.cnf
-ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION +
-b85hxlixbr1mh1txd1hrfe4us *   manager.i2tch.loc   Ready               Active              Leader              19.03.+
-4sui75vvdhmet4qvt0zbvzlzl     worker1.i2tch.loc   Ready               Active                                  19.03.4 +
-lbjtg5o9kw3x6xg7frm07jfuw     worker2.i2tch.loc   Ready               Active                                  19.03.4+
 </code> </code>
  
-Téléchargez maintenant le fichier **docker-stack.yml** :+Fixez l'attribut étendu de l'utilisation de la clef du daemon à **serverAuth** :
  
 <code> <code>
-root@manager:~# curl -O https://raw.githubusercontent.com/docker/example-voting-app/master/docker-stack.yml +root@manager:~# echo extendedKeyUsage = serverAuth >> extfile.cnf
-  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current +
-                                 Dload  Upload   Total   Spent    Left  Speed +
-100  1707  100  1707    0       2030      0 --:--:-- --:--:-- --:--:--  2029+
 </code> </code>
  
-Consultez le fichier téléchargé :+Vérifiez que votre fichier a été correctement créé :
  
 <code> <code>
-root@manager:~# cat docker-stack.yml  +root@manager:~# cat extfile.cnf  
-version"3" +subjectAltName = DNS:manager.i2tch.loc,IP:10.0.2.62,IP:127.0.0.1 
-services:+extendedKeyUsage = serverAuth 
 +</code>
  
-  redis: +Signez maintenant le CSR du serveur **server.csr** avec la clef privée du CA **ca-key.pem** afin de produire le certificat du serveur **server-cert.pem** :
-    image: redis:alpine +
-    networks: +
-      frontend +
-    deploy: +
-      replicas: 1 +
-      update_config: +
-        parallelism:+
-        delay: 10s +
-      restart_policy: +
-        condition: on-failure +
-  db: +
-    image: postgres:9.+
-    environment: +
-      POSTGRES_USER: "postgres" +
-      POSTGRES_PASSWORD: "postgres" +
-    volumes: +
-      db-data:/var/lib/postgresql/data +
-    networks: +
-      - backend +
-    deploy: +
-      placement: +
-        constraints: [node.role == manager] +
-  vote: +
-    image: dockersamples/examplevotingapp_vote:before +
-    ports: +
-      - 5000:80 +
-    networks: +
-      - frontend +
-    depends_on: +
-      - redis +
-    deploy: +
-      replicas: 2 +
-      update_config: +
-        parallelism:+
-      restart_policy: +
-        condition: on-failure +
-  result: +
-    image: dockersamples/examplevotingapp_result:before +
-    ports: +
-      - 5001:80 +
-    networks: +
-      - backend +
-    depends_on: +
-      - db +
-    deploy: +
-      replicas: 1 +
-      update_config: +
-        parallelism:+
-        delay: 10s +
-      restart_policy: +
-        condition: on-failure+
  
-  worker: +<code> 
-    imagedockersamples/examplevotingapp_worker +root@manager:~# openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf 
-    networks: +Signature ok 
-      frontend +subject=CN = manager.i2tch.loc 
-      backend +Getting CA Private Key 
-    depends_on: +Enter pass phrase for ca-key.pem:fenestros 
-      db +</code>
-      redis +
-    deploy: +
-      mode: replicated +
-      replicas: 1 +
-      labels: [APP=VOTING] +
-      restart_policy: +
-        condition: on-failure +
-        delay10s +
-        max_attempts:+
-        window: 120s +
-      placement: +
-        constraints: [node.role == manager]+
  
-  visualizer: +====9.3 - Création du Certificat du Client====
-    image: dockersamples/visualizer:stable +
-    ports: +
-      - "8080:8080" +
-    stop_grace_period: 1m30s +
-    volumes: +
-      - "/var/run/docker.sock:/var/run/docker.sock" +
-    deploy: +
-      placement: +
-        constraints: [node.role == manager]+
  
-networks: +Créez ensuite la clef privée **key.pem** du client qui se connectera au daemon à partir du réseau :
-  frontend: +
-  backend:+
  
-volumes: +<code> 
-  db-data:+root@manager:~# openssl genrsa -out key.pem 4096 
 +Generating RSA private key, 4096 bit long modulus 
 +...................................................................................................................................++++ 
 +...............++++ 
 +e is 65537 (0x010001)
 </code> </code>
  
-Dans ce fichier on peut constater 6 services, **redis**, **db**, **vote**, **result**, **worker** et **visualizer**. Les 5 premiers services forment ensemble l'application tandis que le service **visualizer** nous permettra de voir comment l'application a été mise en place.+Modifiez l'entrée pour l'adresse 10.0.2.45 dans le fichier **/etc/hosts** du manager :
  
-Dans un premier temps, regardez la clef **deploy** du service **worker** :+<code> 
 +root@manager:~# vi /etc/hosts 
 +root@manager:~# cat /etc/hosts 
 +127.0.0.1 localhost 
 +10.0.2.46 debian11.i2tch.loc debian11 
 +10.0.2.45 myregistry.i2tch.loc    myregistry 
 +10.0.2.62 manager.i2tch.loc manager 
 +10.0.2.63 worker1.i2tch.loc worker1 
 +10.0.2.64 worker2.i2tch.loc worker2
  
-<file> +# The following lines are desirable for IPv6 capable hosts 
-... +::1     localhost ip6-localhost ip6-loopback 
-    deploy: +ff02::1 ip6-allnodes 
-      mode: replicated +ff02::2 ip6-allrouters 
-      replicas: 1 +</code>
-      labels[APP=VOTING] +
-      restart_policy: +
-        condition: on-failure +
-        delay10s +
-        max_attempts+
-        window: 120s +
-      placement: +
-        constraints: [node.role == manager] +
-... +
-</file>+
  
-La clef **deploy** permet de spécifier des options lors du déploiement du service :+Créez ensuite le CSR du client **client.csr** :
  
-  * **mode** Il existe deux types de services. **Replicated** où on spécifie le nombre d'instances que Docker doit mettre en place sur les conteneurs **disponibles** et **Global** qui implique que Docker démarrera une instance du service sur chaque conteneur chaque fois qu'un conteneur devient disponible. +<code> 
-  * **replicas** - spécifie le nombre de replicas +root@manager:~# openssl req -subj '/CN=myregistry.i2tch.loc' -new -key key.pem -out client.csr 
-  * **restart_policy** spécifie ce qui se passe en cas d'arrêt du service. Dans le cas ci-dessus, docker va essayer de re-démarrer le service **3** fois (**max_attempts**) à des intervalles de **10** secondes (**delay**) en attendant chaque fois **120** secondes (**window**) pour constater si le service s'est effectivement re-démarré, +</code>
-  * **placement** - spécifie où le service doit être démarré.+
  
-Déployez maintenant le stack :+Fixez l'attribut étendu de l'utilisation de la clef du client à **clientAuth** :
  
 <code> <code>
-root@manager:~# docker stack deploy -c docker-stack.yml app +root@manager:~# echo extendedKeyUsage = clientAuth > extfile-client.cnf
-Creating network app_backend +
-Creating network app_default +
-Creating network app_frontend +
-Creating service app_worker +
-Creating service app_visualizer +
-Creating service app_redis +
-Creating service app_db +
-Creating service app_vote +
-Creating service app_result+
 </code> </code>
  
-<WRAP center round important 60%> +Signez le CSR du client **client.csr** avec la clef privée du CA **ca-key.pem** afin de créer le certificat du client **cert.pem** :
-**Important** - Notez que chaque réseau et chaque service a comme préfixe le nom de l'application **app**. +
-</WRAP>+
  
-Consultez maintenant l'état du stack :+<code> 
 +root@manager:~# openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf 
 +Signature ok 
 +subject=CN = myregistry.i2tch.loc 
 +Getting CA Private Key 
 +Enter pass phrase for ca-key.pem:fenestros 
 +</code> 
 + 
 +Vérifiez la présence des fichiers générés :
  
 <code> <code>
-root@manager:~# docker stack ls +root@manager:~# ls -l 
-NAME                SERVICES            ORCHESTRATOR +total 60 
-app                                   Swarm+-rw------- 1 root root 3326 nov.  11 10:53 ca-key.pem 
 +-rw-r--r-- 1 root root 2163 nov.  11 10:57 ca.pem 
 +-rw-r--r-- 1 root root   17 nov.  11 11:15 ca.srl 
 +-rw-r--r-- 1 root root 1907 nov.  11 11:15 cert.pem 
 +-rw-r--r-- 1 root root 1594 nov.  11 11:12 client.csr 
 +drwxr-xr-x 5 root root 4096 nov.   8 12:58 docker-bench-security 
 +-rw-r--r-- 1 root root 1707 nov.   8 12:35 docker-stack.yml 
 +-rw-r--r-- 1 root root   30 nov.  11 11:13 extfile-client.cnf 
 +-rw-r--r-- 1 root root   95 nov.  11 11:06 extfile.cnf 
 +-rw------- 1 root root 3243 nov.  11 11:10 key.pem 
 +drwxr-xr-x 2 root root 4096 nov.  10 17:21 nottrusted 
 +-rw-r--r-- 1 root root 1964 nov.  11 11:08 server-cert.pem 
 +-rw-r--r-- 1 root root 1594 nov.  11 11:01 server.csr 
 +-rw------- 1 root root 3243 nov.  11 10:59 server-key.pem 
 +-rw-r--r-- 1 root root  882 oct.  27 15:46 stats
 </code> </code>
  
-Consultez ensuite l'état des services :+Supprimez les fichiers ayant déjà été utilisés, à savoir les deux CSR et les deux fichiers des extensions :
  
 <code> <code>
-root@manager:~# docker service ls +root@manager:~# rm -v client.csr server.csr extfile.cnf extfile-client.cnf 
-ID                  NAME                MODE                REPLICAS            IMAGE                                          PORTS +'client.csr' supprimé 
-d0i4ac4fshw0        app_db              replicated          1/1                 postgres:9.4                                    +'server.csr' supprimé 
-funp5kboyip1        app_redis           replicated          1/1                 redis:alpine                                    +'extfile.cnf' supprimé 
-dpdkc49oj671        app_result          replicated          1/1                 dockersamples/examplevotingapp_result:before   *:5001->80/tcp +'extfile-client.cnf' supprimé
-vrkahv38v5mn        app_visualizer      replicated          1/1                 dockersamples/visualizer:stable                *:8080->8080/tcp +
-t4u16cpdrx21        app_vote            replicated          2/2                 dockersamples/examplevotingapp_vote:before     *:5000->80/tcp +
-so40eljbcviy        app_worker          replicated          1/1                 dockersamples/examplevotingapp_worker:latest  +
 </code> </code>
  
-<WRAP center round important 60%> +Modifiez les permissions des clefs privées :
-**Important** Notez que la configuration du service **visualizer** a exposé le port **8080**. De cette façon, ce service est disponible sur le port 8080 de chaque nœud dans la swarm. +
-</WRAP>+
  
-Retournez à la fenêtre d'Apache Guacamole dans le navigateur de **votre** ordinateurCliquez sur la connexion **TraineeXX_VNC**Lancez ensuite un navigateur Internet dans la machine virtuelle **debian9**Naviguez à l'URL http://10.0.2.62:8080 ou http://10.0.2.42:8080 selon le cas et consultez le service **visualizer** :+<code> 
 +root@manager:~# chmod -v 0400 ca-key.pem key.pem server-key.pem 
 +le mode de 'ca-key.pem' a été modifié de 0600 (rw-------) en 0400 (r--------) 
 +le mode de 'key.pem' a été modifié de 0600 (rw-------) en 0400 (r--------) 
 +le mode de 'server-key.pem' a été modifié de 0600 (rw-------) en 0400 (r--------) 
 +</code>
  
-{{ :elearning:workbooks:docker:docker001.png?direct&600 |}}+Ainsi que les permissions des certificats :
  
-Comme vous pouvez constater, conformément au fichier **docker-stack.yml**, les trois conteneurs **db**, **worker** et **visualizer** ont été démarrés sur le nœud manager.+<code> 
 +root@manager:~# chmod -v 0444 ca.pem server-cert.pem cert.pem 
 +le mode de 'ca.pem'été modifié de 0644 (rw-r--r--) en 0444 (r--r--r--) 
 +le mode de 'server-cert.pem' a été modifié de 0644 (rw-r--r--) en 0444 (r--r--r--) 
 +le mode de 'cert.pem' a été modifié de 0644 (rw-r--r--) en 0444 (r--r--r--) 
 +</code>
  
-Retournez à votre connexion SSH et consultez l'état des réseaux dans les trois nœuds :+Arrêtez et supprimez le conteneur **mysql** :
  
 <code> <code>
-root@manager:~# docker network ls +root@manager:~# docker stop mysql 
-NETWORK ID          NAME                               DRIVER              SCOPE +mysql 
-sw489bb290zb        app_backend                        overlay             swarm +root@manager:~# docker rm mysql 
-smuxoglyudpo        app_default                        overlay             swarm +mysql
-lfizui95od90        app_frontend                       overlay             swarm +
-24be8a0f0ef5        bridge                             bridge              local +
-d4c9b0c9437a        docker_gwbridge                    bridge              local +
-f3cb3bc3c581        host                               host                local +
-x7l4mk4ldb75        my-ingress                         overlay             swarm +
-de563e30d473        none                               null                local+
 </code> </code>
  
-<WRAP center round important 60%> +====9.4 - Démarrage du Daemon Docker avec une Invocation Directe==== 
-**Important** : Notez que les trois réseaux créés sont de type **overlay**+ 
-</WRAP>+Arrêtez et désactivez le service Docker :
  
 <code> <code>
-root@worker1:~# docker network ls +root@manager:~# systemctl stop docker 
-NETWORK ID          NAME                DRIVER              SCOPE +Warning: Stopping docker.service, but it can still be activated by: 
-qhysvpoolsw0        app_frontend        overlay             swarm +  docker.socket 
-f9a69d02de3b        bridge              bridge              local +root@manager:~# systemctl disable docker 
-ee22b3e623ca        docker_gwbridge     bridge              local +Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install. 
-f3cb3bc3c581        host                host                local +Executing: /lib/systemd/systemd-sysv-install disable docker
-x7l4mk4ldb75        my-ingress          overlay             swarm +
-de563e30d473        none                null                local+
 </code> </code>
  
-<WRAP center round important 60%> +Lancez un invocation directe de **dockerd** afin que le daemon n'acceptent que des connexions de clients fournissant un certificat signé par le CA :
-**Important** : Notez que seul le réseau **app_frontend** a été créé dans **worker1**. +
-</WRAP>+
  
 <code> <code>
-root@worker2:~# docker network ls +root@manager:~# dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:2376 & 
-NETWORK ID          NAME                DRIVER              SCOPE +[1] 1868 
-s4gbgi4isp1i        app_backend         overlay             swarm +root@manager:~# INFO[2019-11-11T12:01:43.638540628+01:00] Starting up                                   
-qhysvpoolsw0        app_frontend        overlay             swarm +INFO[2019-11-11T12:01:43.639187816+01:00] User namespaces: ID ranges will be mapped to subuid/subgid ranges of: dockremap:dockremap  
-0e6c118bf3fd        bridge              bridge              local +INFO[2019-11-11T12:01:43.641133642+01:00] User namespaces: ID ranges will be mapped to subuid/subgid ranges of: dockremap:dockremap  
-0ce1d8369c29        docker_gwbridge     bridge              local +INFO[2019-11-11T12:01:43.646949782+01:00] parsed scheme: "unix"                         module=grpc 
-f3cb3bc3c581        host                host                local +INFO[2019-11-11T12:01:43.648299396+01:00] scheme "unix" not registered, fallback to default scheme  module=grpc 
-x7l4mk4ldb75        my-ingress          overlay             swarm +INFO[2019-11-11T12:01:43.648633123+01:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0  <nil>}] <nil> module=grpc 
-de563e30d473        none                null                local+INFO[2019-11-11T12:01:43.650756512+01:00] ClientConn switching balancer to "pick_first"  module=grpc 
 +INFO[2019-11-11T12:01:43.656738368+01:00] parsed scheme: "unix"                         module=grpc 
 +INFO[2019-11-11T12:01:43.657165991+01:00] scheme "unix" not registered, fallback to default scheme  module=grpc 
 +INFO[2019-11-11T12:01:43.660938142+01:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0  <nil>}] <nil> module=grpc 
 +INFO[2019-11-11T12:01:43.661309281+01:00] ClientConn switching balancer to "pick_first"  module=grpc 
 +INFO[2019-11-11T12:01:43.663242717+01:00] [graphdriver] using prior storage driver: overlay2  
 +WARN[2019-11-11T12:01:43.681131788+01:00] Your kernel does not support cgroup rt period  
 +WARN[2019-11-11T12:01:43.681397622+01:00] Your kernel does not support cgroup rt runtime  
 +INFO[2019-11-11T12:01:43.681845166+01:00] Loading containers: start.                    
 +INFO[2019-11-11T12:01:43.824330430+01:00] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address  
 +INFO[2019-11-11T12:01:43.887849374+01:00] Loading containers: done.                     
 +INFO[2019-11-11T12:01:43.908567890+01:00] Docker daemon                                 commit=9013bf583a graphdriver(s)=overlay2 version=19.03.4 
 +INFO[2019-11-11T12:01:43.908851991+01:00] Daemon has completed initialization           
 +INFO[2019-11-11T12:01:43.969272646+01:00] API listen on [::]:2376                       
 +[Entrée] 
 +root@manager:~#
 </code> </code>
  
-<WRAP center round important 60%> +Vérifiez que le processus tourne :
-**Important** : Notez que les deux réseaux **app_frontend** et **app_backend** ont été créés dans **worker2**. +
-</WRAP>+
  
-Consultez les informations concernant le réseau **app_backend** :+<code> 
 +root@manager:~# ps aux | grep docker 
 +root      1868  0.2  4.0 421876 82236 pts/0    Sl   12:01   0:00 dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:2376 
 +root      1995  0.0  0.0  12780   964 pts/0    S+   12:02   0:00 grep docker 
 +</code> 
 + 
 +Installez le paquet **net-tools** qui contient le binaire **netstat** :
  
 <code> <code>
-root@manager:~# docker inspect app_backend +root@manager:~# apt install -y net-tools
-+
-    { +
-        "Name": "app_backend", +
-        "Id": "s4gbgi4isp1i5wjpgnf4uci2a", +
-        "Created": "2019-11-03T17:30:56.822222239+01:00", +
-        "Scope": "swarm", +
-        "Driver": "overlay", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "10.0.3.0/24", +
-                    "Gateway": "10.0.3.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "7d0b28e4e1828b437af1a41f322acb5cf19afc25c42303986dd2c7b4d5aea568":+
-                "Name": "app_db.1.s6g6w47k532rvaeoyske8as9i", +
-                "EndpointID": "c26795c837f6dc736a3f9be34525ae505e9db6381a2144bb62087b3ee6c7ff25", +
-                "MacAddress": "02:42:0a:00:03:03", +
-                "IPv4Address": "10.0.3.3/24", +
-                "IPv6Address": "" +
-            }, +
-            "ef7227281d297b001bb0f60ac81a0c9926e8fb663a7f43eb201cced632dc5564":+
-                "Name": "app_worker.1.38kniuqoe1vfyonwdcytlhpqo", +
-                "EndpointID": "990065eec5062ff159e82bc1e4666fd098d5597439221995af4f01040ab24599", +
-                "MacAddress": "02:42:0a:00:03:09", +
-                "IPv4Address": "10.0.3.9/24", +
-                "IPv6Address": "" +
-            }, +
-            "lb-app_backend":+
-                "Name": "app_backend-endpoint", +
-                "EndpointID": "913845cbab9a6c3011eaaa87fcc66f10268b5e11554be9f1a20b1078f7b9b8a4", +
-                "MacAddress": "02:42:0a:00:03:04", +
-                "IPv4Address": "10.0.3.4/24", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options":+
-            "com.docker.network.driver.overlay.vxlanid_list": "4101" +
-        }, +
-        "Labels":+
-            "com.docker.stack.namespace": "app" +
-        }, +
-        "Peers":+
-            { +
-                "Name": "377986fb7d5a", +
-                "IP": "10.0.2.62" +
-            }, +
-            { +
-                "Name": "5cc4b863da9f", +
-                "IP": "10.0.2.64" +
-            } +
-        ] +
-    } +
-]+
 </code> </code>
  
-<WRAP center round important 60%> +Vérifiez que le port **2376** est à l'écoute :
-**Important** : Notez que le réseau est **10.0.3.0/24** et la passerelle **10.0.3.1**. +
-</WRAP>+
  
-Consultez les informations concernant le réseau **app_frontend** :+<code> 
 +root@manager:~# netstat -anp | grep 2376 
 +tcp6            0 :::2376                 :::                   LISTEN      1868/dockerd  
 +</code> 
 + 
 +====9.5 - Configuration du Client==== 
 + 
 +Transférez ensuite le certificat du CA ainsi que le certificat et la clef privée du client vers la VM **10.0.2.45** :
  
 <code> <code>
-root@manager:~# docker inspect app_frontend +root@manager:~# scp ca.pem key.pem cert.pem trainee@10.0.2.45:/home/trainee
-+The authenticity of host '10.0.2.45 (10.0.2.45)' can't be established. 
-    { +ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. 
-        "Name": "app_frontend", +Are you sure you want to continue connecting (yes/no)? yes 
-        "Id": "qhysvpoolsw0318gsubbvd3rx", +WarningPermanently added '10.0.2.45' (ECDSA) to the list of known hosts. 
-        "Created": "2019-11-03T17:31:27.354293132+01:00", +trainee@10.0.2.45's passwordtrainee 
-        "Scope": "swarm", +ca.pem                                                                                                                                 100% 2163   917.8KB/s   00:00     
-        "Driver": "overlay", +key.pem                                                                                                                                100% 3243     3.0MB/s   00:00    
-        "EnableIPv6": false, +cert.pem                                                                                                                               100% 1907   921.7KB/s   00:00 
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "10.0.2.0/24", +
-                    "Gateway": "10.0.2.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "ef7227281d297b001bb0f60ac81a0c9926e8fb663a7f43eb201cced632dc5564":+
-                "Name": "app_worker.1.38kniuqoe1vfyonwdcytlhpqo", +
-                "EndpointID": "3fad9773920412464b6aeee59f8d9ffc5aac2e937b88dc384268591cf7d21fb9", +
-                "MacAddress": "02:42:0a:00:02:0a", +
-                "IPv4Address": "10.0.2.10/24", +
-                "IPv6Address""" +
-            }, +
-            "lb-app_frontend":+
-                "Name": "app_frontend-endpoint", +
-                "EndpointID": "343887373c1f92ac08b271ee52dd160089eeed7cad13b7924e438919254b6442", +
-                "MacAddress": "02:42:0a:00:02:0b", +
-                "IPv4Address""10.0.2.11/24", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options":+
-            "com.docker.network.driver.overlay.vxlanid_list""4100" +
-        }, +
-        "Labels":+
-            "com.docker.stack.namespace""app" +
-        }, +
-        "Peers":+
-            { +
-                "Name": "0e21ba1bbfab", +
-                "IP": "10.0.2.63" +
-            }, +
-            { +
-                "Name""5cc4b863da9f", +
-                "IP": "10.0.2.64" +
-            }, +
-            { +
-                "Name""377986fb7d5a", +
-                "IP": "10.0.2.62" +
-            } +
-        ] +
-    } +
-]+
 </code> </code>
  
-<WRAP center round important 60%> +Lancez la commande **docker version** sur la VM **10.0.2.45** :
-**Important** : Notez que le réseau est **10.0.2.0/24** et la passerelle **10.0.2.1**+
-</WRAP>+
  
-Consultez les informations concernant le réseau **app_default** :+<code> 
 +trainee@myregistry:~$ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=manager.i2tch.loc:2376 version 
 +Client: Docker Engine - Community 
 + Version:           19.03.4 
 + API version:       1.40 
 + Go version:        go1.12.10 
 + Git commit:        9013bf583a 
 + Built:             Fri Oct 18 15:52:34 2019 
 + OS/Arch:           linux/amd64 
 + Experimental:      false 
 + 
 +Server: Docker Engine - Community 
 + Engine: 
 +  Version:          19.03.4 
 +  API version:      1.40 (minimum version 1.12) 
 +  Go version:       go1.12.10 
 +  Git commit:       9013bf583a 
 +  Built:            Fri Oct 18 15:51:05 2019 
 +  OS/Arch:          linux/amd64 
 +  Experimental:     false 
 + containerd: 
 +  Version:          1.2.10 
 +  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339 
 + runc: 
 +  Version:          1.0.0-rc8+dev 
 +  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657 
 + docker-init: 
 +  Version:          0.18.0 
 +  GitCommit:        fec3683 
 +</code> 
 + 
 +Afin de faciliter l'utilisation des commandes sur le serveur à partir de myregistry, créez le répertoire **~/.docker** :
  
 <code> <code>
-root@manager:~# docker inspect app_default +trainee@myregistry:~$ mkdir -pv ~/.docker 
-+mkdircréation du répertoire '/home/trainee/.docker'
-    { +
-        "Name": "app_default", +
-        "Id": "z62t49w18wl2mrboa92tunrhq", +
-        "Created": "2019-10-28T17:22:44.724040846+01:00", +
-        "Scope": "swarm", +
-        "Driver": "overlay", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "10.0.1.0/24", +
-                    "Gateway": "10.0.1.1" +
-                } +
-            ] +
-        }, +
-        "Internal"false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "2032d9eae353130e283a91bc09b65b4a84b7e8f5602a466f4ea1bd9c64e964dc":+
-                "Name": "app_visualizer.1.nbf78cn5g37dmu0fwrxt7kbrg", +
-                "EndpointID": "d5274ff057c9d9af0288efb7f9bfed3a5ca1b3e656e265ad343f52c0b1c161f5", +
-                "MacAddress": "02:42:0a:00:01:03", +
-                "IPv4Address": "10.0.1.3/24", +
-                "IPv6Address": "" +
-            }, +
-            "lb-app_default":+
-                "Name": "app_default-endpoint", +
-                "EndpointID": "6afb8909d94528633e4150054311f645790280b1ab1c686c43e865ba97ec3df9", +
-                "MacAddress": "02:42:0a:00:01:04", +
-                "IPv4Address": "10.0.1.4/24", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options":+
-            "com.docker.network.driver.overlay.vxlanid_list": "4099" +
-        }, +
-        "Labels":+
-            "com.docker.stack.namespace": "app" +
-        }, +
-        "Peers":+
-            { +
-                "Name": "377986fb7d5a", +
-                "IP": "10.0.2.62" +
-            } +
-        ] +
-    } +
-]+
 </code> </code>
  
-<WRAP center round important 60%> +Copiez ensuite les fichiers *.pem dans le répertoire **~/.docker** :
-**Important** : Notez que le réseau est **10.0.1.0/24** et la passerelle **10.0.1.1**+
-</WRAP>+
  
-Schématiquementla mise en place de l'application dans le Swarm est ainsi :+<code> 
 +trainee@myregistry:~$ cp -v {ca,cert,key}.pem ~/.docker 
 +'ca.pem' -> '/home/trainee/.docker/ca.pem' 
 +'cert.pem' -> '/home/trainee/.docker/cert.pem' 
 +'key.pem' -> '/home/trainee/.docker/key.pem' 
 +</code>
  
-{{ :elearning:workbooks:docker2:docker002.png?nolink |}}+Créez les deux variables **DOCKER_HOST** et **DOCKER_TLS_VERIFY** :
  
-Dernièrement, supprimez le stack :+<code> 
 +trainee@myregistry:~$ export DOCKER_HOST=tcp://manager.i2tch.loc:2376 DOCKER_TLS_VERIFY=1 
 +</code> 
 + 
 +Maintenant la connexion est sécurisée par défaut :
  
 <code> <code>
-root@manager:~docker stack ls +trainee@myregistry:~docker image ls 
-NAME                SERVICES            ORCHESTRATOR +REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
-app                                   Swarm +i2tch/docker        nottrusted          686e85ee76b8        19 hours ago        5.03MB 
-root@manager:~# docker stack rm app +i2tch/otherimage    latest              686e85ee76b8        19 hours ago        5.03MB 
-Removing service app_db +ubuntu              latest              775349758637        10 days ago         64.2MB 
-Removing service app_redis +nginx               latest              540a289bab6c        2 weeks ago         126MB 
-Removing service app_result +alpine              latest              965ea09ff2eb        2 weeks ago         5.55MB 
-Removing service app_visualizer +i2tch/docker        alpine              965ea09ff2eb        2 weeks ago         5.55MB 
-Removing service app_vote +mysql               latest              c8ee894bd2bd        3 weeks ago         456MB 
-Removing service app_worker +centos              latest              0f3e07c0138f        5 weeks ago         220MB 
-Removing network app_frontend +docker/trusttest    latest              cc7629d1331a        4 years ago         5.03MB
-Removing network app_backend +
-Removing network app_default +
-root@manager:~# docker ps -a +
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                 NAMES +
-d02c6115724c        alpine              "/bin/sh"                6 days ago          Exited (0) 6 days ago                               alpine1+
 </code> </code>
  
 ----- -----
-<html> + 
-<div align="center"> +Copyright © 2024 Hugh Norris.
-Copyright © 2021 Hugh NORRIS +
-</div> +
-</html>+
Menu