Différences

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

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
elearning:workbooks:debian:11:sec:l109 [2025/12/04 09:27] adminelearning:workbooks:debian:11:sec:l109 [2025/12/07 16:38] (Version actuelle) admin
Ligne 1: Ligne 1:
 ~~PDF:LANDSCAPE~~ ~~PDF:LANDSCAPE~~
- 
-OPENVPN 
-DNS et cryptographie : DNSSEC 
  
 Version : **2026.01** Version : **2026.01**
Ligne 8: Ligne 5:
 Dernière mise-à-jour : ~~LASTMOD~~ Dernière mise-à-jour : ~~LASTMOD~~
  
-======LDF407 Cryptologie======+======LDF409 Gestion de la Sécurité de Docker======
  
-=====Contenu du module=====+=====Contenu du Module=====
  
-  * **LDF407 Cryptologie** +  * **LDF409 Gestion de la Sécurité de Docker** 
-    * Contenu du module +    * Contenu du Module 
-    * Le Problématique +    * LAB #1 - Utilisation des Docker Secrets 
-    * LAB #1 - Utilisation de tcpdump +    LAB #2 Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker 
-      1.1 Utilisation +    LAB #3 Le Script docker-bench-security.sh 
-        * L'option -i +    LAB #4 Sécurisation de la Configuration de l'Hôte Docker 
-        L'option -+    * LAB #5 Sécurisation de la Configuration du daemon Docker 
-        * L'option -+      * 5.1 - Le Fichier /etc/docker/daemon.json 
-        * L'option -w +    LAB #6 - Sécurisation des Images et les Fichiers de Construction 
-        L'option -+    LAB #7 - Sécurisation du Container Runtime 
-      * 1.2 - Filtrage à l'écoute +    * LAB #Sécurisation des Images avec Docker Content Trust 
-    * Les Contre-Mesures +      * 8.1 - DOCKER_CONTENT_TRUST 
-      * Introduction à la cryptologie +      * 8.2 - DCT et la commande docker pull 
-        * Définitions +        * L'option disable-content-trust 
-        * Algorithmes à clé secrète +      * 8.3 - DCT et la commande docker push 
-          * Le Chiffrement Symétrique +      * 8.4 - DCT et la commande docker build 
-        Algorithmes à clef publique +        * Créer un deuxième Repositry 
-          * Le Chiffrement Asymétrique +        * Supprimer une Signature 
-          * La Clef de Session +    * LAB #Sécurisation du Socket du Daemon Docker 
-        Fonctions de Hachage +      * 9.1 - Création du Certificat de l'Autorité de Certification 
-        * Signature Numérique +      * 9.2 - Création du Certificat du Serveur Hôte du Daemon Docker 
-        * PKI +      * 9.3 - Création du Certificat du Client 
-          * Certificats X509 +      9.4 - Démarrage du Daemon Docker avec une Invocation Directe 
-    * LAB #Utilisation de GnuPG +      * 9.5 - Configuration du Client
-      * 2.1 - Présentation +
-      * 2.2 - Installation +
-      * 2.3 - Utilisation +
-        * Signer un message +
-        * Chiffrer un message +
-    * LAB #Mise en place de SSH et SCP +
-      * 3.1 - Introduction +
-        * SSH-1 +
-        * SSH-2 +
-        * L'authentification par mot de passe +
-        * L'authentification par clef asymétrique +
-      * 3.2 - Configuration du Serveur +
-      * 3.3 - Utilisation +
- 3.4 - Mise en place des clefs +
-      * 3.5 - Tunnels SSH +
-      * 3.6 - SCP +
-        * Introduction +
-        * Utilisation +
-    * LAB #4 - Mise en place d'un VPN avec OpenVPN +
-      * Présentation +
-      * Configuration commune au client et au serveur +
-      * Configuration du client +
-      * Configuration du serveur +
-      * Tests +
-        * Du client vers le serveur +
-        * Du serveur vers le client+
  
-=====Le Problématique=====+=====LAB #1 - Utilisation des Docker Secrets=====
  
-Le **sniffing** des paquets de données est possible sur un réseau utilisant une technologie de diffusion tel un réseau **Ethernet**. En effet certains protocoles ne cryptent pas les données avant de les envoyer dont :+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. 
  
-  * Telnet, +Considérez l'exemple suivant d'un fichier Docker stack servant à créer un conteneur PostgreSQL :
-  * Rlogin, +
-  * Ftp, +
-  * Pop3.+
  
-Un //sniffeur// est un logiciel qui captent les paquets circulant sur un réseau de type diffusion afin de les analyser. Le logiciel les plus utilisé est :+<file> 
 +version'3.1'
  
-  * Tcpdump.+services:
  
-=====LAB #1 Utilisation de tcpdump=====+  db: 
 +    image: postgres 
 +    environment: 
 +      POSTGRES_USER: postgres 
 +      POSTGRES_PASSWORD: postgres 
 +      POSTGRES_DB: database 
 + 
 +  adminer: 
 +    image: adminer 
 +    ports: 
 +     8080:8080 
 +</file>
  
-Le logiciel **tcpdump** sert à écouter le réseau en interceptant les paquets.+On peut constater dans ce fichier la présence des informations sensibles en non-sécurisées :
  
-===1.1 - Utilisation===+  * POSTGRES_USER 
 +  * POSTGRES_PASSWORD 
 +  * POSTGRES_DB
  
-Installez **tcpdump** :+Afin de sécuriser ces informations, commencez par créer le contexte **postgres** :
  
 <code> <code>
-root@debian12:~# apt install tcpdump+root@manager:~# mkdir postgres
 </code> </code>
  
-==L'option -i== +Créez ensuite un Docker Secret appelé **pg_user** :
- +
-Pour écouter sur une **interface spécifique**, utilisez l'option **-i** :+
  
 <code> <code>
-root@debian12:~# tcpdump -i ens18 -c 10 +root@manager:~# cd postgres 
-tcpdumpverbose output suppressed, use -v[v]... for full protocol decode +root@manager:~/postgres# echo "postgres" | docker secret create pg_user 
-listening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes +lpk8eq80qvfiqw7z1686fmj5t
-17:29:37.411395 IP 10.0.2.46.ssh > 10.0.2.1.42252: Flags [P.], seq 119569853:119570041, ack 3811519177, win 501, options [nop,nop,TS val 3553055771 ecr 1647876767], length 188 +
-17:29:37.411528 IP 10.0.2.1.42252 > 10.0.2.46.ssh: Flags [.], ack 188, win 10591, options [nop,nop,TS val 1647876791 ecr 3553055771], length 0 +
-17:29:37.493738 IP 10.0.2.46.36881 > dns.google.domain: 55995+ PTR? 1.2.0.10.in-addr.arpa. (39) +
-17:29:37.495598 IP dns.google.domain > 10.0.2.46.36881: 55995 NXDomain 0/0/0 (39) +
-17:29:37.495837 IP 10.0.2.46.33051 > dns.google.domain: 43187+ PTR? 46.2.0.10.in-addr.arpa. (40) +
-17:29:37.497464 IP dns.google.domain > 10.0.2.46.33051: 43187 NXDomain 0/0/0 (40) +
-17:29:37.497758 IP 10.0.2.46.ssh > 10.0.2.1.42252: Flags [P.], seq 188:536, ack 1, win 501, options [nop,nop,TS val 3553055857 ecr 1647876791], length 348 +
-17:29:37.497891 IP 10.0.2.1.42252 > 10.0.2.46.ssh: Flags [.], ack 536, win 10591, options [nop,nop,TS val 1647876877 ecr 3553055857], length 0 +
-17:29:37.597097 IP 10.0.2.46.52033 > dns.google.domain: 12468+ PTR? 8.8.8.8.in-addr.arpa. (38) +
-17:29:37.598847 IP dns.google.domain > 10.0.2.46.52033: 12468 1/0/0 PTR dns.google. (62) +
-10 packets captured +
-14 packets received by filter +
-0 packets dropped by kernel+
 </code> </code>
  
-Notez qu'à la fin, un résumé vous est présenté, par exemple :+<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 secretsutilisez la commande docker secrets **ls** :
  
 <code> <code>
-... +root@manager:~/postgres# docker secret ls 
-10 packets captured +ID                          NAME                DRIVER              CREATED              UPDATED 
-14 packets received by filter +lpk8eq80qvfiqw7z1686fmj5t   pg_user                                 About a minute ago   About a minute ago
-0 packets dropped by kernel+
 </code> </code>
  
-<WRAP center round important> +<WRAP center round important 50%
-**Important** : L'option **-c** limite le nombre de paquets capturés.+**Important** : Notez que la colonne **DRIVER** est vide. Ceci 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>
  
-==L'option -x== +Créez maintenant les secrets **pg_password** et **pg_database** :
- +
-Pour écouter sur une interface spécifique et voir le contenu en Hexadécimal, utilisez les options -i et **-x** :+
  
 <code> <code>
-root@debian12:~# tcpdump -i ens18 -x -c 3 +root@manager:~/postgresecho "postgres" | docker secret create pg_password 
-tcpdump: verbose output suppressed, use -v[v]... for full protocol decode +h9tsfbfwz6o0sd35roklwpopi 
-listening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes +root@manager:~/postgres# echo "database" | docker secret create pg_database 
-17:27:24.043320 IP 10.0.2.46.ssh > 10.0.2.1.42252: Flags [P.], seq 119567701:119567889, ack 3811519061, win 501, options [nop,nop,TS val 3552922403 ecr 1647743397], length 188 +5lx4zydpfocwgpdto0yy1jod9
-        0x0000:  4510 00f0 84b8 4000 4006 9d11 0a00 022e +
-        0x0010:  0a00 0201 0016 a50c 0720 7555 e32f 2a55 +
-        0x0020:  8018 01f5 1911 0000 0101 080a d3c5 4b23 +
-        0x0030:  6236 91a5 0000 00b0 77fb cb1f c046 bb66 +
-        0x0040:  c32f 923b a994 d49b f063 5539 130e 764b +
-        0x0050:  06fe b5be f2d1 7cee ef79 8d3e ec6e 1e7f +
-        0x0060:  c296 1fbf f4e8 67b0 f16d 5d98 1963 424c +
-        0x0070:  f6de 9287 5dbe 98c0 2b95 05cb 37f3 a653 +
-        0x0080:  dbff 81a1 d03f c288 bbaf 4756 41be 64ea +
-        0x0090:  706a 55ff 8322 e32e ea56 2e60 5210 43e6 +
-        0x00a0:  9eec 5bb1 e519 1936 4ee7 809b 6a18 675e +
-        0x00b0:  29b7 de38 921d a543 4ca7 7132 ff0f e399 +
-        0x00c0:  5338 304d 03a3 beed ddbe 4530 cb71 fea2 +
-        0x00d0:  618b b56d b45c 9ab6 9b71 563e 058d de9a +
-        0x00e0:  d249 d57e 7a53 f6b5 7bf6 5924 46f0 6c74 +
-17:27:24.043485 IP 10.0.2.1.42252 > 10.0.2.46.ssh: Flags [.], ack 188, win 10548, options [nop,nop,TS val 1647743423 ecr 3552922403], length 0 +
-        0x0000:  4510 0034 41fb 4000 4006 e08a 0a00 0201 +
-        0x0010:  0a00 022e a50c 0016 e32f 2a55 0720 7611 +
-        0x0020:  8010 2934 1855 0000 0101 080a 6236 91bf +
-        0x0030:  d3c5 4b23 +
-17:27:24.125464 IP 10.0.2.46.42246 > dns.google.domain: 35092+ PTR? 1.2.0.10.in-addr.arpa. (39) +
-        0x0000:  4500 0043 3869 4000 4011 e603 0a00 022e +
-        0x0010:  0808 0808 a506 0035 002f 1c7e 8914 0100 +
-        0x0020:  0001 0000 0000 0000 0131 0132 0130 0231 +
-        0x0030:  3007 696e 2d61 6464 7204 6172 7061 0000 +
-        0x0040:  0c00 01 +
-3 packets captured +
-10 packets received by filter +
-0 packets dropped by kernel+
 </code> </code>
  
-==L'option -X==+<WRAP center round important 50%> 
 +**Important** : Notez qu'un secret Docker est immuable. 
 +</WRAP>
  
-Pour écouter sur une interface spécifique et voir le contenu en Hexadécimal et en ASCII, utilisez les options -i et **-X** :+Vérifiez la prise en compte de vos commandes :
  
 <code> <code>
-root@debian12:~# tcpdump -i ens18 -X -c 3 +root@manager:~/postgresdocker secret ls 
-tcpdump: verbose output suppressed, use -v[v]... for full protocol decode +ID                          NAME                DRIVER              CREATED             UPDATED 
-listening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes +5lx4zydpfocwgpdto0yy1jod9   pg_database                             minutes ago       minutes ago 
-13:07:32.922306 IP 10.0.2.46.ssh > 10.0.2.1.42252: Flags [P.], seq 119572449:119572637, ack 3811519901, win 501, options [nop,nop,TS val 3553115863 ecr 1647936856], length 188 +h9tsfbfwz6o0sd35roklwpopi   pg_password                             3 minutes ago       3 minutes ago 
-        0x0000:  4510 00f0 84d9 4000 4006 9cf0 0a00 022e  E.....@.@....... +lpk8eq80qvfiqw7z1686fmj5t   pg_user                                 minutes ago       5 minutes ago
-        0x0010:  0a00 0201 0016 a50c 0720 87e1 e32f 2d9d  ............./-. +
-        0x0020:  8018 01f5 1911 0000 0101 080a d3c8 3ed7  ..............>+
-        0x0030:  6239 8558 0000 00b0 daef 47be bc64 8630  b9.X......G..d.0 +
-        0x0040:  968c 107d ba16 f8fb 45db 05ff e566 a1af  ...}....E....f.. +
-        0x0050:  728f e777 583b 64ac 09a6 f099 c570 ad4f  r..wX;d......p.O +
-        0x0060:  17d1 afa8 dbb3 1d59 122a 3e9d e4be 07f7  .......Y.*>..... +
-        0x0070:  7b85 75fc 49f4 e0fe 37ab f924 acc6 4f43  {.u.I...7..$..OC +
-        0x0080:  6231 f469 e3b2 ebb9 e9a4 6bfb cd89 66e2  b1.i......k...f. +
-        0x0090:  9fda ccf9 39ad 272a f373 167e 13e2 b56c  ....9.'*.s.~...l +
-        0x00a0:  3625 f2e2 7898 d061 6191 d5c4 a268 b1e0  6%..x..aa....h.. +
-        0x00b0:  1f4a a1f9 e319 18c9 e55a b700 e281 1f71  .J.......Z.....q +
-        0x00c0:  06fb 4e11 1145 23e2 a194 d91c 8e22 f8ef  ..N..E#......".. +
-        0x00d0:  5e96 6e34 f24f 1b67 754b 4c7e 5e51 a2cf  ^.n4.O.guKL~^Q.. +
-        0x00e0:  e2ed c5bb 409e eae3 c905 54ab cfc2 5a55  ....@.....T...ZU +
-13:07:32.922462 IP 10.0.2.1.42252 > 10.0.2.46.ssh: Flags [.], ack 188, win 10611, options [nop,nop,TS val 1647936883 ecr 3553115863], length 0 +
-        0x0000:  4510 0034 4232 4000 4006 e053 0a00 0201  E..4B2@.@..S.... +
-        0x0010:  0a00 022e a50c 0016 e32f 2d9d 0720 889d  ........./-..... +
-        0x0020:  8010 2973 1855 0000 0101 080a 6239 8573  ..)s.U......b9.s +
-        0x0030:  d3c8 3ed7                                ..>. +
-13:07:33.008324 IP 10.0.2.46.47533 > dns.google.domain: 49115+ PTR? 1.2.0.10.in-addr.arpa. (39) +
-        0x0000:  4500 0043 2e6b 4000 4011 f001 0a00 022e  E..C.k@.@....... +
-        0x0010:  0808 0808 b9ad 0035 002f 1c7e bfdb 0100  .......5./.~.... +
-        0x0020:  0001 0000 0000 0000 0131 0132 0130 0231  .........1.2.0.1 +
-        0x0030:  3007 696e 2d61 6464 7204 6172 7061 0000  0.in-addr.arpa.. +
-        0x0040:  0c00 01                                  ... +
-3 packets captured +
-10 packets received by filter +
-0 packets dropped by kernel+
 </code> </code>
  
-==L'option -w== +Pour obtenir de l'information concernant un secretil convient d'utiliser la commande docker secret **inspect** :
- +
-Pour écouter sur une interface spécifique et envoyer la sortie dans un fichierutilisez les options -i et **-w** et patientez 5 minutes :+
  
 <code> <code>
-root@debian12:~# tcpdump -i ens18 -w log.dump +root@manager:~/postgresdocker secret inspect pg_database 
-tcpdumplistening on ens18link-type EN10MB (Ethernet), snapshot length 262144 bytes +
-^C42 packets captured +    { 
-45 packets received by filter +        "ID""5lx4zydpfocwgpdto0yy1jod9"
-0 packets dropped by kernel +        "Version": { 
- +            "Index": 23 
-root@debian12:~# ls -l log.dump +        }, 
--rw-r--r-- 1 tcpdump tcpdump 25555 Nov 28 13:11 log.dump+        "CreatedAt""2021-04-15T03:49:36.344367554Z", 
 +        "UpdatedAt": "2021-04-15T03:49:36.344367554Z", 
 +        "Spec":
 +            "Name": "pg_database", 
 +            "Labels": {} 
 +        } 
 +    } 
 +]
 </code> </code>
  
 <WRAP center round important 50%> <WRAP center round important 50%>
-**Important** - Arrêtez la sortie de la commande à l'aide des touches **^C**.+**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> </WRAP>
  
-Notez que le fichier log.dump est au format **libpcap** et non au format texte. Il est donc inutile d'essayer de lire son contenu avec une commande telle **cat** :+L'option **--pretty** de la commande fait apparaître ces informations plus clairement :
  
 <code> <code>
-root@debian12:~# file log.dump +root@manager:~/postgresdocker secret inspect --pretty pg_database 
-log.dumppcap capture file, microsecond ts (little-endian) version 2.4 (Ethernet, capture length 262144)+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> </code>
  
-==L'option -v==+Créez maintenant le fichier compose **postgres-secrets.yaml** :
  
-Tcpdump peut être utilisé avec un de trois modes verbose.+<code> 
 +root@manager:~/postgres# vi postgres-secrets.yaml 
 +root@manager:~/postgres# cat postgres-secrets.yaml 
 +version: '3.1'
  
-^ Mode ^ Option ^ +services:
-| Light verbose | -v | +
-| Medium verbose | -vv | +
-| Full verbose | -vvv |+
  
