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 [2021/04/14 10:31] – admin | elearning:workbooks:docker2:drf03 [2021/12/29 10:32] (Version actuelle) – admin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | |||
~~PDF: | ~~PDF: | ||
- | Version : **2021.01** | + | Version : **2022.01** |
Dernière mise-à-jour : ~~LASTMOD~~ | Dernière mise-à-jour : ~~LASTMOD~~ | ||
Ligne 11: | Ligne 12: | ||
* **DOF204 - Gestion de la Sécurité de Docker** | * **DOF204 - Gestion de la Sécurité de Docker** | ||
* Contenu du Module | * Contenu du Module | ||
- | * Présentation des Namespaces | + | * LAB #1 - Travailler avec les CGroups |
- | * Présentation des CGroups | + | * 1.1 - Présentation des Namespaces |
- | * LAB #1 - Travailler avec les CGroups | + | * 1.2 - Présentation des CGroups |
- | * 1.1 - Limitation de la Mémoire | + | * 1.3 - Limitation de la Mémoire |
- | * 1.2 - Le Paquet cgroup-tools | + | * 1.4 - Le Paquet cgroup-tools |
- | * La commande cgcreate | + | * La commande cgcreate |
- | * La Commande cgexec | + | * La Commande cgexec |
- | * La Commande cgdelete | + | * La Commande cgdelete |
- | * Le Fichier / | + | * Le Fichier / |
- | * LAB #2 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker | + | * LAB #2 - Utilisation des Docker Secrets |
- | * LAB #3 - Le Script docker-bench-security.sh | + | * LAB #3 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker |
- | * LAB #4 - Sécurisation de la Configuration de l' | + | * LAB #4 - Le Script docker-bench-security.sh |
- | * 4.1 - [WARN] 1.2.1 - Ensure a separate partition for containers has been created | + | * LAB #5 - Sécurisation de la Configuration de l' |
- | * 4.2 - [WARN] 1.2.3 - Ensure auditing is configured for the Docker daemon | + | * 5.1 - [WARN] 1.2.1 - Ensure a separate partition for containers has been created |
- | * LAB #5 - Sécurisation de la Configuration du daemon Docker | + | * 5.2 - [WARN] 1.2.3 - Ensure auditing is configured for the Docker daemon |
- | * 5.1 - [WARN] 2.1 - Ensure network traffic is restricted between containers on the default bridge | + | * LAB #6 - Sécurisation de la Configuration du daemon Docker |
- | * 5.2 - [WARN] 2.8 - Enable user namespace support | + | * 6.1 - [WARN] 2.1 - Ensure network traffic is restricted between containers on the default bridge |
- | * 5.3 - [WARN] 2.11 - Ensure that authorization for Docker client commands is enabled | + | * 6.2 - [WARN] 2.8 - Enable user namespace support |
- | * 5.4 - [WARN] 2.12 - Ensure centralized and remote logging is configured | + | * 6.3 - [WARN] 2.11 - Ensure that authorization for Docker client commands is enabled |
- | * 5.5 - [WARN] 2.14 - Ensure Userland Proxy is Disabled | + | * 6.4 - [WARN] 2.12 - Ensure centralized and remote logging is configured |
- | * 5.6 - [WARN] 2.17 - Ensure containers are restricted from acquiring new privileges | + | * 6.5 - [WARN] 2.14 - Ensure Userland Proxy is Disabled |
- | * 5.7 - Le Fichier / | + | * 6.6 - [WARN] 2.17 - Ensure containers are restricted from acquiring new privileges |
- | * LAB #6 - Sécurisation des Images et les Fichiers de Construction | + | * 6.7 - Le Fichier / |
- | * 6.1 - [WARN] 4.1 - Ensure a user for the container has been created | + | * LAB #7 - Sécurisation des Images et les Fichiers de Construction |
- | * 6.2 - [WARN] 4.5 - Ensure Content trust for Docker is Enabled | + | * 7.1 - [WARN] 4.1 - Ensure a user for the container has been created |
- | * 6.3 - [WARN] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images | + | * 7.2 - [WARN] 4.5 - Ensure Content trust for Docker is Enabled |
- | * LAB #7 - Sécurisation du Container Runtime | + | * 7.3 - [WARN] 4.6 - Ensure that HEALTHCHECK instructions have been added to container images |
- | * 7.1 - [WARN] 5.1 - Ensure AppArmor Profile is Enabled | + | * LAB #8 - Sécurisation du Container Runtime |
- | * 7.2 - [WARN] 5.2 - Ensure SELinux security options are set, if applicable | + | * 8.1 - [WARN] 5.1 - Ensure AppArmor Profile is Enabled |
- | * 7.3 - [WARN] 5.10 - Ensure memory usage for container is limited | + | * 8.2 - [WARN] 5.2 - Ensure SELinux security options are set, if applicable |
- | * 7.4 - [WARN] 5.11 - Ensure CPU priority is set appropriately on the container | + | * 8.3 - [WARN] 5.10 - Ensure memory usage for container is limited |
- | * 7.5 - [WARN] 5.12 - Ensure the container' | + | * 8.4 - [WARN] 5.11 - Ensure CPU priority is set appropriately on the container |
- | * 7.6 - [WARN] 5.14 - Ensure ' | + | * 8.5 - [WARN] 5.12 - Ensure the container' |
- | * 7.7 - [WARN] 5.25 - Ensure the container is restricted from acquiring additional privileges | + | * 8.6 - [WARN] 5.14 - Ensure ' |
- | * 7.8 - [WARN] 5.26 - Ensure container health is checked at runtime | + | * 8.7 - [WARN] 5.25 - Ensure the container is restricted from acquiring additional privileges |
- | * 7.9 - [WARN] 5.28 - Ensure PIDs cgroup limit is used | + | * 8.8 - [WARN] 5.26 - Ensure container health is checked at runtime |
- | * LAB #8 - Sécurisation des Images avec Docker Content Trust | + | * 8.9 - [WARN] 5.28 - Ensure PIDs cgroup limit is used |
- | * 8.1 - DOCKER_CONTENT_TRUST | + | * LAB #9 - Sécurisation des Images avec Docker Content Trust |
- | * 8.2 - DCT et la commande docker pull | + | * 9.1 - DOCKER_CONTENT_TRUST |
+ | * 9.2 - DCT et la commande docker pull | ||
* L' | * L' | ||
- | * 8.3 - DCT et la commande docker push | + | * 9.3 - DCT et la commande docker push |
- | * 8.4 - DCT et la commande docker build | + | * 9.4 - DCT et la commande docker build |
* Créer un deuxième Repositry | * Créer un deuxième Repositry | ||
* Supprimer une Signature | * Supprimer une Signature | ||
- | * LAB #9 - Sécurisation du Socket du Daemon Docker | + | * LAB #10 - Sécurisation du Socket du Daemon Docker |
- | * 9.1 - Création du Certificat de l' | + | * 10.1 - Création du Certificat de l' |
- | * 9.2 - Création du Certificat du Serveur Hôte du Daemon Docker | + | * 10.2 - Création du Certificat du Serveur Hôte du Daemon Docker |
- | * 9.3 - Création du Certificat du Client | + | * 10.3 - Création du Certificat du Client |
- | * 9.4 - Démarrage du Daemon Docker avec une Invocation Directe | + | * 10.4 - Démarrage du Daemon Docker avec une Invocation Directe |
- | * 9.5 - Configuration du Client | + | * 10.5 - Configuration du Client |
+ | =====LAB #1 - Travailler avec les CGroups====== | ||
- | =====Présentation des Namespaces===== | + | ====1.1 - Présentation des Namespaces==== |
Les espaces de noms permettent de regrouper des processus dans un même espace et d' | Les espaces de noms permettent de regrouper des processus dans un même espace et d' | ||
- | =====Présentation des CGroups===== | + | ====1.2 - Présentation des CGroups==== |
Les Groupes de Contrôles (Control Groups) aussi appelés **CGroups**, | Les Groupes de Contrôles (Control Groups) aussi appelés **CGroups**, | ||
Ligne 201: | Ligne 204: | ||
</ | </ | ||
- | ====LAB #1 - Travailler avec les CGroups==== | + | ====1.3 - Limitation de la Mémoire==== |
- | + | ||
- | ===1.1 - Limitation de la Mémoire=== | + | |
Pour travailler avec les CGroups dans Debian 9, il convient d' | Pour travailler avec les CGroups dans Debian 9, il convient d' | ||
Ligne 348: | Ligne 349: | ||
</ | </ | ||
- | ===1.2 - Le Paquet cgroup-tools=== | + | ====1.4 - Le Paquet cgroup-tools==== |
Le paquet **cgroup-tools** installe des commandes dites //de facilité// dont : | Le paquet **cgroup-tools** installe des commandes dites //de facilité// dont : | ||
- | ==La commande cgcreate== | + | ===La commande cgcreate=== |
Cette commande permet la création d'un CGroup : | Cette commande permet la création d'un CGroup : | ||
Ligne 395: | Ligne 396: | ||
</ | </ | ||
- | ==La Commande cgexec== | + | ===La Commande cgexec=== |
Cette commande permet d' | Cette commande permet d' | ||
Ligne 407: | Ligne 408: | ||
</ | </ | ||
- | == La Commande cgdelete== | + | === La Commande cgdelete=== |
Une fois le script terminé, cette commande permet de supprimer le cgroup : | Une fois le script terminé, cette commande permet de supprimer le cgroup : | ||
Ligne 424: | Ligne 425: | ||
</ | </ | ||
- | ==Le Fichier / | + | ===Le Fichier / |
Afin de les rendre persistants, | Afin de les rendre persistants, | ||
Ligne 512: | Ligne 513: | ||
</ | </ | ||
- | =====LAB #2 - Création d'un Utilisateur de Confiance pour Contrôler le Daemon Docker===== | + | =====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 #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 537: | Ligne 753: | ||
</ | </ | ||
- | =====LAB #3 - 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 605: | Ligne 821: | ||
* **[NOTE]** : Vous informe d'un **best practice**. | * **[NOTE]** : Vous informe d'un **best practice**. | ||
- | =====LAB #4 - Sécurisation de la Configuration de l' | + | =====LAB #5 - Sécurisation de la Configuration de l' |
Lors de l' | Lors de l' | ||
Ligne 641: | 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]**. | ||
- | ====4.1 - [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 **/ | ||
- | ====4.2 - [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 745: | Ligne 961: | ||
</ | </ | ||
- | =====LAB #5 - 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 776: | 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]**. | ||
- | ====5.1 - [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 782: | Ligne 998: | ||
Pour plus d' | Pour plus d' | ||
- | ====5.2 - [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 788: | Ligne 1004: | ||
Pour plus d' | Pour plus d' | ||
- | ====5.3 - [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 794: | Ligne 1010: | ||
Pour plus d' | Pour plus d' | ||
- | ====5.4 - [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 800: | Ligne 1016: | ||
Pour plus d' | Pour plus d' | ||
- | ====5.5 - [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 811: | Ligne 1027: | ||
Pour plus d' | Pour plus d' | ||
- | ====5.6 - [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 817: | Ligne 1033: | ||
Pour plus d' | Pour plus d' | ||
- | ====5.7 - Le Fichier / | + | ====6.7 - Le Fichier / |
Créez le fichier **/ | Créez le fichier **/ | ||
Ligne 870: | Ligne 1086: | ||
Pour plus d' | Pour plus d' | ||
- | =====LAB #6 - 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 922: | Ligne 1138: | ||
</ | </ | ||
- | ====6.1 - [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' | ||
- | ====6.2 - [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 976: | Ligne 1192: | ||
Pour plus d' | Pour plus d' | ||
- | ====6.3 - [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 990: | Ligne 1206: | ||
Pour plus d' | Pour plus d' | ||
- | =====LAB #7 - 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 1045: | 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]**. | ||
- | ====7.1 - [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 1051: | Ligne 1267: | ||
Pour plus d' | Pour plus d' | ||
- | ====7.2 - [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 1057: | Ligne 1273: | ||
Pour plus d' | Pour plus d' | ||
- | ====7.3 - [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 1090: | Ligne 1306: | ||
Pour plus d' | Pour plus d' | ||
- | ====7.4 - [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 1098: | Ligne 1314: | ||
Pour plus d' | Pour plus d' | ||
- | ====7.5 - [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 1167: | Ligne 1383: | ||
</ | </ | ||
- | ====7.6 - [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 1175: | Ligne 1391: | ||
Pour plus d' | Pour plus d' | ||
- | ====7.7 - [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 1183: | Ligne 1399: | ||
Pour plus d' | Pour plus d' | ||
- | ====7.8 - [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' | ||
- | ====7.9 - [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 1289: | Ligne 1505: | ||
</ | </ | ||
- | =====LAB #8 - 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 1299: | Ligne 1515: | ||
Pour plus d' | Pour plus d' | ||
- | ====8.1 - 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 1316: | Ligne 1532: | ||
</ | </ | ||
- | ====8.2 - DCT et la commande docker pull==== | + | ====9.2 - DCT et la commande docker pull==== |
Afin d' | Afin d' | ||
Ligne 1423: | Ligne 1639: | ||
</ | </ | ||
- | ====8.3 - DCT et la commande docker push==== | + | ====9.3 - DCT et la commande docker push==== |
Pour envoyer l' | Pour envoyer l' | ||
Ligne 1507: | Ligne 1723: | ||
</ | </ | ||
- | ====8.4 - DCT et la commande docker build==== | + | ====9.4 - DCT et la commande docker build==== |
L' | L' | ||
Ligne 1767: | Ligne 1983: | ||
</ | </ | ||
- | =====LAB #9 - 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 1785: | Ligne 2005: | ||
</ | </ | ||
- | ====9.1 - 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 1820: | Ligne 2040: | ||
</ | </ | ||
- | ====9.2 - 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 1870: | Ligne 2090: | ||
</ | </ | ||
- | ====9.3 - 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 1981: | Ligne 2201: | ||
</ | </ | ||
- | ====9.4 - 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 2044: | Ligne 2264: | ||
</ | </ | ||
- | ====9.5 - 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 **debian91** : | Transférez ensuite le certificat du CA ainsi que le certificat et la clef privée du client vers la VM **debian91** : | ||
Ligne 2060: | Ligne 2280: | ||
</ | </ | ||
- | Lancez la commande **docker version** sur la VM **docker91** : | + | Lancez la commande **docker version** sur la VM **debian91** : |
< | < | ||
Ligne 2132: | Ligne 2352: | ||
----- | ----- | ||
- | < | + | |
- | <div align=" | + | Copyright © 2022 Hugh Norris. |
- | Copyright © 2021 Hugh NORRIS | + | |
- | </ | + | |
- | </ | + |