Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
elearning:workbooks:docker2:drf03 [2020/05/28 15:22] – admin | elearning:workbooks:docker2:drf03 [2021/12/29 10:32] (Version actuelle) – admin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | |||
~~PDF: | ~~PDF: | ||
- | Version : **2020.01** | + | Version : **2022.01** |
Dernière mise-à-jour : ~~LASTMOD~~ | Dernière mise-à-jour : ~~LASTMOD~~ | ||
Ligne 10: | Ligne 11: | ||
* **DOF204 - Gestion de la Sécurité de Docker** | * **DOF204 - Gestion de la Sécurité de Docker** | ||
- | * LAB #8 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker | + | |
- | * LAB #9 - Le Script docker-bench-security.sh | + | |
- | * LAB #10 - Sécurisation de la Configuration de l' | + | * 1.1 - Présentation des Namespaces |
- | * LAB #11 - Sécurisation de la Configuration du daemon Docker | + | * 1.2 - Présentation des CGroups |
- | * Le Fichier / | + | * 1.3 - Limitation de la Mémoire |
- | * LAB #12 - Sécurisation des Images et les Fichiers de Construction | + | * 1.4 - Le Paquet cgroup-tools |
- | * LAB #13 - Sécurisation du Container Runtime | + | * La commande cgcreate |
- | * LAB #14 - Sécurisation des Images avec Docker Content Trust | + | * La Commande cgexec |
- | * DOCKER_CONTENT_TRUST | + | * La Commande cgdelete |
- | * DCT et la commande docker pull | + | * Le Fichier / |
- | * L' | + | * LAB #2 - Utilisation des Docker Secrets |
- | * DCT et la commande docker push | + | * LAB #3 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker |
- | * DCT et la commande docker build | + | * LAB #4 - Le Script docker-bench-security.sh |
- | * Créer un deuxième Repositry | + | * LAB #5 - Sécurisation de la Configuration de l' |
- | * Supprimer une Signature | + | * 5.1 - [WARN] 1.2.1 - Ensure a separate partition for containers has been created |
- | * LAB #15 - Sécurisation du Socket du Daemon Docker | + | * 5.2 - [WARN] 1.2.3 - Ensure auditing is configured for the Docker daemon |
- | * Création du Certificat de l' | + | * LAB #6 - Sécurisation de la Configuration du daemon Docker |
- | * Création du Certificat du Serveur Hôte du Daemon Docker | + | * 6.1 - [WARN] 2.1 - Ensure network traffic is restricted between containers on the default bridge |
- | * Création du Certificat du Client | + | * 6.2 - [WARN] 2.8 - Enable user namespace support |
- | * Démarrage du Daemon Docker avec une Invocation Directe | + | * 6.3 - [WARN] 2.11 - Ensure that authorization for Docker client commands is enabled |
- | * Configuration du Client | + | * 6.4 - [WARN] 2.12 - Ensure centralized and remote logging is configured |
+ | * 6.5 - [WARN] 2.14 - Ensure Userland Proxy is Disabled | ||
+ | * 6.6 - [WARN] 2.17 - Ensure containers are restricted from acquiring new privileges | ||
+ | * 6.7 - Le Fichier / | ||
+ | * LAB #7 - Sécurisation des Images et les Fichiers de Construction | ||
+ | * 7.1 - [WARN] 4.1 - Ensure a user for the container has been created | ||
+ | * 7.2 - [WARN] 4.5 - Ensure Content trust for Docker is Enabled | ||
+ | * 7.3 - [WARN] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images | ||
+ | * LAB #8 - Sécurisation du Container Runtime | ||
+ | * 8.1 - [WARN] 5.1 - Ensure AppArmor Profile is Enabled | ||
+ | * 8.2 - [WARN] 5.2 - Ensure SELinux security options are set, if applicable | ||
+ | * 8.3 - [WARN] 5.10 - Ensure memory usage for container is limited | ||
+ | * 8.4 - [WARN] 5.11 - Ensure CPU priority is set appropriately on the container | ||
+ | * 8.5 - [WARN] 5.12 - Ensure the container' | ||
+ | * 8.6 - [WARN] 5.14 - Ensure ' | ||
+ | * 8.7 - [WARN] 5.25 - Ensure the container is restricted from acquiring additional privileges | ||
+ | * 8.8 - [WARN] 5.26 - Ensure container health is checked at runtime | ||
+ | * 8.9 - [WARN] 5.28 - Ensure PIDs cgroup limit is used | ||
+ | * LAB #9 - Sécurisation des Images avec Docker Content Trust | ||
+ | * 9.1 - DOCKER_CONTENT_TRUST | ||
+ | * 9.2 - DCT et la commande docker pull | ||
+ | * L' | ||
+ | * 9.3 - DCT et la commande docker push | ||
+ | * 9.4 - DCT et la commande docker build | ||
+ | * Créer un deuxième Repositry | ||
+ | * Supprimer une Signature | ||
+ | * LAB #10 - Sécurisation du Socket du Daemon Docker | ||
+ | * 10.1 - Création du Certificat de l' | ||
+ | * 10.2 - Création du Certificat du Serveur Hôte du Daemon Docker | ||
+ | * 10.3 - Création du Certificat du Client | ||
+ | * 10.4 - Démarrage du Daemon Docker avec une Invocation Directe | ||
+ | * 10.5 - Configuration du Client | ||
+ | |||
+ | =====LAB #1 - Travailler avec les CGroups====== | ||
+ | |||
+ | ====1.1 - Présentation des Namespaces==== | ||
+ | |||
+ | Les espaces de noms permettent de regrouper des processus dans un même espace et d' | ||
+ | |||
+ | ====1.2 - Présentation des CGroups==== | ||
+ | |||
+ | Les Groupes de Contrôles (Control Groups) aussi appelés **CGroups**, | ||
+ | |||
+ | Les CGroups sont organisés de manière hiérarchique, | ||
+ | |||
+ | Ces hiérarchies multiples et séparés sont necéssaires parce que chaque hiérarchie est attaché à un ou plusieurs sous-système(s) aussi appelés des **Contrôleurs de Ressources** ou simplement des **Contrôleurs**. Les contrôleurs disponibles sont : | ||
+ | |||
+ | * **blkio** - utilisé pour établir des limites sur l' | ||
+ | * **cpu** - utilisé pour fournir aux tâches des groupes de contrôle accès au CPU grâce au planificateur, | ||
+ | * **cpuacct** - utilisé pour produire des rapports automatiques sur les ressources CPU utilisées par les tâches dans un groupe de contrôle, | ||
+ | * **cpuset** - utilisé pour assigner des CPU individuels sur un système multicœur et des nœuds de mémoire à des tâches dans un groupe de contrôle, | ||
+ | * **devices** - utilisé pour autoriser ou pour refuser l' | ||
+ | * **freezer** - utilisé pour suspendre ou pour réactiver les tâches dans un groupe de contrôle, | ||
+ | * **memory** - utilisé pour établir les limites d' | ||
+ | * **net_cls** - utilisé pour repérer les paquets réseau avec un identifiant de classe (classid) afin de permettre au contrôleur de trafic Linux, **tc**, d' | ||
+ | * **perf_event** - utilisé pour permettre le monitoring des CGroups avec l' | ||
+ | * **hugetlb** - utilisé pour limiter des ressources sur des pages de mémoire virtuelle de grande taille. | ||
+ | |||
+ | Les hiérarchies ont des points de montage dans le répertoire **/ | ||
+ | |||
+ | < | ||
+ | trainee@debian9: | ||
+ | Mot de passe : fenestros | ||
+ | root@debian9: | ||
+ | total 0 | ||
+ | dr-xr-xr-x 2 root root 0 mai 26 08:52 blkio | ||
+ | lrwxrwxrwx 1 root root 11 mai 26 08:52 cpu -> cpu, | ||
+ | lrwxrwxrwx 1 root root 11 mai 26 08:52 cpuacct -> cpu, | ||
+ | dr-xr-xr-x 2 root root 0 mai 26 08:52 cpu, | ||
+ | dr-xr-xr-x 2 root root 0 mai 26 08:52 cpuset | ||
+ | dr-xr-xr-x 5 root root 0 mai 26 08:52 devices | ||
+ | dr-xr-xr-x 2 root root 0 mai 26 08:52 freezer | ||
+ | dr-xr-xr-x 2 root root 0 mai 26 08:52 memory | ||
+ | lrwxrwxrwx 1 root root 16 mai 26 08:52 net_cls -> net_cls, | ||
+ | dr-xr-xr-x 2 root root 0 mai 26 08:52 net_cls, | ||
+ | lrwxrwxrwx 1 root root 16 mai 26 08:52 net_prio -> net_cls, | ||
+ | dr-xr-xr-x 2 root root 0 mai 26 08:52 perf_event | ||
+ | dr-xr-xr-x 5 root root 0 mai 26 08:52 pids | ||
+ | dr-xr-xr-x 5 root root 0 mai 26 08:52 systemd | ||
+ | </ | ||
+ | |||
+ | **Systemd** organise les processus dans chaque CGroup. Par exemple tous les processus démarrés par le serveur Apache se trouveront dans le même CGroup, y compris les scripts CGI. Ceci implique que la gestion des ressources en utilisant des hiérarchies est couplé avec l' | ||
+ | |||
+ | En haut de l' | ||
+ | |||
+ | * le **system.slice** - l' | ||
+ | * le **user.slice** - l' | ||
+ | * le **machine.slice** - l' | ||
+ | |||
+ | En dessous des tranches peuvent se trouver : | ||
+ | |||
+ | * des **scopes** - des processus crées par **fork**, | ||
+ | * des **services** - des processus créés par une **Unité**. | ||
+ | |||
+ | Les slices peuvent être visualisés avec la commande suivante : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | UNIT | ||
+ | -.slice | ||
+ | system-getty.slice loaded active active system-getty.slice | ||
+ | system.slice | ||
+ | user-1000.slice | ||
+ | user-112.slice | ||
+ | user.slice | ||
+ | |||
+ | LOAD = Reflects whether the unit definition was properly loaded. | ||
+ | ACTIVE = The high-level unit activation state, i.e. generalization of SUB. | ||
+ | SUB = The low-level unit activation state, values depend on unit type. | ||
+ | |||
+ | 6 loaded units listed. Pass --all to see loaded but inactive units, too. | ||
+ | To show all installed unit files use ' | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | Control group /: | ||
+ | -.slice | ||
+ | ├─user.slice | ||
+ | │ ├─user-112.slice | ||
+ | │ │ ├─user@112.service | ||
+ | │ │ │ ├─dbus.service | ||
+ | │ │ │ │ └─539 / | ||
+ | │ │ │ ├─init.scope | ||
+ | │ │ │ │ ├─527 / | ||
+ | │ │ │ │ └─528 (sd-pam) | ||
+ | │ │ │ └─gvfs-daemon.service | ||
+ | │ │ │ | ||
+ | │ │ └─session-c1.scope | ||
+ | │ │ | ||
+ | │ │ | ||
+ | │ │ | ||
+ | │ │ | ||
+ | │ │ | ||
+ | │ └─user-1000.slice | ||
+ | │ | ||
+ | │ │ ├─668 sshd: trainee [priv] | ||
+ | │ │ ├─679 sshd: trainee@pts/ | ||
+ | │ │ ├─680 -bash | ||
+ | │ │ ├─689 su - | ||
+ | │ │ ├─690 -su | ||
+ | │ │ ├─708 systemd-cgls | ||
+ | │ │ └─709 systemd-cgls | ||
+ | │ | ||
+ | │ | ||
+ | │ | ||
+ | │ | ||
+ | ├─init.scope | ||
+ | │ └─1 / | ||
+ | └─system.slice | ||
+ | ├─lightdm.service | ||
+ | │ ├─410 / | ||
+ | │ ├─425 / | ||
+ | │ └─588 lightdm --session-child 14 21 | ||
+ | ├─anacron.service | ||
+ | lines 1-39 | ||
+ | </ | ||
+ | |||
+ | En utilisant Systemd, plusieurs ressources peuvent être limitées : | ||
+ | |||
+ | * **CPUShares** - par défaut 1024, | ||
+ | * **MemoryLimit** - limite exprimée en Mo ou en Go. Pas de valeur par défaut, | ||
+ | * **BlockIOWeight** - valeur entre 10 et 1000. Pas de valeur par défaut, | ||
+ | * **StartupCPUShares** - comme CPUShares mais uniquement appliqué pendant le démarrage, | ||
+ | * **StartupBlockIOWeight** - comme BlockIOWeight mais uniquement appliqué pendant le démarrage, | ||
+ | * **CPUQuota** - utilisé pour limiter le temps CPU, même quand le système ne fait rien. | ||
+ | |||
+ | <WRAP center round important> | ||
+ | **Important** : Consultez le manuel systemd.resource-control(5) pour voir les paramètres CGroup qui peuvent être passés à systemctl. | ||
+ | </ | ||
+ | |||
+ | ====1.3 - Limitation de la Mémoire==== | ||
+ | |||
+ | Pour travailler avec les CGroups dans Debian 9, il convient d' | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | </ | ||
+ | |||
+ | Commencez ensuite par créer le script **hello-world.sh** qui servira à générer un processus pour travailler avec les CGroups : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | # | ||
+ | while [ 1 ]; do | ||
+ | echo "hello world" | ||
+ | sleep 60 | ||
+ | done | ||
+ | </ | ||
+ | |||
+ | Rendez le script exécutable et testez-le : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | hello world | ||
+ | hello world | ||
+ | ^C | ||
+ | </ | ||
+ | |||
+ | Créez maintenant un CGroup dans le sous-système **memory** appelé **helloworld** : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | </ | ||
+ | |||
+ | Par défaut, ce CGroup héritera de l' | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | 39997440 | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | **Important** - Notez que les 40 000 000 demandés sont devenus 39 997 440 ce qui correspond à un nombre entier de pages mémoire du noyau de 4Ko. ( 39 997 440 / 4096 = 9 765 ). | ||
+ | </ | ||
+ | |||
+ | Lancez maintenant le script **helloworld.sh** : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | [1] 1012 | ||
+ | root@debian9: | ||
+ | |||
+ | root@debian9: | ||
+ | root 1012 0.0 0.1 11172 2868 pts/0 S 10:24 0:00 /bin/bash ./ | ||
+ | root 1015 0.0 0.0 12784 968 pts/0 S+ | ||
+ | </ | ||
+ | |||
+ | Notez l' | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | CGROUP | ||
+ | 6: | ||
+ | </ | ||
+ | |||
+ | Insérer le PID de notre script dans le CGroup **helloworld** : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | </ | ||
+ | |||
+ | Notez maintenant l' | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | CGROUP | ||
+ | 6: | ||
+ | </ | ||
+ | |||
+ | Constatez ensuite l' | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | 319488 | ||
+ | </ | ||
+ | |||
+ | Tuez le script **hello-world.sh** : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | root 1038 0.0 0.0 12784 936 pts/0 S+ | ||
+ | [1]+ Complété | ||
+ | </ | ||
+ | |||
+ | Créez un second CGroup beaucoup plus restrictif : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | 4096 | ||
+ | </ | ||
+ | |||
+ | Relancez le script **hello-world.sh** et insérez-le dans le nouveau CGroup : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | [1] 1042 | ||
+ | root@debian9: | ||
+ | |||
+ | root@debian9: | ||
+ | </ | ||
+ | |||
+ | Attendez la prochaine sortie de **hello world** sur le canal standard puis constatez que le script s' | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | |||
+ | [1]+ Processus arrêté | ||
+ | </ | ||
+ | |||
+ | Consultez en suite la fin du fichier **/ | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775169] | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775171] | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775175] | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775176] Task in / | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775180] memory: usage 4kB, limit 4kB, failcnt 17 | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775180] memory+swap: | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775181] kmem: usage 0kB, limit 9007199254740988kB, | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775181] Memory cgroup stats for / | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775188] [ pid ] | ||
+ | Jul 28 10:39:26 debian9 kernel: [ 1501.775219] [ 1042] | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | **Important** - Notez la trace **Task in / | ||
+ | </ | ||
+ | |||
+ | ====1.4 - Le Paquet cgroup-tools==== | ||
+ | |||
+ | Le paquet **cgroup-tools** installe des commandes dites //de facilité// dont : | ||
+ | |||
+ | ===La commande cgcreate=== | ||
+ | |||
+ | Cette commande permet la création d'un CGroup : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | total 0 | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 cgroup.clone_children | ||
+ | --w--w--w- 1 root root 0 juil. 28 11:09 cgroup.event_control | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 cgroup.procs | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.failcnt | ||
+ | --w------- 1 root root 0 juil. 28 11:09 memory.force_empty | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.kmem.failcnt | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.kmem.limit_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.kmem.max_usage_in_bytes | ||
+ | -r--r--r-- 1 root root 0 juil. 28 11:09 memory.kmem.slabinfo | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.kmem.tcp.failcnt | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.kmem.tcp.limit_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.kmem.tcp.max_usage_in_bytes | ||
+ | -r--r--r-- 1 root root 0 juil. 28 11:09 memory.kmem.tcp.usage_in_bytes | ||
+ | -r--r--r-- 1 root root 0 juil. 28 11:09 memory.kmem.usage_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.limit_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.max_usage_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.move_charge_at_immigrate | ||
+ | -r--r--r-- 1 root root 0 juil. 28 11:09 memory.numa_stat | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.oom_control | ||
+ | ---------- 1 root root 0 juil. 28 11:09 memory.pressure_level | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.soft_limit_in_bytes | ||
+ | -r--r--r-- 1 root root 0 juil. 28 11:09 memory.stat | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.swappiness | ||
+ | -r--r--r-- 1 root root 0 juil. 28 11:09 memory.usage_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 memory.use_hierarchy | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 notify_on_release | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 11:09 tasks | ||
+ | </ | ||
+ | |||
+ | Il n' | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | </ | ||
+ | |||
+ | ===La Commande cgexec=== | ||
+ | |||
+ | Cette commande permet d' | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | [2] 1860 | ||
+ | root@debian9: | ||
+ | |||
+ | root@debian9: | ||
+ | </ | ||
+ | |||
+ | === La Commande cgdelete=== | ||
+ | |||
+ | Une fois le script terminé, cette commande permet de supprimer le cgroup : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root 1073 0.0 0.1 11172 2868 pts/0 S 11:18 0:00 /bin/bash ./ | ||
+ | root 1076 0.0 0.0 528 4 pts/0 R+ | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | root 1078 0.0 0.0 12784 920 pts/0 S+ | ||
+ | [1]+ Complété | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | ls: impossible d' | ||
+ | </ | ||
+ | |||
+ | ===Le Fichier / | ||
+ | |||
+ | Afin de les rendre persistants, | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | group helloworld2 { | ||
+ | cpu { | ||
+ | cpu.shares = 100; | ||
+ | } | ||
+ | memory { | ||
+ | memory.limit_in_bytes = 40000; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | **Important** - Notez la création de **deux** limitations, | ||
+ | </ | ||
+ | |||
+ | Créez donc les deux CGroups concernés : | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | total 0 | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 cgroup.clone_children | ||
+ | --w--w--w- 1 root root 0 juil. 28 12:47 cgroup.event_control | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 cgroup.procs | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.failcnt | ||
+ | --w------- 1 root root 0 juil. 28 12:47 memory.force_empty | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.kmem.failcnt | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.kmem.limit_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.kmem.max_usage_in_bytes | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:47 memory.kmem.slabinfo | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.kmem.tcp.failcnt | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.kmem.tcp.limit_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.kmem.tcp.max_usage_in_bytes | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:47 memory.kmem.tcp.usage_in_bytes | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:47 memory.kmem.usage_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.limit_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.max_usage_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.move_charge_at_immigrate | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:47 memory.numa_stat | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.oom_control | ||
+ | ---------- 1 root root 0 juil. 28 12:47 memory.pressure_level | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.soft_limit_in_bytes | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:47 memory.stat | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.swappiness | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:47 memory.usage_in_bytes | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 memory.use_hierarchy | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 notify_on_release | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:47 tasks | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | total 0 | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:48 cgroup.clone_children | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:48 cgroup.procs | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:48 cpuacct.stat | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:48 cpuacct.usage | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:48 cpuacct.usage_all | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:48 cpuacct.usage_percpu | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:48 cpuacct.usage_percpu_sys | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:48 cpuacct.usage_percpu_user | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:48 cpuacct.usage_sys | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:48 cpuacct.usage_user | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:48 cpu.cfs_period_us | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:48 cpu.cfs_quota_us | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:48 cpu.shares | ||
+ | -r--r--r-- 1 root root 0 juil. 28 12:48 cpu.stat | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:48 notify_on_release | ||
+ | -rw-r--r-- 1 root root 0 juil. 28 12:48 tasks | ||
+ | </ | ||
+ | |||
+ | Appliquez le contenu du fichier **/ | ||
+ | |||
+ | < | ||
+ | root@debian9: | ||
+ | root@debian9: | ||
+ | 36864 | ||
+ | root@debian9: | ||
+ | 100 | ||
+ | </ | ||
+ | |||
+ | =====LAB #2 - Utilisation des Docker Secrets===== | ||
+ | |||
+ | Les secrets Docker sont une façon sécurisée de stocker des informations sensibles telles les noms d' | ||
+ | |||
+ | Considérez l' | ||
+ | |||
+ | < | ||
+ | version: ' | ||
+ | |||
+ | services: | ||
+ | |||
+ | db: | ||
+ | image: postgres | ||
+ | environment: | ||
+ | POSTGRES_USER: | ||
+ | POSTGRES_PASSWORD: | ||
+ | POSTGRES_DB: | ||
+ | |||
+ | adminer: | ||
+ | image: adminer | ||
+ | ports: | ||
+ | - 8080:8080 | ||
+ | </ | ||
+ | |||
+ | On peut constater dans ce fichier la présence des informations sensibles en non-sécurisées : | ||
+ | |||
+ | * POSTGRES_USER | ||
+ | * POSTGRES_PASSWORD | ||
+ | * POSTGRES_DB | ||
+ | |||
+ | Afin de sécuriser ces informations, | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | </ | ||
+ | |||
+ | Créez ensuite un Docker Secret appelé **pg_user** : | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | root@manager: | ||
+ | lpk8eq80qvfiqw7z1686fmj5t | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez l' | ||
+ | </ | ||
+ | |||
+ | Pour visualiser la liste des secrets, utilisez la commande docker secrets **ls** : | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | ID NAME DRIVER | ||
+ | lpk8eq80qvfiqw7z1686fmj5t | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **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' | ||
+ | </ | ||
+ | |||
+ | Créez maintenant les secrets **pg_password** et **pg_database** : | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | h9tsfbfwz6o0sd35roklwpopi | ||
+ | root@manager: | ||
+ | 5lx4zydpfocwgpdto0yy1jod9 | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez qu'un secret Docker est immuable. | ||
+ | </ | ||
+ | |||
+ | Vérifiez la prise en compte de vos commandes : | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | ID NAME DRIVER | ||
+ | 5lx4zydpfocwgpdto0yy1jod9 | ||
+ | h9tsfbfwz6o0sd35roklwpopi | ||
+ | lpk8eq80qvfiqw7z1686fmj5t | ||
+ | </ | ||
+ | |||
+ | Pour obtenir de l' | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | [ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | ] | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **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. | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | ID: 5lx4zydpfocwgpdto0yy1jod9 | ||
+ | Name: pg_database | ||
+ | Driver: | ||
+ | Created at: 2021-04-15 03: | ||
+ | Updated at: 2021-04-15 03: | ||
+ | </ | ||
+ | |||
+ | Créez maintenant le fichier compose **postgres-secrets.yaml** : | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | root@manager: | ||
+ | version: ' | ||
+ | |||
+ | services: | ||
+ | |||
+ | db: | ||
+ | image: postgres | ||
+ | restart: always | ||
+ | environment: | ||
+ | POSTGRES_USER_FILE: | ||
+ | POSTGRES_PASSWORD_FILE: | ||
+ | POSTGRES_DB_FILE: | ||
+ | secrets: | ||
+ | - pg_password | ||
+ | - pg_user | ||
+ | - pg_database | ||
+ | |||
+ | adminer: | ||
+ | image: adminer | ||
+ | ports: | ||
+ | - 8080:8080 | ||
+ | |||
+ | secrets: | ||
+ | pg_user: | ||
+ | external: true | ||
+ | pg_password: | ||
+ | external: true | ||
+ | pg_database: | ||
+ | external: true | ||
+ | </ | ||
+ | |||
+ | Notez que dans ce fichier les trois variables **POSTGRES_USER**, | ||
+ | |||
+ | Deuxièmement la section suivantes spécifie les noms des secrets à utiliser avec le service : | ||
+ | |||
+ | < | ||
+ | secrets: | ||
+ | - pg_password | ||
+ | - pg_user | ||
+ | - pg_database | ||
+ | </ | ||
+ | |||
+ | La dernière section spécifie que les secrets sont **externes** : | ||
+ | |||
+ | < | ||
+ | secrets: | ||
+ | pg_user: | ||
+ | external: true | ||
+ | pg_password: | ||
+ | external: true | ||
+ | pg_database: | ||
+ | external: true | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Le terme **externe** indique que les secrets ne seront pas stockés dans l' | ||
+ | </ | ||
+ | |||
+ | Déployez maintenant le service en utilisant la commande **docker stack** : | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | Ignoring unsupported options: restart | ||
+ | |||
+ | Creating network postgres_default | ||
+ | Creating service postgres_db | ||
+ | Creating service postgres_adminer | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez a présence de l' | ||
+ | </ | ||
+ | |||
+ | Connectez-vous maintenant à Apache Guacamole et ouvrez un navigateur web dans la machine virtuelle. Naviguez ensuite à l' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Validez le formulaire et vérifiez que les secrets ont été pris en compte : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Dernièrement, | ||
+ | |||
+ | < | ||
+ | root@manager: | ||
+ | NAME SERVICES | ||
+ | postgres | ||
+ | root@manager: | ||
+ | Removing service postgres_adminer | ||
+ | Removing service postgres_db | ||
+ | Removing network postgres_default | ||
+ | </ | ||
- | =====LAB #8 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker===== | + | =====LAB #3 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker===== |
Au contraire des solutions classiques de gestion de machines virtuelles où l' | Au contraire des solutions classiques de gestion de machines virtuelles où l' | ||
Ligne 50: | Ligne 746: | ||
trainee@manager: | trainee@manager: | ||
alpine1 | alpine1 | ||
- | trainee@manager: | + | trainee@manager: |
a214e2df0499c97e8da25a6c9ea751ac75344c9bcd7d238f8cb8d5c777510ab9 | a214e2df0499c97e8da25a6c9ea751ac75344c9bcd7d238f8cb8d5c777510ab9 | ||
trainee@manager: | trainee@manager: | ||
Ligne 57: | Ligne 753: | ||
</ | </ | ||
- | =====LAB #9 - Le Script docker-bench-security.sh===== | + | =====LAB #4 - Le Script docker-bench-security.sh===== |
Le **Center for Internet Security (CIS)** est une organisation indépendante à but non-lucratif qui publie des best practices dans de nombreux domaines de l' | 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' | ||
Ligne 125: | Ligne 821: | ||
* **[NOTE]** : Vous informe d'un **best practice**. | * **[NOTE]** : Vous informe d'un **best practice**. | ||
- | =====LAB #10 - Sécurisation de la Configuration de l' | + | =====LAB #5 - Sécurisation de la Configuration de l' |
Lors de l' | Lors de l' | ||
Ligne 161: | Ligne 857: | ||
Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**. | Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**. | ||
- | ====[WARN] 1.2.1 - Ensure a separate partition for containers has been created==== | + | ====5.1 - [WARN] 1.2.1 - Ensure a separate partition for containers has been created==== |
Par défaut, tous les fichiers de Docker sont stockés dans le répertoire **/ | Par défaut, tous les fichiers de Docker sont stockés dans le répertoire **/ | ||
- | ====[WARN] 1.2.3 - Ensure auditing is configured for the Docker daemon==== | + | ====5.2 - [WARN] 1.2.3 - Ensure auditing is configured for the Docker daemon==== |
< | < | ||
Ligne 265: | Ligne 961: | ||
</ | </ | ||
- | =====LAB #11 - Sécurisation de la Configuration du daemon Docker===== | + | =====LAB #6 - Sécurisation de la Configuration du daemon Docker===== |
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 : | 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 : | ||
Ligne 296: | Ligne 992: | ||
Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**. | Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**. | ||
- | ====[WARN] 2.1 - Ensure network traffic is restricted between containers on the default bridge==== | + | ====6.1 - [WARN] 2.1 - Ensure network traffic is restricted between containers on the default bridge==== |
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. | 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. | ||
Ligne 302: | Ligne 998: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 2.8 - Enable user namespace support==== | + | ====6.2 - [WARN] 2.8 - Enable user namespace support==== |
Cet avertissement nous indique que l' | Cet avertissement nous indique que l' | ||
Ligne 308: | Ligne 1004: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 2.11 - Ensure that authorization for Docker client commands is enabled==== | + | ====6.3 - [WARN] 2.11 - Ensure that authorization for Docker client commands is enabled==== |
Par défaut, Docker permet un accès sans restrictions aux daemon Docker. Il est possible de restreindre l' | Par défaut, Docker permet un accès sans restrictions aux daemon Docker. Il est possible de restreindre l' | ||
Ligne 314: | Ligne 1010: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 2.12 - Ensure centralized and remote logging is configured==== | + | ====6.4 - [WARN] 2.12 - Ensure centralized and remote logging is configured==== |
Cet avertissement indique que la configuration de rsyslog ne permet pas l' | Cet avertissement indique que la configuration de rsyslog ne permet pas l' | ||
Ligne 320: | Ligne 1016: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 2.14 - Ensure Userland Proxy is Disabled==== | + | ====6.5 - [WARN] 2.14 - Ensure Userland Proxy is Disabled==== |
Il existe deux méthodes pour qu'un conteneur puisse router vers l' | Il existe deux méthodes pour qu'un conteneur puisse router vers l' | ||
Ligne 331: | Ligne 1027: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 2.17 - Ensure containers are restricted from acquiring new privileges==== | + | ====6.6 - [WARN] 2.17 - Ensure containers are restricted from acquiring new privileges==== |
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**. | 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**. | ||
Ligne 337: | Ligne 1033: | ||
Pour plus d' | Pour plus d' | ||
- | ====Le Fichier / | + | ====6.7 - Le Fichier / |
Créez le fichier **/ | Créez le fichier **/ | ||
Ligne 390: | Ligne 1086: | ||
Pour plus d' | Pour plus d' | ||
- | =====LAB #12 - Sécurisation des Images et les Fichiers de Construction===== | + | =====LAB #7 - Sécurisation des Images et les Fichiers de Construction===== |
Créez le conteneur mysql : | Créez le conteneur mysql : | ||
Ligne 442: | Ligne 1138: | ||
</ | </ | ||
- | ====[WARN] 4.1 - Ensure a user for the container has been created==== | + | ====7.1 - [WARN] 4.1 - Ensure a user for the container has been created==== |
- | Les processus dans le conteneur **root-nginx** tourne sous l'UID de root. Ceci est l' | + | Les processus dans le conteneur **mysql** tourne sous l'UID de root. Ceci est l' |
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 4.5 - Ensure Content trust for Docker is Enabled==== | + | ====7.2 - [WARN] 4.5 - Ensure Content trust for Docker is Enabled==== |
Cette ligne indique que le support de Content trust n'a pas été activé. Content trust permet de s' | Cette ligne indique que le support de Content trust n'a pas été activé. Content trust permet de s' | ||
Ligne 496: | Ligne 1192: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images==== | + | ====7.3 - [WARN] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images==== |
Quand une image est construite il est possible d'y mettre un **HEALTHCHECK** dont le statut peut être vérifié par Docker afin de relancer le conteneur si nécessaire. | 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. | ||
Ligne 510: | Ligne 1206: | ||
Pour plus d' | Pour plus d' | ||
- | =====LAB #13 - Sécurisation du Container Runtime===== | + | =====LAB #8 - Sécurisation du Container Runtime===== |
Exécutez de nouveau le script **docker-bench-security.sh**, | Exécutez de nouveau le script **docker-bench-security.sh**, | ||
Ligne 565: | Ligne 1261: | ||
Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**. | Les problèmes de sécurité qu'il convient à résoudre sont indiqués par les annotations **[WARN]**. | ||
- | ====[WARN] 5.1 - Ensure AppArmor Profile is Enabled==== | + | ====8.1 - [WARN] 5.1 - Ensure AppArmor Profile is Enabled==== |
Cet avertissement est présent parce que le conteneur n' | Cet avertissement est présent parce que le conteneur n' | ||
Ligne 571: | Ligne 1267: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 5.2 - Ensure SELinux security options are set, if applicable==== | + | ====8.2 - [WARN] 5.2 - Ensure SELinux security options are set, if applicable==== |
Cet avertissement est présent parce que le conteneur n' | Cet avertissement est présent parce que le conteneur n' | ||
Ligne 577: | Ligne 1273: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 5.10 - Ensure memory usage for container is limited==== | + | ====8.3 - [WARN] 5.10 - Ensure memory usage for container is limited==== |
Cet avertissement est du au fait que les conteneurs ont automatiquement accès à la totalité de la RAM de l' | Cet avertissement est du au fait que les conteneurs ont automatiquement accès à la totalité de la RAM de l' | ||
Ligne 610: | Ligne 1306: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 5.11 - Ensure CPU priority is set appropriately on the container==== | + | ====8.4 - [WARN] 5.11 - Ensure CPU priority is set appropriately on the container==== |
Cet avertissement est du au fait que les conteneurs ont automatiquement accès à tous les CPU de l' | Cet avertissement est du au fait que les conteneurs ont automatiquement accès à tous les CPU de l' | ||
Ligne 618: | Ligne 1314: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 5.12 - Ensure the container' | + | ====8.5 - [WARN] 5.12 - Ensure the container' |
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/ | 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/ | ||
Ligne 687: | Ligne 1383: | ||
</ | </ | ||
- | ====[WARN] 5.14 - Ensure ' | + | ====8.6 - [WARN] 5.14 - Ensure ' |
Cet avertissement concerne la politique de re-démarrage du conteneur. La politique **on-failure[: | Cet avertissement concerne la politique de re-démarrage du conteneur. La politique **on-failure[: | ||
Ligne 695: | Ligne 1391: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 5.25 - Ensure the container is restricted from acquiring additional privileges==== | + | ====8.7 - [WARN] 5.25 - Ensure the container is restricted from acquiring additional privileges==== |
Pour complémenter la configuration précédemment mise en place, il convient de lancer le conteneur en utilisant l' | Pour complémenter la configuration précédemment mise en place, il convient de lancer le conteneur en utilisant l' | ||
Ligne 703: | Ligne 1399: | ||
Pour plus d' | Pour plus d' | ||
- | ====[WARN] 5.26 - Ensure container health is checked at runtime==== | + | ====8.8 - [WARN] 5.26 - Ensure container health is checked at runtime==== |
Voir l' | Voir l' | ||
- | ====[WARN] 5.28 - Ensure PIDs cgroup limit is used==== | + | ====8.9 - [WARN] 5.28 - Ensure PIDs cgroup limit is used==== |
Sans l' | Sans l' | ||
Ligne 809: | Ligne 1505: | ||
</ | </ | ||
- | =====LAB #14 - Sécurisation des Images avec Docker Content Trust===== | + | =====LAB #9 - Sécurisation des Images avec Docker Content Trust===== |
**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' | **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' | ||
Ligne 819: | Ligne 1515: | ||
Pour plus d' | Pour plus d' | ||
- | ====DOCKER_CONTENT_TRUST==== | + | ====9.1 - DOCKER_CONTENT_TRUST==== |
Pour utiliser **Docker Content Trust (DCT)**, il convient de vérifier que la valeur de la variable **DOCKER_CONTENT_TRUST** est **1** : | Pour utiliser **Docker Content Trust (DCT)**, il convient de vérifier que la valeur de la variable **DOCKER_CONTENT_TRUST** est **1** : | ||
Ligne 836: | Ligne 1532: | ||
</ | </ | ||
- | ====DCT et la commande docker pull==== | + | ====9.2 - DCT et la commande docker pull==== |
Afin d' | Afin d' | ||
Ligne 843: | Ligne 1539: | ||
root@manager: | root@manager: | ||
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https:// | Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https:// | ||
- | Username: | + | Username: |
- | Password: | + | Password: |
WARNING! Your password will be stored unencrypted in / | WARNING! Your password will be stored unencrypted in / | ||
Configure a credential helper to remove this warning. See | Configure a credential helper to remove this warning. See | ||
Ligne 943: | Ligne 1639: | ||
</ | </ | ||
- | ====DCT et la commande docker push==== | + | ====9.3 - DCT et la commande docker push==== |
Pour envoyer l' | Pour envoyer l' | ||
< | < | ||
- | root@manager: | + | root@manager: |
</ | </ | ||
- | L' | + | L' |
< | < | ||
root@manager: | root@manager: | ||
- | REPOSITORY | + | REPOSITORY |
- | ubuntu | + | ubuntu |
- | nginx | + | nginx latest |
- | i2tch/ | + | < |
- | alpine | + | alpine |
- | mysql | + | mysql latest |
- | centos | + | centos |
</ | </ | ||
Ligne 970: | Ligne 1666: | ||
< | < | ||
- | root@manager: | + | root@manager: |
- | The push refers to repository [docker.io/i2tch/docker] | + | The push refers to repository [docker.io/< |
77cae8ab23bf: | 77cae8ab23bf: | ||
alpine: digest: sha256: | alpine: digest: sha256: | ||
Ligne 985: | Ligne 1681: | ||
Enter passphrase for new repository key with ID 168c754: fenestros | Enter passphrase for new repository key with ID 168c754: fenestros | ||
Repeat passphrase for new repository key with ID 168c754: fenestros | Repeat passphrase for new repository key with ID 168c754: fenestros | ||
- | Finished initializing " | + | Finished initializing " |
- | Successfully signed docker.io/i2tch/ | + | Successfully signed docker.io/< |
</ | </ | ||
Ligne 1027: | Ligne 1723: | ||
</ | </ | ||
- | ====DCT et la commande docker build==== | + | ====9.4 - DCT et la commande docker build==== |
L' | L' | ||
Ligne 1040: | Ligne 1736: | ||
</ | </ | ||
- | Lors du build de l' | + | Lors du build de l' |
< | < | ||
- | root@manager: | + | root@manager: |
Sending build context to Docker daemon | Sending build context to Docker daemon | ||
Ligne 1049: | Ligne 1745: | ||
</ | </ | ||
- | L' | + | L' |
< | < | ||
- | root@manager: | + | root@manager: |
Sending build context to Docker daemon | Sending build context to Docker daemon | ||
Step 1/2 : FROM docker/ | Step 1/2 : FROM docker/ | ||
Ligne 1068: | Ligne 1764: | ||
| | ||
Successfully built 686e85ee76b8 | Successfully built 686e85ee76b8 | ||
- | Successfully tagged | + | Successfully tagged |
</ | </ | ||
- | Lors du push de l' | + | Lors du push de l' |
< | < | ||
- | root@manager: | + | root@manager: |
- | The push refers to repository [docker.io/i2tch/docker] | + | The push refers to repository [docker.io/< |
5f70bf18a086: | 5f70bf18a086: | ||
c22f7bc058a9: | c22f7bc058a9: | ||
Ligne 1081: | Ligne 1777: | ||
Signing and pushing trust metadata | Signing and pushing trust metadata | ||
Enter passphrase for repository key with ID 168c754: fenestros | Enter passphrase for repository key with ID 168c754: fenestros | ||
- | Successfully signed docker.io/i2tch/ | + | Successfully signed docker.io/< |
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** : Notez l' | + | **Important** : Notez l' |
</ | </ | ||
===Créer un deuxième Repositry=== | ===Créer un deuxième Repositry=== | ||
- | Par contre en modifiant le tag de l' | + | Par contre en modifiant le tag de l' |
< | < | ||
- | root@manager: | + | root@manager: |
root@manager: | root@manager: | ||
- | REPOSITORY | + | REPOSITORY |
- | i2tch/ | + | < |
- | i2tch/ | + | < |
- | ubuntu | + | ubuntu |
- | nginx | + | nginx latest |
- | i2tch/ | + | < |
- | alpine | + | alpine |
- | mysql | + | mysql latest |
- | centos | + | centos |
- | docker/ | + | docker/ |
- | root@manager: | + | root@manager: |
- | The push refers to repository [docker.io/i2tch/ | + | The push refers to repository [docker.io/< |
- | 5f70bf18a086: | + | 5f70bf18a086: |
- | c22f7bc058a9: | + | c22f7bc058a9: |
latest: digest: sha256: | latest: digest: sha256: | ||
Signing and pushing trust metadata | Signing and pushing trust metadata | ||
Ligne 1115: | Ligne 1811: | ||
Enter passphrase for new repository key with ID 7b13d02: fenestros | Enter passphrase for new repository key with ID 7b13d02: fenestros | ||
Repeat passphrase for new repository key with ID 7b13d02: fenestros | Repeat passphrase for new repository key with ID 7b13d02: fenestros | ||
- | Finished initializing " | + | Finished initializing " |
- | Successfully signed docker.io/i2tch/ | + | Successfully signed docker.io/< |
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** : Notez la création d'une deuxième repositry key (ID 7b13d02 au lieu de ID 168c754) lors du push de l' | + | **Important** : Notez la création d'une deuxième repositry key (ID 7b13d02 au lieu de ID 168c754) lors du push de l' |
</ | </ | ||
Ligne 1136: | Ligne 1832: | ||
< | < | ||
- | root@manager: | + | root@manager: |
[ | [ | ||
{ | { | ||
- | " | + | " |
" | " | ||
{ | { | ||
Ligne 1170: | Ligne 1866: | ||
} | } | ||
] | ] | ||
- | root@manager: | + | root@manager: |
[ | [ | ||
{ | { | ||
- | " | + | " |
" | " | ||
{ | { | ||
Ligne 1211: | Ligne 1907: | ||
< | < | ||
- | root@manager: | + | root@manager: |
[ | [ | ||
{ | { | ||
- | " | + | " |
" | " | ||
{ | { | ||
Ligne 1256: | Ligne 1952: | ||
< | < | ||
- | root@manager: | + | root@manager: |
Enter passphrase for repository key with ID 168c754: | Enter passphrase for repository key with ID 168c754: | ||
- | Successfully deleted signature for i2tch/ | + | Successfully deleted signature for < |
- | root@manager: | + | root@manager: |
[ | [ | ||
{ | { | ||
- | " | + | " |
" | " | ||
" | " | ||
Ligne 1287: | Ligne 1983: | ||
</ | </ | ||
- | =====LAB #15 - Sécurisation du Socket du Daemon Docker===== | + | <WRAP center round important> |
+ | **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:// | ||
+ | </ | ||
+ | |||
+ | =====LAB #10 - Sécurisation du Socket du Daemon Docker===== | ||
Par défaut le daemon Docker peut être contacté en utilisant un socket Unix local ce qui implique qu'il faut une connexion SSH vers l' | 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' | ||
Ligne 1305: | Ligne 2005: | ||
</ | </ | ||
- | ====Création du Certificat de l' | + | ====10.1 - Création du Certificat de l' |
Commencez par créer une clef privée **ca-key.pem** pour le CA : | Commencez par créer une clef privée **ca-key.pem** pour le CA : | ||
Ligne 1340: | Ligne 2040: | ||
</ | </ | ||
- | ====Création du Certificat du Serveur Hôte du Daemon Docker==== | + | ====10.2 - Création du Certificat du Serveur Hôte du Daemon Docker==== |
Les clefs du CA ayant été créées, créez une clef **server-key.pem** pour le serveur hôte du daemon Docker : | Les clefs du CA ayant été créées, créez une clef **server-key.pem** pour le serveur hôte du daemon Docker : | ||
Ligne 1363: | Ligne 2063: | ||
< | < | ||
- | root@manager: | + | root@manager: |
</ | </ | ||
Ligne 1376: | Ligne 2076: | ||
< | < | ||
root@manager: | root@manager: | ||
- | subjectAltName = DNS: | + | subjectAltName = DNS: |
extendedKeyUsage = serverAuth | extendedKeyUsage = serverAuth | ||
</ | </ | ||
Ligne 1390: | Ligne 2090: | ||
</ | </ | ||
- | ====Création du Certificat du Client==== | + | ====10.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 : | Créez ensuite la clef privée **key.pem** du client qui se connectera au daemon à partir du réseau : | ||
Ligne 1402: | Ligne 2102: | ||
</ | </ | ||
- | A défaut d'une entrée dans le serveur DNS, créez une entrée pour le client | + | Modifiez l' |
< | < | ||
Ligne 1408: | Ligne 2108: | ||
root@manager: | root@manager: | ||
127.0.0.1 localhost | 127.0.0.1 localhost | ||
- | 127.0.1.1 manager.i2tch.loc manager | + | 10.0.2.60 debian9.i2tch.loc debian9 |
- | 10.0.2.15 manager.i2tch.loc manager | + | 10.0.2.61 myregistry.i2tch.loc |
- | 10.0.2.4 worker1.i2tch.loc worker1 | + | 10.0.2.62 manager.i2tch.loc manager |
- | 10.0.2.5 worker2.i2tch.loc worker2 | + | 10.0.2.63 worker1.i2tch.loc worker1 |
- | 10.0.2.9 client.i2tch.loc client | + | 10.0.2.64 worker2.i2tch.loc worker2 |
# The following lines are desirable for IPv6 capable hosts | # The following lines are desirable for IPv6 capable hosts | ||
Ligne 1423: | Ligne 2123: | ||
< | < | ||
- | root@manager: | + | root@manager: |
</ | </ | ||
Ligne 1437: | Ligne 2137: | ||
root@manager: | root@manager: | ||
Signature ok | Signature ok | ||
- | subject=CN = client.i2tch.loc | + | subject=CN = myregistry.i2tch.loc |
Getting CA Private Key | Getting CA Private Key | ||
Enter pass phrase for ca-key.pem: | Enter pass phrase for ca-key.pem: | ||
Ligne 1501: | Ligne 2201: | ||
</ | </ | ||
- | ====Démarrage du Daemon Docker avec une Invocation Directe==== | + | ====10.4 - Démarrage du Daemon Docker avec une Invocation Directe==== |
Arrêtez et désactivez le service Docker : | Arrêtez et désactivez le service Docker : | ||
Ligne 1564: | Ligne 2264: | ||
</ | </ | ||
- | ====Configuration du Client==== | + | ====10.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 **Debian_9** : | + | Transférez ensuite le certificat du CA ainsi que le certificat et la clef privée du client vers la VM **debian91** : |
< | < | ||
- | root@manager: | + | root@manager: |
- | The authenticity of host ' | + | The authenticity of host ' |
ECDSA key fingerprint is SHA256: | ECDSA key fingerprint is SHA256: | ||
Are you sure you want to continue connecting (yes/no)? yes | Are you sure you want to continue connecting (yes/no)? yes | ||
- | Warning: Permanently added ' | + | Warning: Permanently added ' |
- | trainee@10.0.2.9's password: | + | trainee@10.0.2.61's password: |
ca.pem | ca.pem | ||
key.pem | key.pem | ||
Ligne 1580: | Ligne 2280: | ||
</ | </ | ||
- | Modifiez le nom d' | + | Lancez la commande |
< | < | ||
- | trainee@debian9:~$ hostname | + | trainee@myregistry:~$ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=manager.i2tch.loc: |
- | debian9 | + | |
- | trainee@debian9: | + | |
- | Mot de passe : fenestros | + | |
- | root@debian9: | + | |
- | root@debian9: | + | |
- | root@debian9: | + | |
- | root@debian9: | + | |
- | 127.0.0.1 localhost | + | |
- | 127.0.1.1 client.i2tch.loc client | + | |
- | 10.0.2.9 client.i2tch.loc client | + | |
- | 10.0.2.15 manager.i2tch.loc manager | + | |
- | + | ||
- | # The following lines are desirable for IPv6 capable hosts | + | |
- | ::1 | + | |
- | ff02::1 ip6-allnodes | + | |
- | ff02::2 ip6-allrouters | + | |
- | </ | + | |
- | + | ||
- | Déconnectez-vous du client Debian_9 : | + | |
- | + | ||
- | < | + | |
- | root@debian9: | + | |
- | déconnexion | + | |
- | trainee@debian9: | + | |
- | déconnexion | + | |
- | </ | + | |
- | + | ||
- | Connectez-vous de nouveau à la VM Debian_9 et lancez la commande **docker version** sur le serveur : | + | |
- | + | ||
- | < | + | |
- | trainee@client:~$ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=manager.i2tch.loc: | + | |
Client: Docker Engine - Community | Client: Docker Engine - Community | ||
| | ||
Ligne 1644: | Ligne 2313: | ||
</ | </ | ||
- | Afin de faciliter l' | + | Afin de faciliter l' |
< | < | ||
- | trainee@client:~$ mkdir -pv ~/.docker | + | trainee@myregistry:~$ mkdir -pv ~/.docker |
mkdir: création du répertoire '/ | mkdir: création du répertoire '/ | ||
</ | </ | ||
Ligne 1654: | Ligne 2323: | ||
< | < | ||
- | trainee@client:~$ cp -v {ca, | + | trainee@myregistry:~$ cp -v {ca, |
' | ' | ||
' | ' | ||
Ligne 1663: | Ligne 2332: | ||
< | < | ||
- | trainee@client:~$ export DOCKER_HOST=tcp:// | + | trainee@myregistry:~$ export DOCKER_HOST=tcp:// |
</ | </ | ||
Ligne 1669: | Ligne 2338: | ||
< | < | ||
- | trainee@client:~$ docker image ls | + | trainee@myregistry:~$ docker image ls |
REPOSITORY | REPOSITORY | ||
i2tch/ | i2tch/ | ||
Ligne 1682: | Ligne 2351: | ||
</ | </ | ||
- | =====Arrêter les Machines Virtuelles===== | + | ----- |
- | ====Formations en FFP==== | + | Copyright © 2022 Hugh Norris. |
- | + | ||
- | Utilisez l' | + | |
- | + | ||
- | Restaurez ensuite chaque machine virtuelle vers son état d' | + | |
- | + | ||
- | ====Formations en FAD==== | + | |
- | + | ||
- | Utilisez les commandes suivantes pour arrêter les machines virtuelles **Manager**, | + | |
- | + | ||
- | < | + | |
- | desktop@server16: | + | |
- | 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% | + | |
- | desktop@server16: | + | |
- | 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% | + | |
- | desktop@server16: | + | |
- | 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% | + | |
- | desktop@server16: | + | |
- | 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% | + | |
- | </ | + | |
- | + | ||
- | Restaurez l' | + | |
- | + | ||
- | < | + | |
- | desktop@server16: | + | |
- | Restoring snapshot ' | + | |
- | 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% | + | |
- | desktop@server16: | + | |
- | Restoring snapshot ' | + | |
- | 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% | + | |
- | desktop@server16: | + | |
- | Restoring snapshot ' | + | |
- | 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% | + | |
- | desktop@server16: | + | |
- | Restoring snapshot ' | + | |
- | 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% | + | |
- | </ | + | |
- | + | ||
- | ----- | + | |
- | < | + | |
- | <div align=" | + | |
- | Copyright © 2020 Hugh NORRIS | + | |
- | </ | + | |
- | </ | + |