-<code> +    db: 
-root@debian12:~# tcpdump -i ens18 --c 3 +        imagepostgres 
-tcpdumplistening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes +        restart: always 
-13:13:22.869956 IP (tos 0x10, ttl 64, id 34138, offset 0, flags [DF], proto TCP (6), length 176) +        environment: 
-    10.0.2.46.ssh > 10.0.2.1.42252Flags [P.], cksum 0x18d1 (incorrect -> 0x3397), seq 119580817:119580941, ack 3811523793, win 501, options [nop,nop,TS val 3553465811 ecr 1648286807], length 124 +            POSTGRES_USER_FILE: /run/secrets/pg_user 
-13:13:22.870085 IP (tos 0x10, ttl 64, id 17171, offset 0, flags [DF], proto TCP (6), length 52) +            POSTGRES_PASSWORD_FILE: /run/secrets/pg_password 
-    10.0.2.1.42252 > 10.0.2.46.sshFlags [.], cksum 0x1855 (incorrect -> 0x174a), ack 124, win 10660, options [nop,nop,TS val 1648286831 ecr 3553465811], length 0 +            POSTGRES_DB_FILE: /run/secrets/pg_database 
-13:13:22.951837 IP (tos 0x10, ttl 64, id 34139, offset 0, flags [DF], proto TCP (6), length 176) +        secrets: 
-    10.0.2.46.ssh > 10.0.2.1.42252Flags [P.], cksum 0x18d1 (incorrect -> 0x5f7e), seq 124:248, ack 1, win 501, options [nop,nop,TS val 3553465893 ecr 1648286831], length 124 +           pg_password 
-3 packets captured +           pg_user 
-10 packets received by filter +           pg_database 
-0 packets dropped by kernel+ 
 +    adminer:  
 +        imageadminer  
 +        ports 
 +         8080:8080 
 + 
 +secrets: 
 +  pg_user
 +    externaltrue 
 +  pg_password
 +    externaltrue 
 +  pg_database
 +    external: true
 </code> </code>
  
-===1.2 Filtrage à l'écoute===+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**.
  
-Tcpdump peut effectuer du filtrage lors de l'écoute.+Deuxièmement la section suivantes spécifie les noms des secrets à utiliser avec le service :
  
-Pour uniquement écouter les paquets en provenance de l'adresse IP 192.168.1.11, utilisez la condition **src host** :+<file> 
 +        secrets: 
 +           - pg_password 
 +           - pg_user 
 +           - pg_database 
 +</file>
  
-  # tcpdump src host 192.168.1.11 [Entrée]+La dernière section spécifie que les secrets sont **externes** :
  
-Pour uniquement écouter les paquets en provenance de l'adresse IP 192.168.1.11 et vers l'adresse 192.168.1.2, utilisez les conditions src host et **dst host** :+<file> 
 +secrets: 
 +  pg_user: 
 +    external: true 
 +  pg_password: 
 +    external: true 
 +  pg_database: 
 +    external: true 
 +</file>
  
-  # tcpdump src host 192.168.1.11 and dst host 192.168.1.2 [Entrée]+<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>
  
-Pour uniquement écouter les paquets d'un port précis, utilisez la condition **port** :+Déployez maintenant le service en utilisant la commande **docker stack** :
  
-  tcpdump -i eth0 port 80 [Entrée]+<code> 
 +root@manager:~/postgresdocker stack deploy -c postgres-secrets.yaml postgres 
 +Ignoring unsupported options: restart
  
-Pour uniquement écouter les paquets d'un protocole précis, utilisez une condition telle **ip**, **icmp**, **arp**, **rarp**, **udp** ou **tcp**:+Creating network postgres_default 
 +Creating service postgres_db 
 +Creating service postgres_adminer 
 +</code>
  
-  # tcpdump -i eth0 udp [Entrée]+<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>
  
-Pour uniquement écouter les paquets d'une taille inférieure à 100 octets, utilisez la condition **less** :+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 :
  
-  # tcpdump -i eth0 less 100 [Entrée]+{{ :elearning:workbooks:docker2:2021-04-15.png?direct&600 |}}
  
-Pour uniquement écouter les paquets d'une taille supérieure à 100 octets, utilisez la condition **great** :+Validez le formulaire et vérifiez que les secrets ont été pris en compte :
  
-  # tcpdump -i eth0 greater 100 [Entrée]+{{ :elearning:workbooks:docker2:2021-04-15_1_.png?direct&600 |}}
  
-L'utilisation des ses options et conditions peut être combinée pour donner des commandes telles :+Dernièrement, supprimez le service :
  
-  tcpdump -i eth0 -X src host 192.168.1.11 and dst host 192.168.1.and port 21 and ftp [Entrée]+<code> 
 +root@manager:~/postgresdocker stack ls 
 +NAME                SERVICES            ORCHESTRATOR 
 +postgres                              Swarm 
 +root@manager:~/postgres# docker stack rm postgres 
 +Removing service postgres_adminer 
 +Removing service postgres_db 
 +Removing network postgres_default 
 +</code>
  
-===Options de la commande===+=====LAB #2 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker=====
  
-Les options de cette commande sont :+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@debian12:~# tcpdump --help +root@manager:~# cat /etc/group | grep docker 
-tcpdump version 4.99.3 +docker:x:999: 
-libpcap version 1.10.3 (with TPACKET_V3) +root@manager:~# usermod -aG docker trainee 
-OpenSSL 3.0.17 1 Jul 2025 +root@manager:~# exit 
-Usagetcpdump [-AbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [--count] +déconnexion 
-                [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ] +trainee@manager:~$ docker ps 
-                [ -i interface ] [ --immediate-mode ] [ -j tstamptype ] +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/json: dial unix /var/run/docker.sock: connect: permission denied 
-                [ -M secret ] [ --number ] [ --print ] [ -Q in|out|inout ] +trainee@manager:~$ newgrp docker 
-                [ -r file ] [ -s snaplen ] [ -T type ] [ --version ] +trainee@manager:~$ docker ps -a 
-                -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ] +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                 NAMES 
-                --time-stamp-precision precision ] [ --micro ] [ --nano ] +d02c6115724c        alpine              "/bin/sh"                6 days ago          Exited (0) 6 days ago                               alpine1 
-                [ -z postrotate-command ] [ -Z user ] [ expression ]+trainee@manager:~$ docker rm alpine1 
 +alpine1 
 +trainee@manager:~$ docker run ---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>
  
-=====Les Contre-Mesures=====+=====LAB #3 Le Script docker-bench-security.sh=====
  
-Les contre-mesures incluent l'utilisation du chiffrement sous la forme de SSH, de SCP et d'OpenVPN.+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/]].
  
-====Introduction à la cryptologie====+Le guide est divisé en plusieurs sections :
  
-===Définitions===+  * 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.
  
-  * **La Cryptologie** +Ce guide est à utiliser avec le script **Docker Benchmark Security**.
-    * La science qui étudie les aspects scientifiques de ces techniques, c'est-à-dire qu'elle englobe la cryptographie et la cryptanalyse.  +
-  * **La Cryptanalyse** +
-    * Lorsque la clef de déchiffrement n'est pas connue de l'attaquant on parle alors de cryptanalyse ou cryptoanalyse (on entend souvent aussi le terme plus familier de cassage). +
-  * **La Cryptographie*+
-    * Un terme générique désignant l'ensemble des techniques permettant de chiffrer des messages, c'est-à-dire permettant de les rendre inintelligibles sans une action spécifique. Les verbes crypter et chiffrer sont utilisés. +
-  * **Le Décryptement ou Décryptage** +
-    * Est le fait d'essayer de déchiffrer illégitimement le message (que la clé de déchiffrement soit connue ou non de l'attaquant).+
  
-{{ :redhat:lx04:crypto1.gif|Cette image issue de Comment Ça Marche (www.commentcamarche.net) est mise à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de l'image, dans les conditions fixées par la licence, tant que cette note apparaît clairement. }}+Clonez le script **docker-bench-security.sh** en utilisant **git** :
  
-**La Cryptographie**+<code> 
 +trainee@manager:~$ su - 
 +Password: fenestros
  
-La cryptographie apporte quatre points clefs+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>
  
-  La confidentialité +Exécutez maintenant le script **Docker Benchmark Security** :
-    consiste à rendre l'information inintelligible à d'autres personnes que les acteurs de la transaction. +
-  L'intégrité +
-    consiste à déterminer si les données n'ont pas été altérées durant la communication (de manière fortuite ou intentionnelle). +
-  * L'authentification +
-    * consiste à assurer l'identité d'un utilisateur. +
-  * La non-répudiation +
-    * est la garantie qu'aucun des correspondants ne pourra nier la transaction. +
  
-La cryptographie est basée sur l'arithmétique. Il s'agit, dans le cas d'un texte, de transformer les lettres qui composent le message en une succession de chiffres (sous forme de bits dans le cas de l'informatique), puis ensuite de faire des calculs sur ces chiffres pour:+<code> 
 +root@manager:~# cd docker-bench-security/
  
-  * Procéder au chiffrement +root@manager:~/docker-bench-security# ./docker-bench-security.sh 
-    * Le résultat de cette modification (le message chiffré) est appelé cryptogramme (Ciphertext) par opposition au message initialappelé message en clair (Plaintext+# -------------------------------------------------------------------------------------------- 
-  * Procéder au déchiffrement+# Docker Bench for Security v1.6.0 
 +
 +# DockerInc. (c2015-2023 
 +
 +# Checks for dozens of common best-practices around deploying Docker containers in production. 
 +# Based on the CIS Docker Benchmark 1.6.0. 
 +# --------------------------------------------------------------------------------------------
  
-Le chiffrement se fait à l'aide d'une clef de chiffrement. Le déchiffrement nécessite  une clef de déchiffrement.+Initializing 2023-12-17T14:22:08+01:00
  
-On distingue deux types de clefs: 
  
-  * Les clés symétriques:  +Section A - Check results
-    * des clés utilisées pour le chiffrement ainsi que pour le déchiffrement. On parle alors de chiffrement symétrique ou de chiffrement à clé secrète. +
-  * Les clés asymétriques:  +
-    * des clés utilisées dans le cas du chiffrement asymétrique (aussi appelé chiffrement à clé publique). Dans ce cas, une clé différente est utilisée pour le chiffrement et pour le déchiffrement.+
  
-**Le Chiffrement par Substitution** +[INFO] 1 - Host Configuration 
-  +[INFO] 1.1 - Linux Hosts Specific Configuration 
-Le chiffrement par substitution consiste à remplacer dans un message une ou plusieurs entités (généralement des lettrespar une ou plusieurs autres entitésOn distingue généralement plusieurs types de cryptosystèmes par substitution :+[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
  
-  * La substitution **monoalphabétique** +[INFO] 2 - Docker daemon configuration 
-    * consiste à remplacer chaque lettre du message par une autre lettre de l'alphabet +[NOTE] 2.1 - Run the Docker daemon as a non-root user, if possible (Manual) 
-  * La substitution **polyalphabétique**  +[WARN] 2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored) 
-    * consiste à utiliser une suite de chiffres monoalphabétique réutilisée périodiquement +[PASS] 2.3 - Ensure the logging level is set to 'info' (Scored) 
-  * La substitution **homophonique**  +[PASS] 2.4 - Ensure Docker is allowed to make changes to iptables (Scored) 
-    permet de faire correspondre à chaque lettre du message en clair un ensemble possible d'autres caractères +[PASS] 2.5 - Ensure insecure registries are not used (Scored) 
-  * La substitution de **polygrammes**   +[PASS] 2.6 - Ensure aufs storage driver is not used (Scored) 
-    * consiste à substituer un groupe de caractères (polygrammedans le message par un autre groupe de caractères+[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)
  
-===Algorithmes à clé secrète===+[INFO] 3 - Docker daemon configuration files 
 +[PASS] 3.1 - Ensure that the docker.service file ownership is set to root:root (Automated) 
 +[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)
  
-==Le Chiffrement Symétrique==+[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)
  
-Ce système est aussi appelé le système à **Clef Secrète** ou à **clef privée**.+[INFO] 5 - Container Runtime 
 +[INFO]   No containers running, skipping Section 5
  
-Ce système consiste à effectuer une opération de chiffrement par algorithme mais comporte un inconvénient, à savoir qu'il nécessite un canal sécurisé pour la transmission de la clef de chiffrement/déchiffrement.+[INFO] 6 - Docker Security Operations 
 +[INFO] 6.1 - Ensure that image sprawl is avoided (Manual) 
 +[INFO]      * There are currently: 4 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
  
-{{:redhat:lx04:crypto2.gif|Cette image issue de Comment Ça Marche (www.commentcamarche.netest mise à disposition sous les termes de la licence Creative CommonsVous pouvez copier, modifier des copies de l'image, dans les conditions fixées par la licence, tant que cette note apparaît clairement.}}+[INFO] 7 - Docker Swarm Configuration 
 +[WARN] 7.1 - Ensure swarm mode is not Enabled, if not needed (Automated) 
 +[PASS] 7.2 - Ensure that the minimum number of manager nodes have been created in a swarm (Automated) (Swarm mode not enabled) 
 +[PASS] 7.3 - Ensure that swarm services are bound to a specific host interface (Automated(Swarm mode not enabled) 
 +[PASS] 7.4 - Ensure that all Docker swarm overlay networks are encrypted (Automated) 
 +[PASS] 7.5 - Ensure that Docker's secret management commands are used for managing secrets in a swarm cluster (Manual) (Swarm mode not enabled) 
 +[PASS] 7.6 - Ensure that swarm manager is run in auto-lock mode (Automated) (Swarm mode not enabled) 
 +[PASS] 7.7 - Ensure that the swarm manager auto-lock key is rotated periodically (Manual) (Swarm mode not enabled) 
 +[PASS] 7.8 - Ensure that node certificates are rotated as appropriate (Manual) (Swarm mode not enabled) 
 +[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)
  
-<WRAP center round important 50%> 
-**Important** - Le système de Méthode du Masque Jetable (One Time Pad) fût mis au point dans les années 1920. Il utilisait une clef générée aléatoirement à usage unique. 
-</WRAP> 
  
-Les algorithmes de chiffrement symétrique couramment utilisés en informatique sont:+Section C - Score
  
-  * **[[wpfr>Data_Encryption_Standard|Data Encryption Standard]]** (DES), +[INFOChecks: 86 
-  * **[[wpfr>Triple_DES|Triple DES]]** (3DES), +[INFOScore: 1 
-  * **[[wpfr>RC2]]**,  +</code>
-  * **[[wpfr>Blowfish|Blowfish]]**, +
-  * **[[wpfr>International_Data_Encryption_Algorithm|International Data Encryption Algorithm]]** (IDEA), +
-  * **[[wpfr>Standard_de_chiffrement_avancé|Advanced Encryption Standard]]** (AES).+
  
-===Algorithmes à clef publique===+Ce script sert à automatiser le contrôle des points précédemment cités et produit un rapport contenant des annotations :
  
-==Le Chiffrement Asymétrique==+  * **[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**.
  
-Ce système est aussi appelé **Système à Clef Publique**.+=====LAB #4 - Sécurisation de la Configuration de l'Hôte Docker=====
  
-Ce système consiste à avoir deux clefs appelées des **bi-clefs**:+Lors de l'exécution du script, vous devez obtenir un résultat similaire à ceci en ce qui concerne la Sécurité de la Configuration de l'hôte Docker :
  
-  Une clef **publique** pour le chiffrement +<file> 
-  Une clef **secrète** ou **privée** pour le déchiffrement+... 
 +[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>
  
-{{:redhat:lx04:crypto3.gif|Cette image issue de Comment Ça Marche (www.commentcamarche.net) est mise à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de l'image, dans les conditions fixées par la licence, tant que cette note apparaît clairement.}}+Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**.
  
-  * L'utilisateur A (celui qui déchiffre) choisit une clef privée +====[WARN] 1.1.1 - Ensure a separate partition for containers has been created (Automated)====
-  * A partir de cette clef il génère plusieurs clefs publiques grâce à un algorithme. +
-  * L'utilisateur B (celui qui chiffrechoisit une des clefs publiques à travers un canal non-sécurisé pour chiffrer les données à l'attention de l'utilisateur A.+
  
-Ce système est basé sur ce que l'on appelle une **fonction à trappe à sens unique** ou **one-way trap door**.+Par défaut, tous 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é.
  
-Il existe toutefois un problème – s'assurer que la clef publique récupérée est bien celle qui correspond au destinataire !+====[WARN] 1.1.3 - Ensure auditing is configured for the Docker daemon (Automated)====
  
-Les algorithmes de chiffrement asymétrique couramment utilisés en informatique sont:+<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>
  
-  * **[[wpfr>Digital_Signature_Algorithm|Digital Signature Algorithm]]** (DSA) +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. 
-  * **[[wpfr>Rivest_Shamir_Adleman|Rivest, Shamir, Adleman]]** (RSA)+
  
-==La Clef de Session==+Editez le fichier **/etc/apt/sources.list** selon l'exemple suivant :
  
-Ce système est un compromis entre le système symétrique et le système asymétrique. Il permet l'envoie de données chiffrées à l'aide d'un algorithme de chiffrement symétrique par un canal non-sécurisé et a été mis au point pour palier au problème de lenteur de déchiffrement du système asymétrique.+<code> 
 +root@manager:~/docker-bench-security# vi /etc/apt/sources.list
  
-{{:redhat:lx04:crypto4.gif|Cette image issue de Comment Ça Marche (www.commentcamarche.net) est mise à disposition sous les termes de la licence Creative CommonsVous pouvez copier, modifier des copies de l'image, dans les conditions fixées par la licence, tant que cette note apparaît clairement.}}+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>
  
-Ce système fonctionne de la façon suivante :+Exécutez la commande **apt-update** :
  
-  * L'utilisateur A chiffre une clef privée générée aléatoirement, appelée une « clef de session », en utilisant une des clefs publiques de l'utilisateur B+<code> 
-  * L'utilisateur A chiffre les données avec la clef de session. +root@manager:~/docker-bench-security# apt update 
-  * L'utilisateur B déchiffre la clef de session en utilisant sa propre clef privée+Ign:1 http://archive.debian.org/debian stretch InRelease 
-  * L'utilisateur B déchiffre les données en utilisant la clef de session.+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>
  
-===Fonctions de Hachage===+Pour installer auditd, utilisez **apt-get** : 
  
-La fonction de **hachage**, aussi appelée une fonction de **condensation**, est à **sens unique** (one way function). Il « condense » un message en clair et produit un haché unique.+<code> 
 +root@manager:~/docker-bench-security# apt-get install auditd -y 
 +</code>
  
-{{:redhat:lx04:crypto5.gif|Cette image issue de Comment Ça Marche (www.commentcamarche.net) est mise à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de l'image, dans les conditions fixées par la licence, tant que cette note apparaît clairement.}}+Modifiez ensuite le fichier **/etc/audit/rules.d/audit.rules** :
  
-Les deux algorithmes de hachage utilisés sont+<code> 
 +root@manager:~/docker-bench-security# vi /etc/audit/rules.d/audit.rules
  
-  * **[[wpfr>MD5|Message Digest 5]]** (MD5)  +root@manager:~/docker-bench-security# cat /etc/audit/rules.d/audit.rules 
-  * **[[wpfr>SHA-1|Secure Hash Algorithm]]** (SHA)+## First rule - delete all 
 +-D
  
-Lors de son envoie, le message est accompagné de son haché et il est donc possible de garantir son intégrité:+## Increase the buffers to survive stress events. 
 +## Make this bigger for busy systems 
 +-b 8192
  
-{{:redhat:lx04:crypto6.gif|Cette image issue de Comment Ça Marche (www.commentcamarche.net) est mise à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de l'image, dans les conditions fixées par la licence, tant que cette note apparaît clairement.}} +## This determine how long to wait in burst of events 
-  +--backlog_wait_time 0 
-  * A la réception du message, le destinataire ou l’utilisateur B calcule le haché du message reçu et le compare avec le haché accompagnant le document.  + 
-  * Si le message ou le haché a été falsifié durant la communication, les deux empreintes ne correspondront pas+## 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>
  
 <WRAP center round important 50%> <WRAP center round important 50%>
-**Important** - Ce système permet de vérifier que l'empreinte correspond bien au message reçu, mais ne permet pas de prouver que le message a bien été envoyé par l’utilisateur A.+**Important** : L'option **-w** indique **watch** et concerne le fichier qui suit. L'option **-p** journalise les modifications éventuelles.
 </WRAP> </WRAP>
  
-===Signature Numérique===+Re-démarrez ensuite auditd :
  
-Pour garantir l'authentification du message l‘utilisateur A va chiffrer ou **signer** le haché à l'aide de sa clé privée. Le haché signé est appelé un **sceau**.+<code> 
 +root@manager:~/docker-bench-security# systemctl restart auditd 
 +</code>
  
-{{:redhat:lx04:crypto7.gif|Cette image issue de Comment Ça Marche (www.commentcamarche.net) est mise à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de l'image, dans les conditions fixées par la licence, tant que cette note apparaît clairement.}}+Vérifiez ensuite la prise en charge des règles :
  
-  * L’utilisateur A envoie le sceau au destinataire+<code> 
-  * A la réception du message L’utilisateur B déchiffre le sceau avec la clé publique de l’utilisateur A+root@manager:~/docker-bench-security# cat /etc/audit/audit.rules 
-  * Il compare le haché obtenu au haché reçu en pièce jointe+## This file is automatically generated from /etc/audit/rules.d 
-  +-D 
-Ce mécanisme de création de sceau est appelé **scellement**.+-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>
  
-Ce mécanisme est identique au procédé utilisé par SSH lors d'une connexion +<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>
  
-===PKI===+Ré-exécutez le script **Docker Benchmark Security** :
  
-On appelle **[[wpfr>Public_Key_Infrastructure|PKI]]** (Public Key Infrastucture, ou en français **infrastructure à clé publique (ICP)**, parfois **infrastructure de gestion de clés (IGC)**l’ensemble des solutions techniques basées sur la cryptographie à clé publique.+<code> 
 +root@manager:~/docker-bench-security# ./docker-bench-security.sh  
 +... 
 +[PASS] 1.1.4 - Ensure auditing is configured for Docker files and directories -/run/containerd (Automated) 
 +[PASS1.1.5 - Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated) 
 +[PASS1.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) 
 +[PASS] 1.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) 
 +[PASS] 1.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>
  
-Les cryptosystèmes à clés publiques permettent de s'affranchir de la nécessité d'avoir recours systématiquement à un canal sécurisé pour s'échanger les clés. En revanche, la publication de la clé publique à grande échelle doit se faire en toute confiance pour assurer que :+=====LAB #5 - Sécurisation de la Configuration du daemon Docker=====
  
-    * La clé publique est bien celle de son propriétaire ; +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 :
-    Le propriétaire de la clé est digne de confiance ; +
-    La clé est toujours valide+
  
-Ainsiil est nécessaire d'associer au bi-clé (ensemble clé publique / clé privéeun certificat délivré par un **tiers de confiance** : l'infrastructure de gestion de clés.+<file> 
 +... 
 +[INFO] 2 - Docker daemon configuration 
 +[NOTE] 2.1 - Run the Docker daemon as a non-root userif 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>
  
-Le tiers de confiance est une entité appelée communément autorité de certification (ou en anglais Certification authority, abrégé CA) chargée d'assurer la véracité des informations contenues dans le certificat de clé publique et de sa validité.+Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**.
  
-Pour ce faire, l'autorité signe le certificat de clé publique à l'aide de sa propre clé en utilisant le principe de signature numérique.+====[WARN] 2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored)====
  
-Le rôle de l'infrastructure de clés publiques est multiple et couvre notamment les champs suivants :+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.
  
-    * enregistrer des demandes de clés en vérifiant l'identité des demandeurs ; +Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/userguide/networking/|page]]**.
-    générer les paires de clés (clé privée clé publique) ; +
-    garantir la confidentialité des clés privées correspondant aux clés publiques ; +
-    certifier l'association entre chaque utilisateurs et sa clé publique ; +
-    * révoquer des clés (en cas de perte par son propriétaire, d'expiration de sa date de validité ou de compromission)+
  
-Une infrastructure à clé publique est en règle générale composée de trois entités distinctes :+====[WARN] 2.9 - Enable user namespace support (Scored)====
  
-    * L'autorité d'enregistrement (AE ou RA pour Recording authority), chargée des formalité administratives telles que la vérification de l'identité des demandeurs, le suivi et la gestion des demandes, etc.) ; +Cet avertissement nous indique que l'utilisation des **user namespaces** n'est pas activéeLe 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"**.
-    L'autorité de certification (AC ou CA pour Certification Authority)chargée des tâches techniques de création de certificats. L'autorité de certification est ainsi chargée de la signature des demandes de certificat (CSR pour Certificate Signing Request, parfois appelées PKCS#10, nom du format correspondant). L'autorité de certification a également pour mission la signature des listes de révocations (CRL pour Certificate Revocation List) ; +
-    L'Autorité de dépôt (Repository) dont la mission est de conserver en sécurité les certificats.+
  
-==Certificats X509==+Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/security/userns-remap/|page]]**.
  
-Pour palier aux problèmes liés à des clefs publiques piratées, un système de certificats a été mis en place.+====[WARN] 2.12 - Ensure that authorization for Docker client commands is enabled (Scored)====
  
-Le certificat permet d’associer la clef publique à une entité ou une personneLes certificats sont délivrés par des Organismes de Certification.+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-inCette 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)
  
-Les certificats sont des fichiers divisés en deux parties +Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/extend/plugins_authorization/|page]]**.
  
-  * La partie contenant les informations  +====[WARN] 2.13 - Ensure centralized and remote logging is configured (Scored)====
-  * La partie contenant la signature de l'autorité de certification+
  
-La structure des certificats est normalisée par le standard **[[wpfr>X.509|X.509]]** de l’**[[wpfr>UIT|Union internationale des télécommunications]]**. +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éePour activer cette configuration, il faut fixer la valeur de **log-driver** à **syslog** puis configurer **syslog** ainsi que la valeur de **log-opts** correctement.
  
-Elle contient +Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/admin/logging/overview/|page]]**.
  
-  * Le nom de l'autorité de certification  +====[WARN] 2.14 - Ensure containers are restricted from acquiring new privileges (Scored)====
-  * Le nom du propriétaire du certificat  +
-  * La date de validité du certificat  +
-  * L'algorithme de chiffrement utilisé  +
-  * La clé publique du propriétaire +
  
-Le Certificat est signé par l'autorité de certification:+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**.
  
-{{:redhat:lx04:crypto8.gif|Cette image issue de Comment Ça Marche (www.commentcamarche.net) est mise à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de l'image, dans les conditions fixées par la licence, tant que cette note apparaît clairement.}}+Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/userguide/networking/default_network/binding/|page]]**.
  
-La vérification se passe ainsi:+====[WARN] 2.15 - Ensure live restore is enabled (Scored)====
  
-{{:redhat:lx04:crypto9.gif|Cette image issue de Comment Ça Marche (www.commentcamarche.net) est mise à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de l'image, dans les conditions fixées par la licence, tant que cette note apparaît clairement.}}+L'option --live-restore permet une prise en charge complète des conteneurs sans démon dans DockerElle 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.
  
-=====LAB #2 - Utilisation de GnuPG=====+====[WARN] 2.16 Ensure Userland Proxy is Disabled (Scored)====
  
-====2.1 - Présentation====+Il existe deux méthodes pour qu'un conteneur puisse router vers l'extérieur :
  
-**GNU Privacy Guard** permet aux utilisateurs de transférer des messages chiffrés et/ou signés.+  le mode **Hairpin NAT**, 
 +  * **Userland Proxy**.
  
-====2.Utilisation====+Il est préférable d'utiliser le mode Hairpin NAT qui peut utilise Iptables et qui possède de meilleures performancesLa 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**.
  
-Pour initialiser %%GnuPG%%saisissez la commande suivante :+Pour plus d'informationsconsultez cette **[[https://docs.docker.com/engine/userguide/networking/default_network/binding/|page]]**.
  
-<code> +====5.1 - Le Fichier /etc/docker/daemon.json ====
-root@debian12:~# gpg +
-gpg: directory '/root/.gnupg' created +
-gpg: keybox '/root/.gnupg/pubring.kbx' created +
-gpg: WARNING: no command supplied.  Trying to guess what you mean ... +
-gpg: Go ahead and type your message ... +
-^C +
-gpg: signal Interrupt caught ... exiting +
-</code>+
  
-<WRAP center round important 50%> +Créez le fichier **/etc/docker/daemon.json** : 
-**Important** - Notez l'utilisation des touches **^C** après la ligne **gpg: Go ahead and type your message ...**+
-</WRAP> +
- +
-Pour générer les clefs, saisissez la commande suivante : +
- +
-<WRAP center round important 50%> +
-**Important** - Lorsque le système vous demande une Passphrase, saisissez une valeur que n'allez **PAS** oublié. +
-</WRAP>+
  
 <code> <code>
-root@debian12:~# gpg --full-generate-key +root@manager:~/docker-bench-security# vi /etc/docker/daemon.json
-gpg (GnuPG) 2.2.40; Copyright (C) 2022 g10 Code GmbH +
-This is free software: you are free to change and redistribute it. +
-There is NO WARRANTY, to the extent permitted by law.+
  
-Please select what kind of key you want+root@manager:~/docker-bench-security# cat /etc/docker/daemon.json 
-   (1) RSA and RSA (default) +{ 
-   (2) DSA and Elgamal +    "icc": false, 
-   (3) DSA (sign only) +    "userns-remap": "default", 
-   (4) RSA (sign only) +    "log-driver": "syslog", 
-  (14) Existing key from card +    "live-restore": true, 
-Your selection? 1 +    "userland-proxy": false, 
-RSA keys may be between 1024 and 4096 bits long. +    "no-new-privileges": true 
-What keysize do you want? (3072)  +} 
-Requested keysize is 3072 bits +</code>
-Please specify how long the key should be valid. +
-         0 = key does not expire +
-      <n = key expires in n days +
-      <n>w = key expires in n weeks +
-      <n>m = key expires in n months +
-      <n>y = key expires in n years +
-Key is valid for? (0)  +
-Key does not expire at all +
-Is this correct? (y/N) y+
  
-GnuPG needs to construct a user ID to identify your key.+Re-démarrez le service Docker :
  
-Real name: ITTRAINING +<code> 
-Email address: infos@ittraining.team +root@manager:~/docker-bench-security# systemctl restart docker 
-CommentTest key +</code>
-You selected this USER-ID: +
-    "ITTRAINING (Test key) <infos@ittraining.team>"+
  
-Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?+Vérifiez la présence de l'utilisateur dénommé **dockremap** :
-We need to generate a lot of random bytes. It is a good idea to perform +
-some other action (type on the keyboard, move the mouse, utilize the +
-disks) during the prime generation; this gives the random number +
-generator a better chance to gain enough entropy. +
-We need to generate a lot of random bytes. It is a good idea to perform +
-some other action (type on the keyboard, move the mouse, utilize the +
-disks) during the prime generation; this gives the random number +
-generator a better chance to gain enough entropy. +
-gpg: /root/.gnupg/trustdb.gpg: trustdb created +
-gpg: directory '/root/.gnupg/openpgp-revocs.d' created +
-gpgrevocation certificate stored as '/root/.gnupg/openpgp-revocs.d/B6022CC107539B4036A90FAEABAD13CD27F9E686.rev' +
-public and secret key created and signed.+
  
-pub   rsa3072 2025-11-28 [SC] +<code> 
-      B6022CC107539B4036A90FAEABAD13CD27F9E686 +root@manager:~/docker-bench-security# id dockremap 
-uid                      ITTRAINING (Test key<infos@ittraining.team> +uid=116(dockremap) gid=121(dockremap) groupes=121(dockremap)
-sub   rsa3072 2025-11-28 [E]+
 </code> </code>
  
-La liste de clefs peut être visualisée avec la commande suivante :+Ré-exécutez le script **Docker Benchmark Security** :
  
 <code> <code>
-root@debian12:~# gpg --list-keys +root@manager:~/docker-bench-security# ./docker-bench-security.sh  
-gpg: checking the trustdb +... 
-gpg: marginals needed:  completes needed: 1  trust model: pgp +[PASS] 2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored) 
-gpg: depth: 0  valid:    signed:    trust: 0-, 0q, 0n, 0m, 0f, 1u +[PASS] 2.- Ensure the logging level is set to 'info' (Scored) 
-/root/.gnupg/pubring.kbx +[PASS] 2.4 Ensure Docker is allowed to make changes to iptables (Scored) 
------------------------- +[PASS] 2.5 - Ensure insecure registries are not used (Scored) 
-pub   rsa3072 2025-11-28 [SC+[PASS] 2.6 Ensure aufs storage driver is not used (Scored) 
-      B6022CC107539B4036A90FAEABAD13CD27F9E686 +[PASS] 2.9 Enable user namespace support (Scored) 
-uid           [ultimateITTRAINING (Test key<infos@ittraining.team> +[PASS] 2.10 Ensure the default cgroup usage has been confirmed (Scored) 
-sub   rsa3072 2025-11-28 [E]+[PASS] 2.11 - Ensure base device size is not changed until needed (Scored) 
 +[PASS2.13 - Ensure centralized and remote logging is configured (Scored) 
 +[PASS] 2.14 - Ensure containers are restricted from acquiring new privileges (Scored) 
 +[PASS2.15 - Ensure live restore is enabled (Scored) 
 +[PASS] 2.16 - Ensure Userland Proxy is Disabled (Scored) 
 +[PASS] 2.17 Ensure that a daemon-wide custom seccomp profile is applied if appropriate (Manual) 
 +[PASS2.18 - Ensure that experimental features are not implemented in production (Scored) 
 +...
 </code> </code>
  
-Pour importer la clef d'un correspondant dans sa trousse de clefs il convient d'utiliser la commande suivante :+Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file/|page]]**.
  
-<WRAP center round important 50%> +=====LAB #Sécurisation des Images et les Fichiers de Construction=====
-**Important** - La commande suivante est un exemple. Ne la saisissez **PAS**. +
-</WRAP> +
- +
-  gpg --import la-clef.asc+
  
-Pour exporter sa clef publique, il convient d'utiliser la commande suivante :+Créez le conteneur mysql :
  
 <code> <code>
-root@debian12:~# gpg --export --armor ITTRAINING > ~/mykey.asc+root@manager:~/docker-bench-securityapt 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@debian12:~# cat mykey.asc +root@manager:~/docker-bench-security# docker container run ---name mysql -e MYSQL_ROOT_PASSWORD=password mysql 
------BEGIN PGP PUBLIC KEY BLOCK-----+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
  
-mQGNBGkpk+gBDACq6M7rUNQFu/R6J+1p3RAB1+gwnszs/jZuBAo6y9i1buBsySP9 +root@manager:~/docker-bench-security# docker ps -a 
-oV9JmFfRe4P2QG/mgmSaGgeO0sE5m+r2Jhif2fShjHYLd6VTSVZRyfO+NW3MDbkm +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES 
-MtIf4LlXRrTALGE5TclLWFz5a2iqRjtT8IjSPAu1M9TLUaMXtWXN6jQY1YOnjxPN +e503dd98f889        mysql               "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        3306/tcp, 33060/tcp   mysql
-3HL8bwdaY0k8icKr8JRbmEijCWo2F4t2qTtdOXuRFAImxBpX49eJR0oC5bzXZPYx +
-LbirNsEwSULIyQ71gdF5OUb0aOSiQLXLuTLAs2BnxAJ82tB/dM8qP0ez0lXLJvvF +
-+t0eHdWzUHH4qlXuNtBXK7pEbvjqftO69PJLDp/PwjEfUsELcxDyUFpphhZDJ8zN +
-qvRgll3fojjr91WWWqr8YTd4EiTvq9KfUyAiTOfKm8k4iRQRTJir267Fq8Mno8/+
-My1tNeHWzCXMs3k/GKyi36Uu15wY50hRTPDYexa+aou0QEs4iY3EXjzaOD3BVvRQ +
-XTBUX/CS3ZmLC3MAEQEAAbQtSVRUUkFJTklORyAoVGVzdCBrZXkpIDxpbmZvc0Bp +
-dHRyYWluaW5nLnRlYW0+iQHOBBMBCgA4FiEEtgIswQdTm0A2qQ+uq60TzSf55oYF +
-Amkpk+gCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQq60TzSf55oZEsAv+ +
-Ky14vHWjMzU1ieE+XStqGYfjfAHhaNrpkWCz6miozuh+ESifNWpJd96bzwgNLGob +
-E5mA9oja5jyAEQUGT+gEwgvkbYVe4sf4UcXPRrvDqKiEOkN5rra3kYYdhHhpiFes +
-BmwQvW2dyElNO1ee/zzQOZ0Hd3vM/vdbmZRg8zKoV5eQz/MA2jpxF9IkXEDtUMzZ +
-C5kqTMRXdoWR2ZP2HLZjUstRX7d9BP/8oeg+2lMq9UlULWrYyVaD85dEAmCt9mQz +
-TqtAMmtp5IXalT+vKwhMu0MwUfyXyvl7ery4kxfmFtEeJQyxrdK2gihDxr0ndxBH +
-mowlIoBiGYMhUr/aF0lM00blpRAUoGv1rO2DUWh8TXzRJq6FJ4pzo9XRwR0dP7A6 +
-VBlBdhX2SlE9XJOjLq9ppV5Vr9u6ZauwEI6kBLoagjWOF3t34Gnvel8zO+H5fhhq +
-UKMOAbC0SYmLVIPNUauHYoKiJlWb+Dlr96NsPm0sYBbB047hr0evBUmkJNrulI3N +
-uQGNBGkpk+gBDADZu1B0itmBIGzxjGmUjK9UagW3HNLNVX3jn2Jwe7yl3vL/d3Fk +
-qBRydky32P4whbUSiJN71Tze9l+WOxeXGa0orKPPha/oQtlnmqyM6WBfOmvjSQkn +
-xCrS131SYjFb5dcQXoqTtUk8Wu4qoMHu/Mi9jtx8GrrENWzR7DFG2MDWwcM4TmUk +
-zs6azU/jaQX/YrGmYU3vB/zpKEZSo89pJ/S2FQ/6Fr+nnh7El3thNJxLRH40UlZs +
-FIpfm95Q+wtC224wckro/Xf/+t7oBssSqCZEkCItN+AlDpm13h161dypVRpC1M5Y +
-IITHq92gQSAKFhwSauaPtJ++oQNRgz5vJhCg78XfyBGpwDS6P0NM5RVEz6LMhQzI +
-4LziGmYH/iWj0pv45Uze7hOZaWhBPlPWFixJ97nl3soxA7hV1MLt/Ohy5jxGC8U3 +
-CrtEjyAIQxCmEUF0vPa7X1KB+FxCpJ8mYXBZ5w1DwBN7qsOnnHZKFcaPGW8r1am6 +
-Ab25ee028mua9RkAEQEAAYkBtgQYAQoAIBYhBLYCLMEHU5tANqkPrqutE80n+eaG +
-BQJpKZPoAhsMAAoJEKutE80n+eaGCRgMAJiG7Q8oF6oMkn6Xh7kXVH2yF4CKN9/+
-/qtImK/ikn14+/QNYpUbF4kIGadeCVgpKZZ+R9QLXTW7WQV4hgoOW3yiET3FTEBc +
-YoxDxegwlk9+gPiOMJ0+9R43IUs+jFrra1jcUpSg+1Nv2IijdPwape3HyPhYgDmZ +
-VxORrNtqBCkhtLpJO5VTiThAny+rNBHk1t1vQg4tEkCLGcOD8bsdxhACZnM0DVYY +
-rA6afeDnm7CTfVtc3QFAi2+ltYcDIrMxMF0b1VASlbU14TE6ep2Ic30ScpDJL8De +
-skhWi2/0v2WwhbmdGzfv5K5V3Z6NtoB3OUaHzKqzgEQeqjudgRaL440UsDtEFRHE +
-vh6kVR0MPTFjg+8khUjjrSYUzqiiK6iJDxn+m0XJvHzQTeCHQlgRrPj9HGp7isyK +
-o9Wf8fVvnksR8xc/2NcJwp0fo7ULwdADjgMtPUR155ukI8Xt9Aws+5OsYrIxBMMc +
-DTh6aJal6iGcG4aXbTzwIFXHW9WipS5B4A== +
-=rrxA +
------END PGP PUBLIC KEY BLOCK-----+
 </code> </code>
  
-Cette clef peut ensuite être jointe à des messages électroniques ou bien déposée sur un serveur de clefs tel http://www.keyserver.net. +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 :
- +
-===Signer un message=== +
- +
-Créez maintenant un message à signer :+
  
 <code> <code>
-root@debian12:~# vi message.txt +root@manager:~/docker-bench-security# ./docker-bench-security.sh 
- +... 
-root@debian12:~# cat message.txt +[INFO] 4 - Container Images and Build File 
-# ~/message.txt +[WARN] 4.1 - Ensure that a user for the container has been created (Automated) 
-Ceci est un message de test pour GnuPG+[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) 
 +...
 </code> </code>
  
-Pour signer ce message en format binaire, il convient d'utiliser la commande suivante :+====[WARN] 4.1 - Ensure that a user for the container has been created (Automated)====
  
-<WRAP center round important 50%> +Les processus dans le conteneur **mysql** tourne sous l'UID de root. Ceci est l'action par défaut de Docker.
-**Important** - Entrez votre Passphrase quand gpg vous la demande. +
-</WRAP>+
  
-<code> +Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/security/security/|page]]**.
-root@debian12:~# gpg --default-key ITTRAINING --detach-sign message.txt +
-gpg: using "ITTRAINING" as default secret key for signing+
  
-root@debian12:~# ls -l | grep message +====[WARN] 4.Ensure Content trust for Docker is Enabled (Automated)====
--rw-r--r-- 1 root    root         55 Nov 28 13:28 message.txt +
--rw-r--r-- 1 root    root        461 Nov 28 13:28 message.txt.sig+
  
-root@debian12:~# cat message.txt.sig+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.
  
-4!,S@6'i)infos@ittraining.team +Pour activer le Content trust, il faut positionner la valeur de la variable **DOCKER_CONTENT_TRUST** à **1** :
-        '| +
-                M<~,#5@^0F6ܝӎl`6fA(897>"Bj\     N!M.=F[3tC"%Fk@{6ƒbbEcc2'Smhlwmޚ)<AICA$U^*DPI0ʘ)'p-4d{EiU\P`9}%L0RНGڕ(-y$i'fǬCBH^c      ;pQbٜbJeqKh7I/6FLc7kUi}/%3xeOv;i13Ĭ +
-</code> +
- +
-Pour signer ce message en format ascii, il convient d'utiliser la commande suivante :+
  
 <code> <code>
-root@debian12:~#  gpg --default-key ITTRAINING --armor --detach-sign message.txt+root@manager:~/docker-bench-security# echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment 
 +DOCKER_CONTENT_TRUST=1
  
-gpgusing "ITTRAINING" as default secret key for signing+root@manager:~/docker-bench-security# source /etc/environment 
 +</code>
  
-root@debian12:~# ls -l | grep message +Re-démarrez la machine virtuelle **Manager** et démarrez le conteneur **mysql** :
--rw-r--r-- 1 root    root         55 Nov 28 13:28 message.txt +
--rw-r--r-- 1 root    root        691 Nov 28 13:31 message.txt.asc +
--rw-r--r-1 root    root        461 Nov 28 13:28 message.txt.sig+
  
-root@debian12:~# cat message.txt.asc +<code> 
------BEGIN PGP SIGNATURE-----+root@manager:~/docker-bench-securityreboot 
 +Connection to 10.0.2.62 closed by remote host
 +Connection to 10.0.2.62 closed.
  
-iQHKBAABCgA0FiEEtgIswQdTm0A2qQ+uq60TzSf55oYFAmkplgkWHGluZm9zQGl0 +root@debian11:~# ssh -l trainee 10.0.2.62 
-dHJhaW5pbmcudGVhbQAKCRCrrRPNJ/nmhiteC/kBXVFzjOQYIzdt4ALI37gCmd7x +trainee@10.0.2.62's password: trainee 
-Ml72F9permfoLc83fj+zZfigUxZe4DHx0TslVtFhntkg+7wF1H3MmUyKOhwCXFO4 +Linux manager.i2tch.loc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64
-ccyE9/DDJR384muuAP1q05bnXz0SHkTQaXVteCvAfHB8kzqQg04ePCBcIWK6YQVv +
-MBVm2O4pFDXWu1+0S69YnAelElZrzoqCaqprkQCcJvekBSV2NUNPLcwcBGq966+q +
-T9bGxPtW/5oTaPfFRzWwT/47ajpB66v3kEyGlc+gMpD4PFKZhLoEpgpByBWRWvhm +
-ZQsz2eby3oyv5KduA2emMnstQGCBq6zukYUpTgtzXB6jF1S71okiow11NsPra0m+ +
-9CAcg3tiylnkUJEgsvfZ45uctN+2UqBNAXMgVsHGUhJtugfPzfwWpfC/BMMdLS46 +
-g2nTttJexAGjjtw4Y0uFIYbNI0xXeH8ooh0AgQcXS5IOVH2zYs0GIdMxzRYFhRmc +
-nVRd/mHfQ21Mi1C5AnxDkqx6RpeH1maaLsPOFlo= +
-=2N1N +
------END PGP SIGNATURE-----  +
-</code>+
  
-Pour signer ce message **dans le message lui-même** en format ascii, il convient d'utiliser la commande suivante :+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.
  
-<code> +Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent 
-root@debian12:~# gpg --default-key ITTRAINING --clearsign message.txt +permitted by applicable law
-gpgusing "ITTRAINING" as default secret key for signing +Last loginSun Dec 17 18:39:07 2023 from 10.0.2.46
-File 'message.txt.asc' existsOverwrite? (y/N) y+
  
-root@debian12:~# ls -l | grep message +trainee@manager:~$ su 
--rw-r--r-- 1 root    root         55 Nov 28 13:28 message.txt +Mot de passe fenestros
--rw-r--r-- 1 root    root        795 Nov 28 13:33 message.txt.asc +
--rw-r--r-- 1 root    root        461 Nov 28 13:28 message.txt.sig+
  
-root@debian12:~# cat message.txt.asc +root@manager:~# cd docker-bench-security/
------BEGIN PGP SIGNED MESSAGE----- +
-Hash: SHA512+
  
-~/message.txt +root@manager:~/docker-bench-security#
-Ceci est un message de test pour GnuPG +
------BEGIN PGP SIGNATURE-----+
  
-iQHKBAEBCgA0FiEEtgIswQdTm0A2qQ+uq60TzSf55oYFAmkplpsWHGluZm9zQGl0 +root@manager:~/docker-bench-security# docker start mysql 
-dHJhaW5pbmcudGVhbQAKCRCrrRPNJ/nmhopQC/wJYnC83AnA54x9O9FzHIQ0YVqO +mysql
-QzcoDIIDMF71lizXIQ4DL2GCKhO3pelEWfyofUxd1sddT2qIHIsRTULaqHPRRjOU +
-9e/Wm9i65aUnQ/o5oDLSuHooi/r3HYPr8tHDhNSXT81a/QQ0BYVpMHVW/LREtw+L +
-qNPNlSZ4kzim3LyASyg8SYTGfft35S1S+7bjoY7LHfJUlGuSFRtlDMlhTbrrDqhI +
-S3TL6EeNFCdEVoxCPamsAKvuk4BV8Fe2rCjQqm/D6f0l+bgdnGFnd5y+nCiz0xXF +
-i7lQkZz+IjoTqwrjboL1mPWt6DMgiBX0IWas4kxKiBeZzyDZm6HGNeeMsqnReTcR +
-TPNM9FdDmpcxYzrRbYAoWTmdhiPdD/aXPEp+McyNIwwHgduUWuRGcifP2PVw6j0N +
-i3yOFw/rJEZMQnjwuL0GUSO3o8j1WMcSsTOHqsgu5FSKSjiIelNK2gzHTkuFiJ/+
-scYMCHrlrUfErpkLD1H6eFhSA4StmdZPmAA5DBA= +
-=07RM +
------END PGP SIGNATURE-----+
 </code> </code>
  
-Pour vérifier la signature d'un message signé en mode ascii, il convient d'utiliser la commande :+Exécutez de nouveau le script et notez le contenu de la section 4 :
  
 <code> <code>
-root@debian12:~# gpg --verify message.txt.asc +root@manager:~/docker-bench-security./docker-bench-security.sh 
-gpg: Signature made Fri 28 Nov 2025 01:33:31 PM CET +... 
-gpg:                using RSA key B6022CC107539B4036A90FAEABAD13CD27F9E686 +[INFO] 4 - Container Images and Build File 
-gpg               issuer "infos@ittraining.team" +[WARN] 4.1 - Ensure that a user for the container has been created (Automated) 
-gpg: Good signature from "ITTRAINING (Test key<infos@ittraining.team>" [ultimate+[WARN]      * Running as rootmysql 
-gpgWARNING: not a detached signature; file 'message.txt' was NOT verified!+[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) 
 +[PASS4.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) 
 +...
 </code> </code>
  
-<WRAP center round important 50%> +Pour plus d'informationsconsultez cette **[[https://docs.docker.com/engine/security/trust/content_trust/|page]]**.
-**Important** - Pour vérifier la signature d'un message signé en mode ascii et produit en dehors du message lui-mêmeil convient d'utiliser la commande :+
  
-  # gpg --verify message.txt.asc message.txt +====[WARN] 4.6 Ensure that HEALTHCHECK instructions have been added to container images====
-</WRAP>+
  
-===Chiffrer un message===+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 chiffrer un message, il faut disposer de la clef publique du destinataire du message. Ce dernier utilisera ensuite sa clef privée pour déchiffrer le message. Il convient de préciser le destinataire du messageou plus précisément la clef publique à utiliserlors d'un chiffrement :+Pour mettre en place un HEALTHCHECK, il conviendraitpar exemple, d'inclure la ligne suivante dans le fichier DOCKERFILE servant à construire l'image :
  
-    gpg --recipient <destinataire> --encrypt <message>+<file> 
 +HEALTHCHECK --interval=20s --timeout=3s CMD curl -f http://localhost:8000/ || exit 1 
 +</file>
  
-  * //<destinataire>// représente toute information permettant de distinguer sans ambigüité une clef publique dans votre trousseau. Cette information peut-être le nom ou l'adresse email associé à la clef publique que vous voulez utiliser,  +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.
-  * //<message>// représente le message à chiffrer.+
  
-Par exemple pour chiffrer un message en mode binaireil convient de saisir la commande suivante :+Pour plus d'informationsconsultez cette **[[https://docs.docker.com/engine/reference/builder/#healthcheck|page]]**.
  
-<code> +=====LAB #Sécurisation du Container Runtime=====
-root@debian12:~gpg --recipient ITTRAINING --encrypt message.txt+
  
-root@debian12:~# ls -l | grep message +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 :
--rw-r--r-- 1 root    root         55 Nov 28 13:28 message.txt +
--rw-r--r-- 1 root    root        795 Nov 28 13:33 message.txt.asc +
--rw-r--r-- 1 root    root        510 Nov 28 13:35 message.txt.gpg +
--rw-r--r-- 1 root    root        461 Nov 28 13:28 message.txt.sig+
  
-root@debian12:~# cat message.txt.gpg +<code> 
-ӛS4 +root@manager:~/docker-bench-security# ./docker-bench-security.sh 
-   t>25H@H:x+H  n֩ˁ+B.^2Zھ~~~´4sd27J    ~:W^}ĀzmI]/e=kS׈n9tȘQ=Cj5{Q +... 
-                                                                   #0"  @qw,\[B$(:BU舏9^8_Qa  +[INFO] 5 - Container Runtime 
-                                                                                             e^4,鹫     k/Pj#y:j~PU(}K#tTT-AZu  1z!%]t{ +[WARN] 5.1 - Ensure that, if applicable, an AppArmor Profile is enabled (Automated) 
-                                                                                                                                        5?"a5Vdnn$\V#(ctWhce6/-qThy^Ъmk-$$Dn +[WARN]      * No AppArmorProfile Foundmysql 
-                                                                                                                                                                            ^&Mw.*ԬYrɺޕr}o/Q[X_)Wr?U0gMV,">9Croot@debian12:~#+[WARN] 5.2 - Ensure that, if applicable, SELinux security options are set (Automated) 
 +[WARN]      * No SecurityOptions Foundmysql 
 +[PASS5.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.- 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/Wmysql 
 +[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 setmysql 
 +[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) 
 +...
 </code> </code>
  
-Et pour chiffrer un message en mode ascii, il convient de saisir la commande suivante :+Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**.
  
-<code> +====[WARN] 5.1 Ensure that, if applicable, an AppArmor Profile is enabled (Automated)====
-root@debian12:~# gpg --recipient ITTRAINING --armor --encrypt message.txt +
-File 'message.txt.asc' exists. Overwrite? (y/Ny+
  
-root@debian12:~# ls -l | grep message +Cet avertissement est présent parce que le conteneur n'utilise pas AppArmor.
--rw-r--r-- 1 root    root         55 Nov 28 13:28 message.txt +
--rw-r--r-- 1 root    root        752 Nov 28 13:38 message.txt.asc +
--rw-r--r-- 1 root    root        510 Nov 28 13:36 message.txt.gpg +
--rw-r--r-- 1 root    root        461 Nov 28 13:28 message.txt.sig+
  
-root@debian12:~# cat message.txt.asc +Pour plus d'informations, consultez cette **[[https://cloud.google.com/container-optimized-os/docs/how-to/secure-apparmor|page]]**.
------BEGIN PGP MESSAGE-----+
  
-hQGMA9ObUzTZ86GvAQwAxAGoxKHBMh53+bPqHs338vhWjxAZs19aItMm+CM2pKu5 +====[WARN] 5.2 Ensure that, if applicable, SELinux security options are set (Automated)====
-i4euJ36o+oVfbVTcqVNh4Q8I72QTOYTRTeXRWaUtVjp055A07BtlxGPbps9GXkVv +
-1faIs8viwHF1FHDC3Iz/SSf7u7tSF6sxbU6B4c/fHPneKjUxesH0XmKjduEdpDPj +
-ylZxPngzTOR4RDbMbkZ5OvJKXNrOOiHUSDOMmI9o9nu7sxnMiPP3NUqilN/0NtFz +
-xveV/mqDOEHT7Q1IHR+kN0e7WHqCl4NOvh0BXhL5u+9m18pgRe6ZvC6E94e+yPxZ +
-21umlYbcIPtw87+h9twBj7vK5FUi7j8C5QWoDoM4XERf/v21A1fTlx2cDn8E1lOC +
-dTaZlgTtxM3CY7/iWlG7TXWfUQfdZWhf/Mz1bHguljeOqVMGTI/zCElDnS3Ezzhg +
-bIlrpLbs6yqtjant1bkZ5PuNhB1bRNxrSKZUZKdEMeY5M+C0GjKskjN84+OqgjRV +
-39GkfPDwqw/eBj0ldvc60m0B5H2ZIIRApWl4j9RGhe2ZbvS+ZmI2vSf75RPDcNyH +
-PKDwHyTKCGN3NQKOIrw9LbIXehYEdrdFwGizGUXba1EWwVs+qMsmFueoQfcvA19N +
-CJ2HPuO3qAVIDpYyX+vwdKQASbb8AMQIIksoQv7i +
-=481C +
------END PGP MESSAGE----- +
-</code>+
  
-Pour décrypter un message il convient d'utiliser la commande suivante :+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>
-root@debian12:~# gpg --decrypt message.txt.asc +root@manager:~# docker run --p 8081:80 nginx 
-gpgencrypted with 3072-bit RSA key, ID D39B5334D9F3A1AF, created 2025-11-28 +b04b2a6f0dd93da21a8b7640afc319406e42868a141f90936dbcf52ab5bffb0d 
-      "ITTRAINING (Test key) <infos@ittraining.team>" +root@manager:~# docker stats 
-# ~/message.txt +CONTAINER ID        NAME                 CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS 
-Ceci est un message de test pour GnuPG+b04b2a6f0dd9        dazzling_blackburn   0.00%               1.789MiB 1.957GiB   0.09%               2.38kB / 0B         0B / 0B             2 
 +^C
 </code> </code>
  
-=====LAB #3 Mise en place de SSH et SCP=====+Supprimez le conteneur et re-créez le avec une limite de mémoire :
  
-====3.1 Introduction====+<code> 
 +root@manager:~/docker-bench-security# docker run -d -p 8081:80 nginx 
 +Unable to find image 'nginx:latest' locally 
 +sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee: Pulling from library/nginx 
 +1f7ce2fa46ab: Pull complete  
 +9b16c94bb686: Pull complete  
 +9a59d19f9c5b: Pull complete  
 +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
  
-La commande **[[wpfr>Ssh|ssh]]** est le successeur et la remplaçante de la commande **[[wpfr>Rlogin|rlogin]]**Il permet d'établir des connexions sécurisées avec une machine distanteSSH comporte cinq acteurs :+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>
  
-  * Le **serveur SSH** +Supprimez le conteneur et re-créez-le avec une limite de mémoire :
-    * le démon sshd, qui s'occupe des authentifications et autorisations des clients,  +
-  * Le **client SSH** +
-    * ssh ou scp, qui assure la connexion et le dialogue avec le serveur, +
-  * La **session** qui représente la connexion courante et qui commence juste après l'authentification réussie, +
-  * Les **clefs** +
-    * **Couple de clef utilisateur asymétriques** et persistantes qui assurent l'identité d'un utilisateur et qui sont stockés sur disque dur, +
-    * **Clef hôte asymétrique et persistante** garantissant l'identité du serveur er qui est conservé sur disque dur +
-    * **Clef serveur asymétrique et temporaire** utilisée par le protocole SSH1 qui sert au chiffrement de la clé de session, +
-    * **Clef de session symétrique qui est générée aléatoirement** et qui permet le chiiffrement de la communication entre le client et le serveur. Elle est détruite en fin de session. SSH-1 utilise une seule clef tandis que SSH-2 utilise une clef par direction de la communication, +
-  * La **base de données des hôtes connus** qui stocke les clés des connexions précédentes.+
  
-SSH fonctionne de la manière suivante pour la la mise en place d'un canal sécurisé:+<code> 
 +root@manager:~/docker-bench-security# docker ps -a 
 +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
  
-  * Le client contacte le serveur sur son port 22, +root@manager:~/docker-bench-security# docker rm -f e14 
-  * Les client et le serveur échangent leur version de SSH. En cas de non-compatibilité de versions, l'un des deux met fin au processus, +e14
-  * Le serveur SSH s'identifie auprès du client en lui fournissant : +
-    * Sa clé hôte, +
-    * Sa clé serveur, +
-    * Une séquence aléatoire de huit octets à inclure dans les futures réponses du client, +
-    * Une liste de méthodes de chiffrage, compression et authentification, +
-  * Le client et le serveur produisent un identifiant identique, un haché MD5 long de 128 bits contenant la clé hôte, la clé serveur et la séquence aléatoire, +
-  * Le client génère sa clé de session symétrique et la chiffre deux fois de suite, une fois avec la clé hôte du serveur et la deuxième fois avec la clé serveur. Le client envoie cette clé au serveur accompagnée de la séquence aléatoire et un choix d'algorithmes supportés, +
-  * Le serveur déchiffre la clé de session, +
-  * Le client et le serveur mettent en place le canal sécurisé.+
  
-===SSH-1===+root@manager:~/docker-bench-security# docker run -d -p 8081:80 --memory="256m" nginx 
 +38e91e096c83f7cbe78089617a4d70110bd273f53339f8fed8df2503d3cd65ca
  
-SSH-1 utilise une paire de clefs de type RSA1Il assure l'intégrité des données par une **[[wpfr>Contrôle_de_redondance_cyclique|Contrôle de Redondance Cyclique]]** (CRC) et est un bloc dit **monolithique**.+root@manager:~/docker-bench-security# docker stats 
 +CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS 
 +38e91e096c83        sweet_vaughan       0.00%               2.223MiB / 256MiB     0.87%               2.16kB / 0B         0B / 0B             2 
 +e503dd98f889        mysql               0.49%               351.3MiB / 1.957GiB   17.53%              5.61kB / 0B         167MB / 118MB       37 
 +^C 
 +</code>
  
-Afin de s'identifierle client essaie chacune des six méthodes suivantes :+Pour plus d'informationsconsultez cette **[[https://docs.docker.com/config/containers/resource_constraints/|page]]**.
  
-  * **Kerberos**, +====[WARN] 5.11 - Ensure that CPU priority is set appropriately on containers (Automated)====
-  * **Rhosts**, +
-  * **%%RhostsRSA%%**, +
-  * Par **clef asymétrique**, +
-  * **TIS**, +
-  * Par **mot de passe**.+
  
-===SSH-2===+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ès, plusieurs options sont possibles dont le plus couramment utilisée est **--cpu-shares**.
  
-SSH-2 utilise **DSA**,  **RSA**, **ecdsa** ou **ed25519**. Il assure l'intégrité des données par l'algorithme **HMAC**SSH-2 est organisé en trois **couches** :+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és. Quand les cycles de CPU ne sont par restreints, chaque conteneur utilise autant qu'il en a besoin.
  
-  * **SSH-TRANS** – Transport Layer Protocol, +Pour plus d'informationsconsultez cette **[[https://docs.docker.com/config/containers/resource_constraints/|page]]**.
-  * **SSH-AUTH** – Authentification Protocol, +
-  * **SSH-CONN** – Connection Protocol.+
  
-SSH-2 diffère de SSH-1 essentiellement dans la phase authentification. +====[WARN] 5.12 Ensure that the container's root filesystem is mounted as read only (Automated)====
  
-Trois méthodes d'authentification :+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.
  
-  Par **clef asymétrique**+Créez le fichier **write_a_file** dans le conteneur **mysql** :
-    Identique à SSH-1 sauf avec l'algorithme **DSA**, **ecdsa** ou **ed25519**, +
-  * **%%RhostsRSA%%**, +
-  * Par **mot de passe**.+
  
-===L'authentification par mot de passe===+<code> 
 +root@manager:~/docker-bench-security# docker container exec mysql touch /write_a_file 
 +</code>
  
-L'utilisateur fournit un mot de passe au client ssh. Le client ssh le transmet de façon sécurisée au serveur ssh puis  le serveur vérifie le mot de passe et l'accepte ou non.+La Commande **docker container diff** indique les différences apportées au conteneur par rapport à l'image dont il est issu :
  
-Avantage+<code> 
-  * Aucune configuration de clef asymétrique n'est nécessaire.+root@manager:~/docker-bench-security# docker diff mysql 
 +C /run 
 +C /run/mysqld 
 +A /run/mysqld/mysqld.pid 
 +A /run/mysqld/mysqld.sock 
 +A /run/mysqld/mysqld.sock.lock 
 +A /run/mysqld/mysqlx.sock 
 +A /run/mysqld/mysqlx.sock.lock 
 +A /write_a_file 
 +</code>
  
-Inconvénients: +<WRAP center round important 50%> 
-  L'utilisateur doit fournir à chaque connexion un identifiant et un mot de passe, +**Important** : Notez que la sortie indique les changements apportés au conteneur. 
-  Moins sécurisé qu'un système par clef asymétrique.+</WRAP>
  
-===L'authentification par clef asymétrique===+Arrêtez et supprimez le conteneur :
  
-  * Le **client** envoie au serveur une requête d'authentification par clé asymétrique qui contient le module de la clé à utiliser, +<code> 
-  * Le **serveur** recherche une correspondance pour ce module dans le fichier des clés autorisés **~/.ssh/authorized_keys**, +root@manager:~/docker-bench-security# docker stop mysql 
-    * Dans le cas où une correspondance n'est pas trouvée, le serveur met fin à la communication, +mysql
-    * Dans le cas contraire le serveur génère une chaîne aléatoire de 256 bits appelée un **challenge** et la chiffre avec la **clé publique du client**, +
-  * Le **client** reçoit le challenge et le décrypte avec la partie privée de sa clé. Il combine le challenge avec l'identifiant de session et chiffre le résultat. Ensuite il envoie le résultat chiffré au serveur. +
-  * Le **serveur** génère le même haché et le compare avec celui reçu du client. Si les deux hachés sont identiques, l'authentification est réussie.+
  
-====3.2 Configuration du Serveur====+root@manager:~/docker-bench-security# docker rm  mysql 
 +mysql 
 +</code>
  
-La configuration du serveur s'effectue dans le fichier **/etc/ssh/sshd_config** :+Lancez un conteneur mysql en lecture seule :
  
 <code> <code>
-root@debian12:~# cat /etc/ssh/sshd_config+root@manager:~/docker-bench-securitydocker run -d --name mysql --read-only -v /var/lib/mysql -v /tmp -v /var/run/mysqld -e MYSQL_ROOT_PASSWORD=password mysql 
 +711ab28bdfb41220c84246c1658bcde398681a78291bbbe7d3bbfd9bc317d41b 
 +</code>
  
-# This is the sshd server system-wide configuration file.  See +Créez le fichier **write_a_file** dans le conteneur **mysql** :
-# sshd_config(5) for more information.+
  
-# This sshd was compiled with PATH=/usr/local/bin:/usr/bin:/bin:/usr/games+<code> 
 +root@manager:~/docker-bench-security# docker container exec mysql touch /write_a_file 
 +touchcannot touch '/write_a_file'Read-only file system 
 +</code>
  
-# The strategy used for options in the default sshd_config shipped with +<WRAP center round important 50%> 
-# OpenSSH is to specify options with their default value where +**Important** : Notez l'erreur **touch: cannot touch '/write_a_file': Read-only file system**
-# possible, but leave them commented Uncommented options override the +</WRAP>
-# default value.+
  
-Include /etc/ssh/sshd_config.d/*.conf+Exécutez la commande **docker container diff** : 
  
-#Port 22 +<code> 
-#AddressFamily any +root@manager:~/docker-bench-securitydocker container diff mysql 
-#ListenAddress 0.0.0.0 +root@manager:~/docker-bench-security#  
-#ListenAddress ::+</code>
  
-#HostKey /etc/ssh/ssh_host_rsa_key +<WRAP center round important 50%> 
-#HostKey /etc/ssh/ssh_host_ecdsa_key +**Important** : Notez que la commande ne retourne aucune sortie. En effet le conteneur étant en lecture seule, aucun changement ne peut intervenir. 
-#HostKey /etc/ssh/ssh_host_ed25519_key+</WRAP>
  
-# Ciphers and keying +====[WARN] 5.14 - Ensure that the 'on-failure' container restart policy is set to '5' (Automated)====
-#RekeyLimit default none+
  
-# Logging +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 :
-#SyslogFacility AUTH +
-#LogLevel INFO+
  
-Authentication:+  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
  
-#LoginGraceTime 2m +Pour plus d'informations, consultez cette **[[https://docs.docker.com/config/containers/start-containers-automatically/|page]]**.
-#PermitRootLogin prohibit-password +
-#StrictModes yes +
-#MaxAuthTries 6 +
-#MaxSessions 10+
  
-#PubkeyAuthentication yes+====[WARN] 5.26 - Ensure that container health is checked at runtime (Automated)====
  
-# Expect .ssh/authorized_keys2 to be disregarded by default in future. +Voir l'avertissement 4.6.
-#AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2+
  
-#AuthorizedPrincipalsFile none+====[WARN] 5.28 - Ensure that the PIDs cgroup limit is used (Automated)====
  
-#AuthorizedKeysCommand none +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 :
-#AuthorizedKeysCommandUser nobody+
  
-# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts +<code> 
-#HostbasedAuthentication no +root@manager:~/docker-bench-securitydocker run -u 1000 ubuntu bash -c ":() { : | : & }; :; while [[ true ]]; do sleep 1; done" 
-# Change to yes if you don't trust ~/.ssh/known_hosts for +</code>
-HostbasedAuthentication +
-#IgnoreUserKnownHosts no +
-# Don't read the user's ~/.rhosts and ~/.shosts files +
-#IgnoreRhosts yes+
  
-# To disable tunneled clear text passwordschange to no here! +L'hôte Docker **manager** crash. Après avoir re-démarrer la machine virtuellecréez de nouveau le conteneur en utilisant l'option **--pids-limit** :
-#PasswordAuthentication yes +
-#PermitEmptyPasswords no+
  
-Change to yes to enable challenge-response passwords (beware issues with +<code> 
-# some PAM modules and threads+root@manager:~/docker-bench-securitydocker run -u 1000 --pids-limit 100 ubuntu bash -c ":() { : | : & }; :; while [[ true ]]; do sleep 1; done" 
-KbdInteractiveAuthentication no+Unable to find image 'ubuntu:latest' locally 
 +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 
 +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 
 +environment: fork: retry: Resource temporarily unavailable 
 +^P^Q 
 +</code>
  
-Kerberos options +Pour plus d'informations, consultez cette **[[https://docs.docker.com/engine/reference/commandline/run/#options|page]]**.
-#KerberosAuthentication no +
-#KerberosOrLocalPasswd yes +
-#KerberosTicketCleanup yes +
-#KerberosGetAFSToken no+
  
-# GSSAPI options +Supprimez maintenant tous les conteneurs déjà créées :
-#GSSAPIAuthentication no +
-#GSSAPICleanupCredentials yes +
-#GSSAPIStrictAcceptorCheck yes +
-#GSSAPIKeyExchange no+
  
-# Set this to 'yes' to enable PAM authentication, account processing, +<code> 
-and session processing. If this is enabled, PAM authentication will +root@manager:~/docker-bench-securitydocker rm -f `docker ps -aq` 
-# be allowed through the KbdInteractiveAuthentication and +db5ae43c3e55 
-# PasswordAuthentication.  Depending on your PAM configuration, +f3b2528fbac0 
-# PAM authentication via KbdInteractiveAuthentication may bypass +711ab28bdfb4
-# the setting of "PermitRootLogin prohibit-password". +
-# If you just want the PAM account and session checks to run without +
-# PAM authentication, then enable this but set PasswordAuthentication +
-# and KbdInteractiveAuthentication to 'no'. +
-UsePAM yes+
  
-#AllowAgentForwarding yes +root@manager:~/docker-bench-securitydocker ps -a 
-#AllowTcpForwarding yes +CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 
-#GatewayPorts no +</code>
-X11Forwarding yes +
-#X11DisplayOffset 10 +
-#X11UseLocalhost yes +
-#PermitTTY yes +
-PrintMotd no +
-#PrintLastLog yes +
-#TCPKeepAlive yes +
-#PermitUserEnvironment no +
-#Compression delayed +
-#ClientAliveInterval 0 +
-#ClientAliveCountMax 3 +
-#UseDNS no +
-#PidFile /run/sshd.pid +
-#MaxStartups 10:30:100 +
-#PermitTunnel no +
-#ChrootDirectory none +
-#VersionAddendum none+
  
-# no default banner path +Re-créez le conteneur mysql en intégrant les points vus ci-dessus :
-#Banner none+
  
-# Allow client to pass locale environment variables +<code> 
-AcceptEnv LANG LC_* +root@manager:~/docker-bench-securitydocker run -d --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
-override default of no subsystems +
-Subsystem       sftp    /usr/lib/openssh/sftp-server+
  
-Example of overriding settings on per-user basis +root@manager:~/docker-bench-securitydocker ps -
-#Match User anoncvs +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES 
-#       X11Forwarding no +f49d1ffdeae2        mysql               "docker-entrypoint.s…"   16 seconds ago      Up 15 seconds       3306/tcp, 33060/tcp   mysql
-#       AllowTcpForwarding no +
-#       PermitTTY no +
-      ForceCommand cvs server+
 </code> </code>
  
-Pour ôter les lignes de commentaires dans ce fichierutilisez la commande suivante :+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@debian12:~# cd /tmp ; grep --v '^(#|$)'  /etc/ssh/sshd_config > sshd_config +root@manager:~/docker-bench-security./docker-bench-security.sh 
- +... 
-root@debian12:/tmp# cat sshd_config +[PASS] 5.2 - Ensure that, if applicable, SELinux security options are set (Automated) 
-Include /etc/ssh/sshd_config.d/*.conf +[PASS] 5.10 - Ensure that the memory usage for containers is limited (Automated) 
-KbdInteractiveAuthentication no +[PASS] 5.11 - Ensure that CPU priority is set appropriately on containers (Automated) 
-UsePAM yes +[PASS] 5.12 - Ensure that the container's root filesystem is mounted as read only (Automated) 
-X11Forwarding yes +[PASS] 5.14 - Ensure that the 'on-failure' container restart policy is set to '5' (Automated) 
-PrintMotd no +[PASS] 5.28 Ensure that the PIDs cgroup limit is used (Automated) 
-AcceptEnv LANG LC_* +...
-Subsystem       sftp    /usr/lib/openssh/sftp-server+
 </code> </code>
  
-Pour sécuriser le serveur ssh, ajoutez ou modifiez les directives suivantes :+=====LAB #8 - Sécurisation des Images avec Docker Content Trust=====
  
-<file> +**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é**.
-AllowGroups adm +
-Banner /etc/issue.net +
-HostbasedAuthentication no +
-IgnoreRhosts yes +
-LoginGraceTime 60 +
-LogLevel INFO +
-PermitEmptyPasswords no +
-PermitRootLogin no +
-PrintLastLog yes +
-Protocol 2 +
-StrictModes yes +
-X11Forwarding no +
-</file>+
  
-Votre fichier ressemblera à celui-ci :+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**.
  
-<code> +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)]]**.
-root@debian12:/tmp# cat sshd_config +
-Include /etc/ssh/sshd_config.d/*.conf +
-KbdInteractiveAuthentication no +
-UsePAM yes +
-PrintMotd no +
-AcceptEnv LANG LC_* +
-AllowGroups adm +
-HostbasedAuthentication no +
-IgnoreRhosts yes +
-LoginGraceTime 60 +
-LogLevel INFO +
-PermitEmptyPasswords no +
-PermitRootLogin no +
-PrintLastLog yes +
-Protocol 2 +
-StrictModes yes +
-X11Forwarding no +
-Subsystem       sftp    /usr/lib/openssh/sftp-server +
-</code>+
  
-Mettez l'utilisateur **trainee** dans le groupe **adm**+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@debian12:/tmp# groups trainee +
-trainee : trainee cdrom floppy audio dip video plugdev netdev lpadmin scanner vboxusers+
  
-root@debian12:/tmp# usermod -a -G adm trainee+Pour utiliser **Docker Content Trust (DCT)**, il convient de vérifier que la valeur de la variable **DOCKER_CONTENT_TRUST** est **1** :
  
-root@debian12:/tmpgroups trainee +<code> 
-trainee : trainee adm cdrom floppy audio dip video plugdev netdev lpadmin scanner vboxusers+root@manager:~echo $DOCKER_CONTENT_TRUST 
 +1
 </code> </code>
  
-Renommez le fichier **/etc/ssh/sshd_config** en **/etc/ssh/sshd_config.old** puis copiez le fichier **/tmp/sshd_config** vers **/etc/ssh/** :+Dans le cas contraire, il faut fixer la valeur de la variable à 1 :
  
 <code> <code>
-root@debian12:/tmpmv /etc/ssh/sshd_config /etc/ssh/sshd_config.old +root@manager:~export DOCKER_CONTENT_TRUST=1 
- +root@manager:~echo $DOCKER_CONTENT_TRUST 
-root@debian12:/tmpcp sshd_config /etc/ssh+1
 </code> </code>
  
-Redémarrez ensuite le serveur ssh :+====8.2 - DCT et la commande docker pull==== 
 + 
 +Afin d'utiliser un registry privé du Docker Hub, il est nécessaire de se connecter :
  
 <code> <code>
-root@debian12:/tmpsystemctl restart ssh +root@manager:~docker login 
- +Login with your Docker ID to push and pull images from Docker HubIf you don't have a Docker ID, head over to https://hub.docker.com to create one
-root@debian12:/tmp# systemctl status ssh +Username<votre_compte> 
-● ssh.service - OpenBSD Secure Shell server +Password<votre_mot_de_passe> 
-     Loadedloaded (/lib/systemd/system/ssh.service; enabled; preset: enabled) +WARNING! Your password will be stored unencrypted in /root/.docker/config.json. 
-     Active: active (running) since Fri 2025-11-28 15:18:55 CET; 7s ago +Configure a credential helper to remove this warningSee 
-       Docsman:sshd(8) +https://docs.docker.com/engine/reference/commandline/login/#credentials-store
-             man:sshd_config(5) +
-    Process: 10882 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS) +
-   Main PID: 10883 (sshd) +
-      Tasks: 1 (limit: 19123) +
-     Memory: 1.4M +
-        CPU: 28ms +
-     CGroup: /system.slice/ssh.service +
-             └─10883 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"+
  
-Nov 28 15:18:55 debian12 systemd[1]: Starting ssh.service - OpenBSD Secure Shell server... +Login Succeeded
-Nov 28 15:18:55 debian12 sshd[10883]: Server listening on 0.0.0.0 port 22. +
-Nov 28 15:18:55 debian12 sshd[10883]: Server listening on :: port 22. +
-Nov 28 15:18:55 debian12 systemd[1]: Started ssh.service - OpenBSD Secure Shell server.+
 </code> </code>
  
-Pour générer les clefs sur le serveur saisissez la commande suivante en tant que **root**: +Pour constater l'impact de l'utilisation de DCTil convient simplement de faire un **pull** d'une image non-signée :
- +
-<WRAP center round important 50%> +
-**Important** - Lors de la génération de la clefla passphrase doit être **vide**+
-</WRAP>+
  
 <code> <code>
-root@debian12:/tmpssh-keygen -t dsa +root@manager:~docker image pull i2tch/docker:unsigned 
-Generating public/private dsa key pair. +Errorremote trust data does not exist for docker.io/i2tch/dockernotary.docker.io does not have trust data for docker.io/i2tch/docker
-Enter file in which to save the key (/root/.ssh/id_dsa)/etc/ssh/ssh_host_dsa_key +
-Enter passphrase (empty for no passphrase):  +
-Enter same passphrase again:  +
-Your identification has been saved in /etc/ssh/ssh_host_dsa_key +
-Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub +
-The key fingerprint is: +
-SHA256:mP/fGCXEcyZQ+afGDrQK4S1TYVIw3pnBre25MPU2b3g root@debian12 +
-The key's randomart image is: +
-+---[DSA 1024]----+ +
-|        o++o..   | +
-|       ..o+*o    | +
-|        .o++=.o +
-|       o. o.+=. .| +
-|      o.S+ +.=.o | +
-|       .= + =oB  | +
-|        .+ +.* + | +
-|         .. .+o E| +
-|          ..o .o | +
-+----[SHA256]-----++
 </code> </code>
  
 <WRAP center round important 50%> <WRAP center round important 50%>
-**Important** - Le chemin à indiquer pour le fichier est **/etc/ssh/ssh_host_dsa_key**. De la même façon, il est possible de générer les clefs au format **[[https://fr.wikipedia.org/wiki/Chiffrement_RSA|RSA]]**, **[[https://fr.wikipedia.org/wiki/Elliptic_curve_digital_signature_algorithm|ECDSA]]** et **[[https://fr.wikipedia.org/wiki/EdDSA|ED25519]]**+**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>
  
-Les clefs publiques générées possèdent l'extension **.pub**. Les clefs privées n'ont pas d'extension :+Par contre, toutes les images de type **official** sont signées :
  
 <code> <code>
-root@debian12:/tmpls /etc/ssh +root@manager:~docker image pull centos 
-moduli      ssh_config.d  sshd_config.d    ssh_host_dsa_key      ssh_host_ecdsa_key      ssh_host_ed25519_key      ssh_host_rsa_key +Using default tag: latest 
-ssh_config  sshd_config   sshd_config.old  ssh_host_dsa_key.pub  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub+Pull (1 of 1): centos:latest@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9 
 +sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9: Pulling from library/centos 
 +729ec3a6ada3: Pull complete  
 +Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9 
 +Status: Downloaded newer image for centos@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9 
 +Tagging centos@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9 as centos:latest 
 +docker.io/library/centos:latest
 </code> </code>
  
-Re-démarrez ensuite le service sshd :+Cette image est maintenant présente sur **manager.i2tch.loc** :
  
 <code> <code>
-root@debian12:/tmpsystemctl restart ssh+root@manager:~docker images 
 +REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
 +ubuntu              latest              775349758637        9 days ago          64.2MB 
 +nginx               latest              540a289bab6c        2 weeks ago         126MB 
 +alpine              latest              965ea09ff2eb        2 weeks ago         5.55MB 
 +mysql               latest              c8ee894bd2bd        3 weeks ago         456MB 
 +centos              latest              0f3e07c0138f        5 weeks ago         220MB
 </code> </code>
  
-Saisissez maintenant les commandes suivantes en tant que **trainee** :+===L'option disable-content-trust===
  
-<WRAP center round important 50%> +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** :
-**Important** - Lors de la génération des clefsla passphrase doit être **vide**+
-</WRAP>+
  
 <code> <code>
-root@debian12:/tmpexit +root@manager:~docker image pull --disable-content-trust=true i2tch/docker:unsigned 
-logout+unsigned: Pulling from i2tch/docker 
 +10d70a43a9f9: Pull complete  
 +4f4fb700ef54: Pull complete  
 +8951e3a91277: Pull 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
  
-trainee@debian12:~$ ssh-keygen -t dsa +root@manager:~# docker image ls 
-Generating public/private dsa key pair. +REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
-Enter file in which to save the key (/home/trainee/.ssh/id_dsa):  +ubuntu              latest              775349758637        9 days ago          64.2MB 
-Created directory '/home/trainee/.ssh'+nginx               latest              540a289bab6c        2 weeks ago         126MB 
-Enter passphrase (empty for no passphrase):  +alpine              latest              965ea09ff2eb        2 weeks ago         5.55MB 
-Enter same passphrase again:  +mysql               latest              c8ee894bd2bd        3 weeks ago         456MB 
-Your identification has been saved in /home/trainee/.ssh/id_dsa +centos              latest              0f3e07c0138f        5 weeks ago         220MB 
-Your public key has been saved in /home/trainee/.ssh/id_dsa.pub +i2tch/docker        unsigned            9b915a241e29        3 years ago         212MB
-The key fingerprint is: +
-SHA256:97XNFS0p/j8IaR7sByO1jVTE3sP23l/qDRUwU9TFRpw trainee@debian12 +
-The key's randomart image is: +
-+---[DSA 1024]----+ +
-           o=o**| +
-            o+E*| +
-|            + =+.| +
-|           + o *o| +
-       S = * o =| +
-        o % + =o| +
-|          = * =.=| +
-|           o o *+| +
-           ..o *| +
-+----[SHA256]-----++
  
-trainee@debian12:~$ ssh-keygen -t rsa +root@manager:~# docker rmi i2tch/docker:unsigned 
-Generating public/private rsa key pair. +Untaggedi2tch/docker:unsigned 
-Enter file in which to save the key (/home/trainee/.ssh/id_rsa):  +Untaggedi2tch/docker@sha256:885fc831cb853700ded04029b4fa70ed502947042f6f154e432395cb35619d11 
-Enter passphrase (empty for no passphrase) +Deletedsha256:9b915a241e29dc2767980445e3109412b1905b6f1617aea7098e7ac1e5837ae2 
-Enter same passphrase again:  +Deleted: sha256:27eb08aec7b41dbfa2fd49bc2b3fad9b020fe40b0bc8289af7f53770f0843e7d 
-Your identification has been saved in /home/trainee/.ssh/id_rsa +Deleted: sha256:7ad0aff4b88909fcff6372fdd26c24d688803b06845426b5a90bcd2f2cae93f4 
-Your public key has been saved in /home/trainee/.ssh/id_rsa.pub +Deleted: sha256:b93bcd594116ac8886f2daa0fc8d75a59da00161731dab24ababea853d031908 
-The key fingerprint is+Deleted: sha256:54eda0a22e4b2a1b166cf996eb0651a4f53dec7e9dfad3549bbfe6078f2238a4 
-SHA256:p2xPZdoPCICy/D5x0g+nHilsV6Ar4UMwmHeRnHDnBQw trainee@debian12 +Deleted: sha256:36575f1e2764d54fdb92b5296cf4e993499836d6dd9a006f32e173865835070e 
-The key's randomart image is+Deletedsha256:27074774f844bdeba18e786585604c8b6352e925a7bd560deb66252bc8ccb861 
-+---[RSA 3072]----+ +Deletedsha256:0da68695f8bc66fcea8f09004b5cb078861f5d99748f8b7ed035690e02c41477 
-|  .oE=o..        | +Deletedsha256:5dbda9873cdda8ff912b0ae5c34790ee06d7117fa27b193610fa2f7063bf55ff 
-|.. .+=..         | +Deleted: sha256:149690c37bdc8680ec66b0e2cc138f6d63caad74b091acf86a2a18111b90ea79 
-|= o o +          | +Deletedsha256:2caf8a80130d6e9f4ed22e1ec1c3abd2c3f4330d2df9ec62f3b751300190b9e4 
-| = + . o         | +Deletedsha256:1445a9131f2b28a12ff6396faebd6b4beb2cccd7af8eae28d5ff659d65de03ad 
-|  = ..  S . o    | +Deletedsha256:4d9799a0754804f5cd623ab744757d16ec81862ee6e5d6986d9d1b0c5e5d5637 
-| o +o.++.+ *     | +Deleted: sha256:dd833146402e8e6e67c48a6ae79a3c86101123e3d6ab1fc7999685eeea06ccba 
-|  + *++=+ + o    | +Deletedsha256:08d8e6ed6c3a5ac1bfee00f7b11f0a870d6bdc4af6d34169fa1e032c241a63a6 
-|   =.o.o.o     | +Deletedsha256:0f3637356bb908638dda037c9c6aa4a2be8a19dbcf452a00cd733a8a456077ac 
-|    .o.     +Deletedsha256:aedb1b3b3b6e70ae4a342dfdcea874495b9d095ed6ba8eb4bc08f90ad9e83125 
-+----[SHA256]-----+ +Deletedsha256:05903cd969529ea56beec880bbeb7e90f1bdc281882f1cf3755760e41b181409 
- +Deletedsha256:d124781fc06a73b05a8644958397994bae668aba2f06f397fe1387c676b0d86f
-trainee@debian12:~$ ssh-keygen -t ecdsa +
-Generating public/private ecdsa key pair. +
-Enter file in which to save the key (/home/trainee/.ssh/id_ecdsa):  +
-Enter passphrase (empty for no passphrase):  +
-Enter same passphrase again:  +
-Your identification has been saved in /home/trainee/.ssh/id_ecdsa +
-Your public key has been saved in /home/trainee/.ssh/id_ecdsa.pub +
-The key fingerprint is+
-SHA256:zA3muePCJZ7SCIvuKe+X5veMqWpP0UTr6HAVv+LPBCo trainee@debian12 +
-The key's randomart image is+
-+---[ECDSA 256]---+ +
-|      o          | +
-|     . +         | +
-|      + +        | +
-|     * = =       | +
-|  . + = S .      | +
-|  .+ +.o..       | +
-| .Eo+*.++        | +
-|o +o* BO .       | +
-|+B+*++oo*        | +
-+----[SHA256]-----+ +
- +
-trainee@debian12:~$ ssh-keygen -t ed25519 +
-Generating public/private ed25519 key pair. +
-Enter file in which to save the key (/home/trainee/.ssh/id_ed25519):  +
-Enter passphrase (empty for no passphrase) +
-Enter same passphrase again:  +
-Your identification has been saved in /home/trainee/.ssh/id_ed25519 +
-Your public key has been saved in /home/trainee/.ssh/id_ed25519.pub +
-The key fingerprint is+
-SHA256:f5GzguZoS5SN2EQDyj7zAqES+7PDOBSJRg+lD+vpn3Q trainee@debian12 +
-The key's randomart image is: +
-+--[ED25519 256]--+ +
-|  ....o          | +
-| +.. . .         | +
-|=o*            | +
-|oO+. + +       | +
-|*.=.. = S      | +
-|o+.+ .       | +
-|.=+..E. o o o    | +
-|+ ++o..+       | +
-| oo+ .o..        | +
-+----[SHA256]-----++
 </code> </code>
  
-<WRAP center round important 50%> +====8.3 - DCT et la commande docker push====
-**Important** - Les clés générées seront placées dans le répertoire **~/.ssh/**. +
-</WRAP> +
- +
-====3.3 - Utilisation==== +
- +
-La commande ssh prend la forme suivante:+
  
-  ssh -nom_de_compte numero_ip (nom_de_machine) +Pour envoyer l'image dont l'IMAGE ID est **965ea09ff2eb** dans le registry privéle tag de l'image doit être modifié :
- +
-En saisissant cette commande sur votre propre machinevous obtiendrez un résultat similaire à celle-ci :+
  
 <code> <code>
-trainee@debian12:~$ su - +root@manager:~# docker image tag alpine:latest <votre_compte>/docker:alpine
-Password: fenestros +
-root@debian12:~# +
- +
-root@debian12:~# ssh -l trainee localhost +
-The authenticity of host 'localhost (::1)' can't be established. +
-ED25519 key fingerprint is SHA256:SS9CpX7JFHIB54TWQWTtyswnwaXZ/Y8Kvr6dxPtisgE. +
-This key is not known by any other names. +
-Are you sure you want to continue connecting (yes/no/[fingerprint])? yes +
-Warning: Permanently added 'localhost' (ED25519) to the list of known hosts. +
-trainee@localhost's password:  +
-Linux debian12 6.1.0-41-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.158-1 (2025-11-09) x86_64 +
- +
-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: Thu Nov 27 17:21:12 2025 from 10.0.2.1+
 </code> </code>
  
-====3.4 - Mise en place des clefs==== +L'image dont l'IMAGE ID est **965ea09ff2eb** a maintenant deux tags **alpine:latest** et **<votre_compte>/docker:alpine** :
- +
-Il convient maintenant de se connecter sur le <<serveur>> en utilisant ssh et vérifiez la présence du répertoire ~/.ssh : +
- +
-En saisissant cette commande, vous obtiendrez une fenêtre similaire à celle-ci :+
  
 <code> <code>
-root@debian12:~# exit +root@manager:~# docker image ls 
-logout +REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE 
- +ubuntu                 latest              775349758637        9 days ago          64.2MB 
-trainee@debian12:~$ ssh -l trainee 127.0.0.1 +nginx                  latest              540a289bab6c        2 weeks ago         126MB 
-trainee@127.0.0.1's password: trainee +<votre_compte>/docker  alpine              965ea09ff2eb        weeks ago         5.55MB 
-Linux debian12 6.1.0-41-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.158-1 (2025-11-09) x86_64 +alpine                 latest              965ea09ff2eb        weeks ago         5.55MB 
- +mysql                  latest              c8ee894bd2bd        3 weeks ago         456MB 
-The programs included with the Debian GNU/Linux system are free software; +centos                 latest              0f3e07c0138f        5 weeks ago         220MB
-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: Fri Nov 28 15:31:58 2025 from 10.0.2.46 +
- +
-trainee@debian12:~$ ls -la | grep .ssh +
-drwx------   trainee trainee 4096 Nov 28 15:29 .ssh +
- +
-trainee@debian12:~$ exit +
-logout +
-Connection to 127.0.0.1 closed.+
 </code> </code>
  
-<WRAP center round important 50%> +Lors du push vers le registry privé, il faut créer des passphrases pour **deux** clefs :
-**Important** - Si le dossier distant .ssh n'existe pas dans le répertoire personnel de l'utilisateur connecté, il faut le créer avec des permissions de 700. Dans votre cas, puisque votre machine joue le rôle de serveur **et** du client, le dossier /home/trainee/.ssh existe **déjà**+
-</WRAP>+
  
-Ensuiteil convient de transférer le fichier local **.ssh/id_ecdsa.pub** du <<client>> vers le <<serveur>> en le renommant en **authorized_keys** :+  * 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>
-trainee@debian12:~$ scp .ssh/id_ecdsa.pub trainee@127.0.0.1:/home/trainee/.ssh/authorized_keys +root@manager:~# docker push <votre_compte>/docker:alpine 
-trainee@127.0.0.1'password:  +The push refers to repository [docker.io/<votre_compte>/docker] 
-id_ecdsa.pub                                                                                                                                                                    100%  178   399.6KB/s   00:00 +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 passphraseThis passphrase 
 +will be used to protect the most sensitive key in your signing systemPlease 
 +choose a long, complex passphrase and be careful to keep the password and the 
 +key file itself secure and backed upIt 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 192fc7efenestros 
 +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>
  
-Connectez-vous via ssh et insérer les clefs publiques restantes dans le fichier .ssh/authorized_keys :+Les clefs sont stockées dans le répertoire **~/.docker/trust/private** :
  
 <code> <code>
-trainee@debian12:~$ ssh -l trainee localhost +root@manager:~# ls -l ~/.docker/trust 
-Linux debian12 6.1.0-41-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.158-1 (2025-11-09) x86_64+total 8 
 +drwx------ 2 root root 4096 nov 10 14:49 private 
 +drwx------ 3 root root 4096 nov.   8 13:48 tuf
  
-The programs included with the Debian GNU/Linux system are free software; +root@manager:~# ls -l ~/.docker/trust/private 
-the exact distribution terms for each program are described in the +total 8 
-individual files in /usr/share/doc/*/copyright.+-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
  
-Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent +MIHuMEkGCSqGSIb3DQEFDTA8MBsGCSqGSIb3DQEFDDAOBAhm7HwR0y8FFAICCAAw 
-permitted by applicable law. +HQYJYIZIAWUDBAEqBBC729tU73wKHFQSbmZ1EVZaBIGgmGiFSs4lM5tElSGukl1B 
-Last login: Fri Nov 28 15:57:32 2025 from 127.0.0.1+HrELT9aFooFgW7oSXNLM8aFfF/vJ+BSjsgfqWLdvuH+DUXXdUidxcoGMEWnVZNIC 
 +3m40g3MywHilW4rUcjoHVTTUXABGXUQ3f7h+nI15CXcZ11qRLyWbf2uywE9yYH9O 
 +M7GLUcE+pTENJKfZAhRGBEL+LgXNfGI1aAVqaEbBDcDnKKf4Uj1Xu4oLJ7je8+nT 
 +dg== 
 +-----END ENCRYPTED PRIVATE KEY-----
  
-trainee@debian12:~cat .ssh/id_rsa.pub >> .ssh/authorized_keys+root@manager:~cat ~/.docker/trust/private/192fc7ed9543ad4bceec58886ab1d605b7433c35f7462d7343d0780d8fddf1db.key  
 +-----BEGIN ENCRYPTED PRIVATE KEY----- 
 +role: root
  
-trainee@debian12:~$ cat .ssh/id_dsa.pub >> .ssh/authorized_keys +MIHuMEkGCSqGSIb3DQEFDTA8MBsGCSqGSIb3DQEFDDAOBAiAtCzEar3AhgICCAAw 
- +HQYJYIZIAWUDBAEqBBAO7hHWVoqOo6xcETQQDXRdBIGgPUoLzTz07Ajx8K3D8+Vv 
-trainee@debian12:~$ cat .ssh/id_ed25519.pub >> .ssh/authorized_keys +2NUiflMYhH/0I9PL6iA2JJCmD0l+8Ueljy+vHRCu7UAIyWXyIHFN5Aab40mk9/Pg 
- +V2BwSlXp7t1Cnqp/ah7g0T40+OnT64JkTS+l3cS0CaCf2E4l6nY8g4cl40hZIFJz 
-trainee@debian12:~$ cat .ssh/authorized_keys +KREO8uEq3v7HcSBBqFm0+TU+92d7hVuDApPaj0lZYP+3f7H6AjUOqu6hUoK8Ck/
-ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBwIXLMYJtWVgqSTqJfsFjS2ubtP+mHkC7XRU1rBWTBLYoJp8VOwtpKK1NTFSaeJhnjCvFuhYm8egqHI0gp3oBA= trainee@debian12 +Ig== 
-ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDcV1OmeHZlWhLumCozdg7snul5MrkzhZjiUKWNJmGBBOauOq2CgMGYWYIhjyeVeaeiezq+wSe0jO09p8a1EbvYUibJsY9FOi8JcXTpxvlcqpuawudErjSsOf6JaIlbGpwDIMzmjeubfQx9jMZzfQIW9zfTDUi2tGquR/1TQPocGmmI9JFtoMqylk4+KsIHpriMBEVD/aKiGr1wjLHR1v3er8P1o8YOd+9tZXouJxWLHIA1swrnpXt8doVWYGx0E9jWsScqI4JPTy8kb2hfWeZWqONIqgJty0kOeTt6IynOauf9fSjxOG9Y4jyTV/OvTrBrmOCabjTIVMaIOWjLIPjNKJ8+eLnv+FuKUCc9mrAjbkXaP8T3JF43ofaBgSk09S3yo6wI3XI8ZlgROLDt7xxbFKosK/tYe8uOkpladNQHq3+EhAmzsfZJIstY0tNeK7aQ2KlsH6hZkLpqHsoKdzsLhRpMuPnV7wNlrikrbcvousDdQBpnzhNaXcm2BW+jmOs= trainee@debian12 +-----END ENCRYPTED PRIVATE KEY-----
-ssh-dss AAAAB3NzaC1kc3MAAACBAMbFW6WkZFJ/ueao6xjxBb+wbbIhIyiH/GM6W/7ayiNmCfFlYCxw9nNAVghYJYNcP2hB+l0qZ0JYrOMUX82sXAvtYbbO1xSZWNTTrbYEyR+o2ZWlgYBDz0DYj++dLCl0zCGHOfRq2VHtCx93mCxCiw5NXNflxOuy2WoY7hawxV/RAAAAFQDURMf0f29i5or5GrE4JWlFVZbiIwAAAIBqGpwpz+uQTKpJmgiisVA1t/0MRP2YstUVnU29Nr/C7EJ3bom3wx4At/bbQEfc7iVf0pwRUSJhdTy4t2vnFWghoeoj2ALUA4QVarVr7m0TY7m8bYgAlPVBx674DDmHfUh99PTwYcrcJUJMpVd+mwVccnXGigpHhs84QvD6csmxCwAAAIAEtC/YVdYAxFUd+ScG0zrBSsPHA/cigCF5cywNeu+OZqrK2y6yiJwp9T9bCL2nvzTWeTg/2Ev7v7Zh2oNKE5/mUoTDDn22omefi9Ecxl9W6Pyi8R6PxV+8mXtjHKPVNEQyqA8tAG1VN33MMgWz5HUEdwdUrOcmrkpyXNsRzvgD6w== trainee@debian12 +
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILP736HSOOTZBe6+CHy8PINQ4gb9kKB4xj0JWWZy1Wgl trainee@debian12+
 </code> </code>
  
-<WRAP center round important 50%> +====8.4 - DCT et la commande docker build====
-**Important** - Notez que lors de la connexion au serveur, l'authentification utilise le couple de clefs asymétrique et aucun mot de passe n'est requis. +
-</WRAP> +
- +
-===Options de la commande===+
  
-Les options de cette commande sont :+L'exemple suivant démontre un Dockerfile qui référence une image parente non signée :
  
 <code> <code>
-trainee@debian12:~$ ssh --help +root@manager:~# mkdir nottrusted
-unknown option -- - +
-usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] +
-           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] +
-           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] +
-           [-i identity_file] [-J [user@]host[:port]] [-L address] +
-           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] +
-           [-Q query_option] [-R address] [-S ctl_path] [-W host:port] +
-           [-w local_tun[:remote_tun]] destination [command [argument ...]] +
-</code>+
  
-====3.5 - Tunnels SSH====+root@manager:~# cd nottrusted/
  
-Le protocole SSH peut être utilisé pour sécuriser les protocoles tels telnet, pop3 etc.. En effet, on peut créer un //tunnel// SSH dans lequel passe les communications du protocole non-sécurisé.+root@manager:~/nottrusted# vi Dockerfile
  
-La commande pour créer un tunnel ssh prend la forme suivante :+root@manager:~/nottrusted# cat Dockerfile 
 +FROM docker/trusttest:latest 
 +RUN echo 
 +</code>
  
-  ssh -N -f compte@<hôte_local> -L<port-local>:<hôte_distant>:<port_distant> +Lors du build de l'image **<votre_compte>/docker:nottrusted** qui utilise ce Dockerfileune erreur est retournée car sa création n'est pas conforme à l'utilisation de DCT :
- +
-Dans votre casvous allez créer un tunnel entre Debian 12 et CentOS 8 entre le port 15023 et le port 23 :+
  
 <code> <code>
-trainee@debian12:~$ su - +root@manager:~/nottrusted# docker build -t <votre_compte>/docker:nottrusted . 
-Passwordfenestros+Sending build context to Docker daemon 
  
-root@debian12:~# ssh -N -f trainee@localhost -L15023:10.0.2.45:23+error during connectPost 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=1: Error: remote trust data does not exist for docker.io/docker/trusttestnotary.docker.io does not have trust data for docker.io/docker/trusttest
 </code> </code>
  
-Installez maintenant le client et le serveur telnet dans la VM CentOS 8:+L'utilisation de l'option **--disable-content-trust** permet la construction de l'image **<votre_compte>/docker:nottrusted** :
  
 <code> <code>
-root@debian12:~# ssh -l trainee 10.0.2.45 +root@manager:~/nottrusteddocker build --disable-content-trust -t <votre_compte>/docker:nottrusted . 
-The authenticity of host '10.0.2.45 (10.0.2.45)' can't be established. +Sending build context to Docker daemon  2.048kB 
-ED25519 key fingerprint is SHA256:YRt3r4qD/pZ8PoJ2irS3bH2miZj6/O3/kS4CBlcbz84. +Step 1/: FROM docker/trusttest:latest 
-This key is not known by any other names. +latestPulling from docker/trusttest 
-Are you sure you want to continue connecting (yes/no/[fingerprint])? yes +Image docker.io/docker/trusttest:latest uses outdated schema1 manifest formatPlease upgrade to a schema2 image for better future compatibilityMore information at https://docs.docker.com/registry/spec/deprecated-schema-v1/ 
-WarningPermanently added '10.0.2.45' (ED25519) to the list of known hosts. +aac0c133338dPull complete  
-trainee@10.0.2.45's passwordtrainee +a3ed95caeb02Pull complete  
-Activate the web console withsystemctl enable --now cockpit.socket+Digest: sha256:50c0cdd0577cc7ab7c78e73a0a89650b222f6ce2b87d10130ecff055981b702f 
 +Status: Downloaded newer image for docker/trusttest:latest 
 + ---> cc7629d1331a 
 +Step 2/2 : RUN echo 
 + ---> Running in 694e79d3cd88
  
-Last login: Thu Nov  6 04:13:03 2025 from 10.0.2.45 +Removing intermediate container 694e79d3cd88 
- + ---> 686e85ee76b8 
-[trainee@centos8 ~]$ su +Successfully built 686e85ee76b8 
-Passwordfenestros +Successfully tagged <votre_compte>/docker:nottrusted
- +
-[root@centos8 ~]# dnf install telnet-server+
 </code> </code>
  
-Telnet n'est ni démarré ni activé. Il convient donc de le démarrer et de l'activer :+Lors du push de l'image **<votre_compte>/docker:nottrusted** vers le repositry distant, celle-ci est **signée** :
  
 <code> <code>
-[root@centos8 ~]systemctl status telnet.socket +root@manager:~/nottrusteddocker push <votre_compte>/docker:nottrusted 
-● telnet.socket - Telnet Server Activation Socket +The push refers to repository [docker.io/<votre_compte>/docker] 
-   Loaded: loaded (/usr/lib/systemd/system/telnet.socket; disabled; vendor preset: disabled) +5f70bf18a086Layer already exists  
-   Activeinactive (dead) +c22f7bc058a9Mounted from docker/trusttest  
-     Docsman:telnetd(8) +nottrusteddigestsha256:1183c62a5d31e202b5f5f528e9e7cdc36140aa3212c938e1d471c6b3b59f01bc size734 
-   Listen[::]:23 (Stream) +Signing and pushing trust metadata 
- Accepted0; Connected0;+Enter passphrase for repository key with ID 168c754fenestros 
 +Successfully signed docker.io/<votre_compte>/docker:nottrusted 
 +</code>
  
-[root@centos8 ~]# systemctl start telnet.socket+<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>
  
-[root@centos8 ~]# systemctl status telnet.socket +===Créer un deuxième Repositry===
-● telnet.socket - Telnet Server Activation Socket +
-   Loaded: loaded (/usr/lib/systemd/system/telnet.socket; disabled; vendor preset: disabled) +
-   Active: active (listening) since Fri 2025-11-28 09:42:52 EST; 2s ago +
-     Docs: man:telnetd(8) +
-   Listen: [::]:23 (Stream) +
- Accepted: 0; Connected: 0; +
-   CGroup: /system.slice/telnet.socket+
  
-Nov 28 09:42:52 centos8.ittraining.loc systemd[1]Listening on Telnet Server Activation Socket.+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 :
  
-[root@centos8 ~]systemctl enable telnet.socket +<code> 
-Created symlink /etc/systemd/system/sockets.target.wants/telnet.socket → /usr/lib/systemd/system/telnet.socket.+root@manager:~/nottrusteddocker tag <votre_compte>/docker:nottrusted <votre_compte>/otherimage:latest
  
-[root@centos8 ~]systemctl status telnet.socket +root@manager:~/nottrusteddocker images 
-● telnet.socket - Telnet Server Activation Socket +REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE 
-   Loaded: loaded (/usr/lib/systemd/system/telnet.socket; enabled; vendor preset: disabled) +<votre_compte>/docker        nottrusted          686e85ee76b8        9 minutes ago       5.03MB 
-   Active: active (listening) since Fri 2025-11-28 09:42:52 EST; 43s ago +<votre_compte>/otherimage    latest              686e85ee76b8        9 minutes ago       5.03MB 
-     Docs: man:telnetd(8) +ubuntu                       latest              775349758637        9 days ago          64.2MB 
-   Listen: [::]:23 (Stream) +nginx                        latest              540a289bab6c        2 weeks ago         126MB 
- Accepted: 0; Connected: 0; +<votre_compte>/docker        alpine              965ea09ff2eb        2 weeks ago         5.55MB 
-   CGroup: /system.slice/telnet.socket+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
  
-Nov 28 09:42:52 centos8.ittraining.loc systemd[1]: Listening on Telnet Server Activation Socket.+root@manager:~/nottrusted# docker push docker.io/<votre_compte>/otherimage:latest 
 +The push refers to repository [docker.io/<votre_compte>/otherimage] 
 +5f70bf18a086Mounted from <votre_compte>/docker  
 +c22f7bc058a9: Mounted from <votre_compte>/docker  
 +latest: digest: sha256:1183c62a5d31e202b5f5f528e9e7cdc36140aa3212c938e1d471c6b3b59f01bc size: 734 
 +Signing and pushing trust metadata 
 +Enter passphrase for root key with ID 192fc7e: fenestros 
 +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>
  
-Arrêtez le service firewalld :+<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@centos8 ~]systemctl stop firewalld+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>
  
-[root@centos8 ~]# iptables -L +En inspectant les clefs des images créées, l'utilisation des différentes clefs est démontrées très clairement :
-Chain INPUT (policy ACCEPT) +
-target     prot opt source               destination         +
  
-Chain FORWARD (policy ACCEPT) +<code> 
-target     prot opt source               destination          +root@manager:~/nottrusted# docker trust inspect <votre_compte>/docker:alpine 
- +[ 
-Chain OUTPUT (policy ACCEPT) +    { 
-target     prot opt source               destination+        "Name": "<votre_compte>/docker:alpine", 
 +        "SignedTags":
 +            { 
 +                "SignedTag": "alpine", 
 +                "Digest": "e4355b66995c96b4b468159fc5c7e3540fcef961189ca13fee877798649f531a", 
 +                "Signers":
 +                    "Repo Admin" 
 +                ] 
 +            } 
 +        ], 
 +        "Signers": [], 
 +        "AdministrativeKeys":
 +            { 
 +                "Name": "Root", 
 +                "Keys":
 +                    { 
 +                        "ID": "d4074334a4ff5a9a43ebd1320ad77c2df88c990ec812f90eb045c603c01ab698" 
 +                    } 
 +                ] 
 +            }, 
 +            { 
 +                "Name": "Repository", 
 +                "Keys":
 +                    { 
 +                        "ID": "168c754ea8f36ce7fbcbe2299b6d91fc0f4d594c9ed9b86916687b618d8438ac" 
 +                    } 
 +                ] 
 +            } 
 +        ] 
 +    } 
 +
 +root@manager:~/nottrusted# docker trust inspect <votre_compte>/docker:nottrusted 
 +
 +    { 
 +        "Name": "<votre_compte>/docker:nottrusted", 
 +        "SignedTags":
 +            { 
 +                "SignedTag": "nottrusted", 
 +                "Digest": "1183c62a5d31e202b5f5f528e9e7cdc36140aa3212c938e1d471c6b3b59f01bc", 
 +                "Signers":
 +                    "Repo Admin" 
 +                ] 
 +            } 
 +        ], 
 +        "Signers": [], 
 +        "AdministrativeKeys":
 +            { 
 +                "Name": "Root", 
 +                "Keys":
 +                    { 
 +                        "ID": "d4074334a4ff5a9a43ebd1320ad77c2df88c990ec812f90eb045c603c01ab698" 
 +                    } 
 +                ] 
 +            }, 
 +            { 
 +                "Name": "Repository", 
 +                "Keys":
 +                    { 
 +                        "ID": "168c754ea8f36ce7fbcbe2299b6d91fc0f4d594c9ed9b86916687b618d8438ac" 
 +                    } 
 +                ] 
 +            } 
 +        ] 
 +    } 
 +]
 </code> </code>
  
-Connectez-vous ensuite via telnet sur CentOS 8 en utilisant le port 15023 de votre VM Debian 12 :+<WRAP center round important 50%> 
 +**Important** Notez que les clefs utilisées sont les mêmes pour les deux images.  
 +</WRAP>
  
 <code> <code>
-root@debian12:~# telnet localhost 15023 +root@manager:~/nottrusteddocker trust inspect <votre_compte>/otherimage:latest 
-Trying ::1... +
-Connected to localhost. +    { 
-Escape character is '^]'.+        "Name""<votre_compte>/otherimage:latest", 
 +        "SignedTags": [ 
 +            { 
 +                "SignedTag": "latest", 
 +                "Digest": "1183c62a5d31e202b5f5f528e9e7cdc36140aa3212c938e1d471c6b3b59f01bc", 
 +                "Signers":
 +                    "Repo Admin" 
 +                ] 
 +            } 
 +        ], 
 +        "Signers": [], 
 +        "AdministrativeKeys":
 +            { 
 +                "Name": "Root", 
 +                "Keys":
 +                    { 
 +                        "ID": "26f00698f51be2824c6fe85a14722c279bbd487125fe8fa18c0fc8f76dd6280d" 
 +                    } 
 +                ] 
 +            }, 
 +            { 
 +                "Name": "Repository", 
 +                "Keys":
 +                    { 
 +                        "ID": "7b13d02d74264624fb201e7ae13ae694286b9f761aa86adddefd0408c7234a58" 
 +                    } 
 +                ] 
 +            } 
 +        ] 
 +    } 
 +
 +</code>
  
-Kernel 4.18.0-348.7.1.el8_5.x86_64 on an x86_64 +<WRAP center round important 50%> 
-centos8 logintrainee +**Important** Notez que les clefs utilisées sont différentes.  
-Password:  +</WRAP>
-Last login: Fri Nov 28 09:45:22 from 10.0.2.46+
  
-[trainee@centos8 ~]$ pwd +===Supprimer une Signature===
-/home/trainee+
  
-[trainee@centos8 ~]$ exit +Dernièrement il est possible de supprimer la signature d'une image avec la commande **docker trust revoke** : 
-logout + 
-Connection closed by foreign host. +<code> 
-root@debian12:~# +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": "Repository", 
 +                "Keys":
 +                    { 
 +                        "ID": "168c754ea8f36ce7fbcbe2299b6d91fc0f4d594c9ed9b86916687b618d8438ac" 
 +                    } 
 +                ] 
 +            } 
 +        ] 
 +    } 
 +]
 </code> </code>
  
 <WRAP center round important 50%> <WRAP center round important 50%>
-**Important** - Notez bien que votre communication telnet passe par le tunnel SSH.+**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> </WRAP>
  
-====3.6 SCP====+=====LAB #9 Sécurisation du Socket du Daemon Docker=====
  
-===Introduction===+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.
  
-La commande **scp** est le successeur et la remplaçante de la commande **rcp** de la famille des commandes **remote**. Il permet de faire des transferts sécurisés à partir d'une machine distante :+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**.
  
-  $ scp compte@numero_ip(nom_de_machine):/chemin_distant/fichier_distant /chemin_local/fichier_local+La configuration implique que :
  
-ou vers une machine distante :+  * 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.
  
-  $ scp /chemin_local/fichier_local compte@numero_ip(nom_de_machine):/chemin_distant/fichier_distant+La mise en place nécessite **openssl** :
  
-===Utilisation===+<code> 
 +root@manager:~# which openssl 
 +/usr/bin/openssl 
 +</code>
  
-Nous allons maintenant utiliser **scp** pour chercher un fichier sur le <<serveur>> :+====9.1 - Création du Certificat de l'Autorité de Certification====
  
-Créez le fichier **/home/trainee/scp_test** :+Commencez par créer une clef privée **ca-key.pem** pour le CA :
  
 <code> <code>
-trainee@debian12:~$ touch /home/trainee/scp_test+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> </code>
  
-Récupérez le fichier **scp_test** en utilisant scp :+Ensuite, créez le certificat **ca.pem** du CA :
  
 <code> <code>
- +root@manager:~# openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem 
-trainee@debian12:~$ scp trainee@127.0.0.1:/home/trainee/scp_test /tmp/scp_test +Enter pass phrase for ca-key.pem:fenestros 
- +You are about to be asked to enter information that will be incorporated 
-trainee@debian12:~$ ls /tmp/scp_test +into your certificate request. 
-/tmp/scp_test+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> </code>
  
-=====LAB #4 Mise en place d'un VPN avec OpenVPN=====+====9.2 Création du Certificat du Serveur Hôte du Daemon Docker====
  
-====4.1 Présentation====+Les clefs du CA ayant été créées, créez une clef **server-key.pem** pour le serveur hôte du daemon Docker :
  
-**%%OpenVPN%%** :+<code> 
 +root@manager:~# openssl genrsa -out server-key.pem 4096 
 +Generating RSA private key, 4096 bit long modulus 
 +.................................................................................................................................++++ 
 +...........................++++ 
 +e is 65537 (0x010001) 
 +</code>
  
-  * permet à des pairs de s'authentifier entre eux à l'aide : +Créez ensuite un **[[https://fr.wikipedia.org/wiki/Demande_de_signature_de_certificat|Certificate Signing Request]]** (CSR) **server.csr** :
-    * d'une **clé privée partagée** à l'avance,  +
-    * de **certificats** ou,  +
-    * à partir de la version 2.0 et à condition que le serveur possède un certificat, de **couples de noms d'utilisateur/mot de passe** sans besoin d'un certificat client +
-  utilise de manière intensive la bibliothèque d'authentification **%%OpenSSL%%** ainsi que le protocole **SSLv3/TLSv1**,  +
-  * n'est pas compatible avec IPsec ou d'autres logiciels VPN. +
  
-====Configuration commune au client et au serveur====+<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>
  
-Installez le paquet openvpn :+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@debian12:~# apt install openvpn+root@manager:~# echo subjectAltName = DNS:`echo $HOSTNAME`,IP:10.0.2.62,IP:127.0.0.1 >> extfile.cnf
 </code> </code>
  
-Naviguez au répertoire **/etc/openvpn** et créez la clef partagée :+Fixez l'attribut étendu de l'utilisation de la clef du daemon à **serverAuth** :
  
 <code> <code>
-[root@centos7 ~]cd /etc/openvpn/+root@manager:~# echo extendedKeyUsage = serverAuth >> extfile.cnf 
 +</code>
  
-root@debian12:/etc/openvpn# openvpn --genkey secret static.key+Vérifiez que votre fichier a été correctement créé :
  
-root@debian12:/etc/openvpn# cat static.key +<code> 
-+root@manager:~# cat extfile.cnf  
-# 2048 bit OpenVPN static key +subjectAltName = DNS:manager.i2tch.loc,IP:10.0.2.62,IP:127.0.0.1 
-+extendedKeyUsage = serverAuth
------BEGIN OpenVPN Static key V1----- +
-77b47829a9d17aacc71b05a2bfa9bcba +
-e90370cc07238a5adb74ef479e87547d +
-fc18a69c3c5307bdc1ca27c7aa6f3a35 +
-e09e815a27f50c28699be3af28decd3c +
-b319923c2fe3826c2afb41d2e0239229 +
-fee9bc33566941e09e2f905f1bcbb59a +
-55cf8d535334ac46eda3f35be0b7e22b +
-c3261de182f7cde5cc7d756420907514 +
-0399672d104cebee31a44ca6d89663c7 +
-784b928e893c4d3a6e7d294e94266e1b +
-5a98f80f797651199069902be01d2bbd +
-94765d310f8d0466484a0e7cbf10bb98 +
-d247127aa53a6c18a6def6ed73a28b69 +
-b7d052209318057e2ccb9660fc42543b +
-d79dab314ecbc19a6b8936255c17d673 +
-fb0bdc3856a034ffc3931a7d645d6d96 +
------END OpenVPN Static key V1-----+
 </code> </code>
 +
 +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** :
  
 <code> <code>
-root@debian12:~# scp /etc/openvpn/static.key trainee@10.0.2.45:/tmp/static.key +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 
-trainee@10.0.2.45's password:  +Signature ok 
-static.key                                                                                                                                                                      100%  636     1.2MB/s   00:00+subject=CN = manager.i2tch.loc 
 +Getting CA Private Key 
 +Enter pass phrase for ca-key.pem:fenestros
 </code> </code>
  
-====Configuration du client====+====9.3 - Création du Certificat du Client==== 
 + 
 +Créez ensuite la clef privée **key.pem** du client qui se connectera au daemon à partir du réseau :
  
 <code> <code>
-root@debian12:/etc/openvpnssh -l trainee 10.0.2.45 +root@manager:~openssl genrsa -out key.pem 4096 
-trainee@10.0.2.45's password: trainee +Generating RSA private key, 4096 bit long modulus 
-Activate the web console with: systemctl enable --now cockpit.socket+...................................................................................................................................++++ 
 +...............++++ 
 +e is 65537 (0x010001) 
 +</code>
  
-Last login: Fri Nov 28 09:47:05 2025 from ::ffff:10.0.2.46+Modifiez l'entrée pour l'adresse 10.0.2.45 dans le fichier **/etc/hosts** du manager :
  
-[trainee@centos8 ~]$ su +<code> 
-Passwordfenestros+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  
 + 
 +# The following lines are desirable for IPv6 capable hosts 
 +::1     localhost ip6-localhost ip6-loopback 
 +ff02::1 ip6-allnodes 
 +ff02::2 ip6-allrouters
 </code> </code>
 +
 +Créez ensuite le CSR du client **client.csr** :
  
 <code> <code>
-[root@centos8 ~]dnf install epel-release+root@manager:~# openssl req -subj '/CN=myregistry.i2tch.loc' -new -key key.pem -out client.csr
 </code> </code>
 +
 +Fixez l'attribut étendu de l'utilisation de la clef du client à **clientAuth** :
  
 <code> <code>
-[root@centos8 ~]dnf install openvpn+root@manager:~# echo extendedKeyUsage = clientAuth > extfile-client.cnf
 </code> </code>
 +
 +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** :
  
 <code> <code>
-[root@centos8 ~]mv /tmp/static.key /etc/openvpn +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 
-[root@centos8 ~]# ls /etc/openvpn +Signature ok 
-client  server  static.key+subject=CN = myregistry.i2tch.loc 
 +Getting CA Private Key 
 +Enter pass phrase for ca-key.pem:fenestros
 </code> </code>
  
-Créez le fichier **/etc/openvpn/client/client.conf** :+Vérifiez la présence des fichiers générés :
  
 <code> <code>
-[root@centos8 ~]vi /etc/openvpn/client/client.conf +root@manager:~# ls -l 
-[root@centos8 ~]# cat /etc/openvpn/client/client.conf +total 60 
-remote 10.0.2.46 +-rw------- 1 root root 3326 nov 11 10:53 ca-key.pem 
-dev tun +-rw-r--r-- 1 root root 2163 nov.  11 10:57 ca.pem 
-port 1194 +-rw-r--r-- 1 root root   17 nov 11 11:15 ca.srl 
-proto udp +-rw-r--r-- 1 root root 1907 nov.  11 11:15 cert.pem 
-comp-lzo +-rw-r--r-- 1 root root 1594 nov.  11 11:12 client.csr 
-ifconfig 10.0.0.10.0.0.1 +drwxr-xr-x 5 root root 4096 nov.   8 12:58 docker-bench-security 
-secret /etc/openvpn/static.key+-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-- 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>
  
-Lancez openvpn en ligne de commande et en arrière plan en spécifiant une journalisation :+Supprimez les fichiers ayant déjà été utilisés, à savoir les deux CSR et les deux fichiers des extensions :
  
 <code> <code>
-[root@centos8 ~]openvpn --config /etc/openvpn/client/client.conf > /var/log/vpn 2>&1 & +root@manager:~# rm -v client.csr server.csr extfile.cnf extfile-client.cnf 
-[1] 14598+'client.csr' supprimé 
 +'server.csr' supprimé 
 +'extfile.cnf' supprimé 
 +'extfile-client.cnf' supprimé
 </code> </code>
  
-Vérifiez ensuite que le **socket** d'openvpn soit ouvert :+Modifiez les permissions des clefs privées :
  
 <code> <code>
-[root@centos8 ~]netstat -an | grep 1194 +root@manager:~# chmod -v 0400 ca-key.pem key.pem server-key.pem 
-udp        0      0 0.0.0.0:1194            0.0.0.0:*    +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> </code>
  
-Constatez ensuite la table de routage :+Ainsi que les permissions des certificats :
  
-<code>                             +<code> 
-[root@centos8 ~]netstat -ar +root@manager:~# chmod -v 0444 ca.pem server-cert.pem cert.pem 
-Kernel IP routing table +le mode de 'ca.pem' a été modifié de 0644 (rw-r--r--) en 0444 (r--r--r--) 
-Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface +le mode de 'server-cert.pem' a été modifié de 0644 (rw-r--r--) en 0444 (r--r--r--) 
-default         _gateway        0.0.0.0         UG        0 0          0 ens18 +le mode de 'cert.pem' a été modifié de 0644 (rw-r--r--) en 0444 (r--r--r--)
-10.0.0.1        0.0.0.0         255.255.255.255 UH        0 0          0 tun0 +
-10.0.2.0        0.0.0.0         255.255.255.0           0 0          0 ens18 +
-192.168.122.0   0.0.0.0         255.255.255.0           0 0          0 virbr0+
 </code> </code>
  
-Notez la présence de la route via **tun0**. +Arrêtez et supprimez le conteneur **mysql** :
- +
-Constatez ensuite le montage du tunnel en regardant le contenu du fichier de journalisation **/var/log/vpn** :+
  
 <code> <code>
-[root@centos7 ~]tail /var/log/vpn+root@manager:~# docker stop mysql 
 +mysql 
 +root@manager:~# docker rm mysql 
 +mysql
 </code> </code>
  
-L'architecture réseau sera donc la suivante :+====9.4 - Démarrage du Daemon Docker avec une Invocation Directe====
  
-<file> +Arrêtez et désactivez le service Docker :
-                                   serveur <------------Votre réseau-------------> client +
-                                      |                                               | +
-                                      |                                               | +
-                                  eth0@ifxxx                                      eth0@ifxxx +
-                                  172.yy.0.3                                      172.yy.0.4  +
-</file>+
  
-====Configuration du serveur====+<code> 
 +root@manager:~# systemctl stop docker 
 +Warning: Stopping docker.service, but it can still be activated by: 
 +  docker.socket 
 +root@manager:~# systemctl disable docker 
 +Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install. 
 +Executing: /lib/systemd/systemd-sysv-install disable docker 
 +</code>
  
-Créez le fichier **/etc/openvpn/server/server.conf** :+Lancez un invocation directe de **dockerd** afin que le daemon n'acceptent que des connexions de clients fournissant un certificat signé par le CA :
  
 <code> <code>
-root@debian12:~# vi /etc/openvpn/server/server.conf +root@manager:~# dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:2376 & 
- +[1] 1868 
-root@debian12:~# cat /etc/openvpn/server/server.conf +root@manager:~# INFO[2019-11-11T12:01:43.638540628+01:00] Starting up                                   
-dev tun +INFO[2019-11-11T12:01:43.639187816+01:00] User namespaces: ID ranges will be mapped to subuid/subgid ranges of: dockremap:dockremap  
-ifconfig 10.0.0.1 10.0.0.2 +INFO[2019-11-11T12:01:43.641133642+01:00] User namespaces: ID ranges will be mapped to subuid/subgid ranges of: dockremap:dockremap  
-secret /etc/openvpn/static.key +INFO[2019-11-11T12:01:43.646949782+01:00] parsed scheme: "unix"                         module=grpc 
-port 1194 +INFO[2019-11-11T12:01:43.648299396+01:00] scheme "unix" not registered, fallback to default scheme  module=grpc 
-proto udp +INFO[2019-11-11T12:01:43.648633123+01:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock  <nil>}] <nil> module=grpc 
-user nobody +INFO[2019-11-11T12:01:43.650756512+01:00] ClientConn switching balancer to "pick_first"  module=grpc 
-group nobody +INFO[2019-11-11T12:01:43.656738368+01:00] parsed scheme: "unix"                         module=grpc 
-daemon +INFO[2019-11-11T12:01:43.657165991+01:00] scheme "unix" not registered, fallback to default scheme  module=grpc 
-comp-lzo +INFO[2019-11-11T12:01:43.660938142+01:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0  <nil>}] <nil> module=grpc 
-keepalive 10 60 +INFO[2019-11-11T12:01:43.661309281+01:00] ClientConn switching balancer to "pick_first"  module=grpc 
-ping-timer-rem +INFO[2019-11-11T12:01:43.663242717+01:00] [graphdriver] using prior storage driver: overlay2  
-persist-tun +WARN[2019-11-11T12:01:43.681131788+01:00] Your kernel does not support cgroup rt period  
-persist-key +WARN[2019-11-11T12:01:43.681397622+01:00] Your kernel does not support cgroup rt runtime  
-log /var/log/vpn +INFO[2019-11-11T12:01:43.681845166+01:00] Loading containers: start.                    
-verb 1+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>
  
-Arrêtez le service **firewalld** :+Vérifiez que le processus tourne :
  
 <code> <code>
-root@debian12:~# systemctl stop firewalld+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>
  
-root@debian12:~# iptables -+Installez le paquet **net-tools** qui contient le binaire **netstat** :
-Chain INPUT (policy ACCEPT) +
-target     prot opt source               destination         +
  
-Chain FORWARD (policy ACCEPT) +<code> 
-target     prot opt source               destination          +root@manager:~# apt install -y net-tools
- +
-Chain OUTPUT (policy ACCEPT) +
-target     prot opt source               destination+
 </code> </code>
  
-Lancez openvpn en ligne de commande et en arrière plan en spécifiant une journalisation :+Vérifiez que le port **2376** est à l'écoute :
  
 <code> <code>
-root@debian12:~# openvpn --config /etc/openvpn/server/server.conf > /var/log/vpn 2>&1 & +root@manager:~# netstat -anp | grep 2376 
-[1] 11644+tcp6            0 :::2376                 :::                   LISTEN      1868/dockerd 
 </code> </code>
  
-Vérifiez ensuite que le **socket** d'openvpn soit ouvert :+====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@centos7 ~]netstat -an | grep 1194 +root@manager:~# scp ca.pem key.pem cert.pem trainee@10.0.2.45:/home/trainee/ 
-udp        0      0 0.0.0.0:1194                0.0.0.0:   +The authenticity of host '10.0.2.45 (10.0.2.45)' can't be established. 
 +ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. 
 +Are you sure you want to continue connecting (yes/no)? yes 
 +Warning: Permanently added '10.0.2.45' (ECDSA) to the list of known hosts. 
 +trainee@10.0.2.45's passwordtrainee 
 +ca.pem                                                                                                                                 100% 2163   917.8KB/  00:00     
 +key.pem                                                                                                                                100% 3243     3.0MB/  00:00    
 +cert.pem                                                                                                                               100% 1907   921.7KB/  00:00 
 </code> </code>
  
-Constatez ensuite la table de routage :+Lancez la commande **docker version** sur la VM **10.0.2.45** : 
 + 
 +<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
  
-<code>                             +Server: Docker Engine Community 
-[root@centos7 ~]# netstat -ar  + Engine: 
-Kernel IP routing table +  Version:          19.03.4 
-Destination     Gateway         Genmask         Flags   MSS Fenêtre irtt Iface +  API version:      1.40 (minimum version 1.12) 
-0.0.0.0         10.0.2.       0.0.0.0         UG        0 0          0 enp0s3 +  Go version:       go1.12.10 
-10.0.0.       0.0.0.0         255.255.255.255 UH        0 0          tun0 +  Git commit:       9013bf583a 
-10.0.2.0        0.0.0.0         255.255.255.0           0 0          0 enp0s3+  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> </code>
  
-Constatez ensuite le montage du tunnel en regardant le contenu du fichier de journalisation **/var/log/vpn** :+Afin de faciliter l'utilisation des commandes sur le serveur à partir de myregistry, créez le répertoire **~/.docker** :
  
 <code> <code>
-[root@centos7 ~]# tail /var/log/vpn+trainee@myregistry:~$ mkdir -pv ~/.docker 
 +mkdir: création du répertoire '/home/trainee/.docker'
 </code> </code>
  
-====Tests====+Copiez ensuite les fichiers *.pem dans le répertoire **~/.docker** :
  
-===Du client vers le serveur===+<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>
  
-Sur le client, utilisez la commande ping pour envoyer des paquets dans le tunnel :+Créez les deux variables **DOCKER_HOST** et **DOCKER_TLS_VERIFY** :
  
 <code> <code>
-[root@centos6 ~]# ping -c3 10.0.0.1 +trainee@myregistry:~$ export DOCKER_HOST=tcp://manager.i2tch.loc:2376 DOCKER_TLS_VERIFY=1
-PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. +
-64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=7.62 ms +
-64 bytes from 10.0.0.1icmp_seq=2 ttl=64 time=1.35 ms +
-64 bytes from 10.0.0.1icmp_seq=3 ttl=64 time=0.000 ms +
- +
---- 10.0.0.ping statistics --- +
-3 packets transmitted, 3 received, 0% packet loss, time 2047ms +
-rtt min/avg/max/mdev = 0.000/2.994/7.629/3.323 ms+
 </code> </code>
  
-===Du serveur vers le client=== +Maintenant la connexion est sécurisée par défaut :
- +
-Sur le serveur, utilisez la commande ping pour envoyer des paquets dans le tunnel :+
  
 <code> <code>
-[root@centos7 ~]# ping -c5 10.0.0.2 +trainee@myregistry:~$ docker image ls 
-PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data+REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
-64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=2.59 ms +i2tch/docker        nottrusted          686e85ee76b8        19 hours ago        5.03MB 
-64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=9.08 ms +i2tch/otherimage    latest              686e85ee76b8        19 hours ago        5.03MB 
-64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=7.24 ms +ubuntu              latest              775349758637        10 days ago         64.2MB 
-64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=7.03 ms +nginx               latest              540a289bab6c        weeks ago         126MB 
-64 bytes from 10.0.0.2: icmp_seq=ttl=64 time=4.08 ms +alpine              latest              965ea09ff2eb        weeks ago         5.55MB 
- +i2tch/docker        alpine              965ea09ff2eb        weeks ago         5.55MB 
---- 10.0.0.2 ping statistics --- +mysql               latest              c8ee894bd2bd        3 weeks ago         456MB 
-packets transmitted, 5 received, 0% packet loss, time 4034ms +centos              latest              0f3e07c0138f        weeks ago         220MB 
-rtt min/avg/max/mdev = 2.597/6.008/9.084/2.340 ms+docker/trusttest    latest              cc7629d1331a        4 years ago         5.03MB
 </code> </code>
  
 ----- -----
-Copyright © 2025 Hugh Norris.+Copyright © 2025 Hugh NORRIS 
Menu