Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. DevSecOps
  3. Utilisation de Docker en DevSecOps
Extrait - DevSecOps Développez et administrez vos services en toute sécurité
Extraits du livre
DevSecOps Développez et administrez vos services en toute sécurité Revenir à la page d'achat du livre

Utilisation de Docker en DevSecOps

Introduction à Docker

1. L’histoire de la création de Docker

Docker est un logiciel libre utilisé pour lancer des applications à l’intérieur de conteneurs. Cependant, il est intéressant de connaître l’histoire de Docker, pour mieux en saisir les différents impacts.

Solomon Hykes, un ancien étudiant de l’école Epitech (Promotion 2001), décide de créer la société DotCloud en 2008 avec Sébastien Pahl. C’est alors en 2010 que Solomon Hykes présente son concept de Docker afin d’améliorer l’efficacité du développement de logiciels et de leur déploiement, peu importe la machine sur laquelle ils sont exécutés.

DotCloud réussit une levée de fonds de 800 000 $ (notamment avec les investisseurs qui ont été les premiers à croire en Google ou PayPal), et c’est seulement en 2013, après s’être installée à la Silicon Valley, que la société décide d’offrir les sources de sa technologie de conteneurisation à la communauté open source.

Aujourd’hui, Docker, c’est plus de 5 millions d’utilisateurs à travers le monde. L’entreprise Docker Inc. a été valorisée à près de 1,3 milliard de dollars en 2018.

2. Les différentes éditions de Docker

La première question que l’on peut se poser, c’est pourquoi existe-t-il plusieurs versions de Docker ?

Tout d’abord, parce que Docker n’est pas uniquement un logiciel. Docker correspond à un environnement qui est beaucoup plus complet et très volumineux par rapport à ce qu’il était au moment de sa création.

Une légende urbaine affirme qu’au tout...

Commencer à utiliser des conteneurs Docker

1. Les commandes de base

a. La commande docker version

$ docker version 

Cette commande permet d’afficher la version du client et du serveur (aussi appelé Engine) de Docker. Elle est très utile pour vérifier le bon fonctionnement du logiciel.

Exemple

$ docker version 
Client: 
 Version:           19.03.6 
 API version:       1.40 
 Go version:        go1.12.17 
 Git commit:        369ce74a3c 
 Built:             Fri Feb 28 23:45:43 2020 
 OS/Arch:           linux/amd64 
 Experimental:      false 
 
Server: 
 Engine: 
  Version:          19.03.6 
  API version:      1.40 (minimum version 1.12) 
  Go version:       go1.12.17 
  Git commit:       369ce74a3c 
  Built:            Wed Feb 19 01:06:16 2020 
  OS/Arch:          linux/amd64 
  Experimental:     false 
 containerd: 
  Version:          1.3.3-0ubuntu1~18.04.2 
  GitCommit: 
 runc: 
  Version:          spec: 1.0.1-dev 
  GitCommit: 
 docker-init: 
  Version:          0.18.0 ...

Configurer et utiliser les réseaux et le DNS de Docker

1. L’utilisation du NAT (Network Address Translation)

a. Les adresses IPv4 privées

Il n’existe pas assez d’adresses IPv4 publiques disponibles pour être en mesure d’attribuer une adresse unique à chaque périphérique connecté à Internet. C’est pour cette raison que les adresses IP privées sont utilisées, afin de permettre aux périphériques de communiquer localement, comme défini dans le RFC 1918.

Comme ces adresses IP privées n’identifient aucune entreprise ou organisation (à la différence des IP publiques), celles-ci ne peuvent être acheminées sur Internet. En effet, pour permettre à un périphérique possédant uniquement une adresse IPv4 privée (comme votre ordinateur portable connecté à votre box internet) d’accéder aux périphériques et serveurs situés en dehors de votre réseau local (en dehors de votre domicile), l’adresse IP privée doit d’abord être traduite en adresse publique.

C’est justement le NAT (Network Address Translation) qui assure la traduction des adresses IP privées en adresses IP publiques.

Voici les plages d’adresses IP privées définies dans le RFC 1918 :

Classe

Plage

Préfixe

A

10.0.0.0 à 10.255.255.255

10.0.0.0/8

B

172.16.0.0 à 172.31.255.255

172.16.0.0/12

C

192.168.0.0 à 192.168.255.255

192.168.0.0/16

b. La fonction du NAT

Le NAT est un processus utilisé pour convertir les adresses réseaux. Il est principalement mis en œuvre pour limiter la consommation inutile des adresses IPv4 publiques, et fonctionne généralement à la périphérie d’un réseau, soit via un firewall, soit...

Trouver et créer ses propres images Docker

1. Utilisation de Docker Hub

Docker Hub est un dépôt sur le Cloud totalement géré par Docker. On peut y publier et utiliser des images (officielles ou non) et partager son travail avec la communauté (comme on peut le faire avec nos codes sur GitHub et GitLab). Il existe des dépôts privés, utilisables uniquement par vous, de sorte que les autres utilisateurs ne puissent récupérer vos images personnalisées (https://hub.docker.com).

Si on effectue une recherche pour une image mysql, on peut voir qu’il y a plus de 19 000 résultats. Il faut donc comprendre comment distinguer les images officielles et les images à utiliser, par rapport à celles qu’il faut éviter :

images/03EP31.png

Les images officielles n’ont pas de « / » dans leur nom, à la différence des autres images.

Sur la page « overview » vous avez accès à beaucoup de documentation : la façon dont le conteneur doit être lancé, les différentes options que l’on peut utiliser, quelles sont les variables d’environnement, le port d’écoute par défaut, etc. (https://hub.docker.com/_/mysql?tab=description).

Un autre élément très important figure dans les descriptions : il s’agit des tags. Dans la partie "Supported tags", vous pouvez observer que la même version d’une image peut être appelée de plusieurs manières. Dans l’exemple ci-dessous, que l’on utilise la version 8.0.19, 8.0 ou la version latest, on obtient la même image.

images/03EP32.png

Ainsi, les commandes docker pull mysql:8.0.19 ou docker pull mysql:latest téléchargent exactement la même image.

2. Analyse du cache d’une image Docker

a. La commande docker image...

Faire persister les données au sein des conteneurs

1. Durée de vie d’un conteneur

Les conteneurs sont conçus pour être, la plupart du temps, immuables et éphémères. En effet, on ne fait que redéployer les conteneurs, et il faut éviter à tout prix de les modifier alors qu’ils sont déjà en cours d’exécution. Si des modifications sont nécessaires, on redéploie de nouveaux conteneurs basés sur des images différentes. Cela permet d’obtenir de la fiabilité et de la consistance, tout en permettant la reproduction de tous les changements.

Mais alors, comment faire lorsqu’il est nécessaire de conserver les données d’un conteneur ?

On parle de persistance des données lorsqu’il est possible de conserver celles-ci même si le conteneur a été supprimé ou recréé. C’est une fonctionnalité très utile, surtout dans les conteneurs qui effectuent des actions de base de données. Il existe alors deux méthodes :

  • Volumes : création d’une localisation particulière située en dehors du système de fichiers du conteneur (UFS).

  • Bind Mounts : création d’un lien virtuel entre un chemin absolu au niveau du conteneur, et un chemin absolu au niveau de la machine hôte.

2. Utilisation des volumes dans Docker

a. Comprendre quand utiliser les volumes dans Docker

On utilise les volumes lorsque l’objectif est de partager des données entre plusieurs conteneurs en cours d’exécution. Cela devient intéressant, notamment lorsque l’hôte Docker n’est pas paramétré pour avoir un répertoire donné ou un fichier de structure ; il est ainsi possible de découpler la configuration de l’hôte...

Déployer un site WordPress avec Docker

1. Utilisation de WordPress

WordPress est aujourd’hui l’un des moyens, voire le moyen, le plus populaire de créer un site web. En effet, plus d’un site internet sur quatre utilise WordPress.

Pourquoi une telle popularité ?

Car c’est probablement l’une des façons les plus simples et rapides de créer un site. C’est ce qu’on appelle un CMS (Content Management System).

images/03EP36.png

https://www.wordpress.com

Il est possible d’ailleurs d’y installer de nombreux thèmes et plugins différents, ce qui permet à l’administrateur de personnaliser un maximum son site et d’y insérer des fonctionnalités spécifiques. On retrouve donc des sites WordPress pour faire des boutiques en ligne, des blogs, des CV et portfolios, des forums, des réseaux sociaux, etc. Presque tout est possible avec WordPress.

Il existe en fait deux versions principales : wordpress.org, qui est autohébergée (notamment sur Docker), gratuite et open source, et wordpress.com, qui est une version payante où il n’est pas nécessaire d’avoir un serveur sur lequel stocker son site internet.

Comme vous pouvez vous en douter, c’est sur la première version que nous allons nous attarder.

2. Composition de WordPress

WordPress est composé de deux grands éléments.

Le premier correspond au site internet lui-même. Il s’agit d’un site codé en PHP et hébergé généralement à l’aide d’un service web nommé Apache. C’est donc dans le service Apache que va être stocké l’ensemble des fichiers permettant d’afficher le site web. Nous reviendrons sur ces éléments un peu plus tard.

Le deuxième grand composant correspond à la base de données....

Sécuriser l’hôte Docker

1. Les CIS Benchmarks

a. Introduction aux CIS Benchmarks

Lorsque l’on parle de sécurité sur Docker, on a tendance à tout de suite regarder du côté de la sécurisation des images utilisées. Cependant, si la machine qui héberge les conteneurs est elle-même vulnérable, vous pouvez mettre en place toutes les vérifications possibles sur les conteneurs, cela ne suffira pas.

Il existe des outils et des registres récapitulant toutes les actions de sécurité que l’on peut mener sur un hôte afin de diminuer sa vulnérabilité. Parmi ces outils vous pouvez vous appuyer sur les CIS Benchmarks (https://www.cisecurity.org/cybersecurity-best-practices/). Cependant, il y a plus de 250 pages dédiées, avec les règles de bonnes pratiques à mettre en œuvre, pour le CIS Benchmark inhérent à la version communautaire de Docker.

Dans ce document, les vérifications sont découpées en plusieurs grandes parties :

  • Configuration de l’hôte Docker.

  • Configuration du démon Docker.

  • Fichiers de configuration du démon Docker.

  • Images et fichiers de build.

  • Configuration des conteneurs Runtime.

  • Opérations de sécurité pour Docker.

  • Configuration de Docker Swarm.

Heureusement, certains ont déjà réalisé un travail important en implémentant l’ensemble de ces vérifications dans des scripts « clé en main ».

b. Utilisation de l’outil Docker Bench for Security

Cet outil, disponible sur GitHub à l’adresse https://github.com/docker/docker-bench-security, est sous licence Apache-2.0. Il a pour but de vérifier la plupart des règles de bonnes pratiques à respecter lors de l’utilisation de Docker pour déployer...

Sécuriser les conteneurs et les images Docker

1. Architecture d’un pipeline CI/CD pour les images Docker

Dans cette partie, nous allons commencer par représenter un pipeline CI/CD spécifique pour les images Docker qui vont être construites par vos équipes DevOps. Ce pipeline va respecter différentes étapes :

  • Lint du fichier Dockerfile.

  • Build de l’image Docker.

  • Test de l’image Docker.

  • Vérification de la sécurité du conteneur Docker.

  • Push de l’image dans un registre Docker.

Voici donc comment on pourrait schématiser ce pipeline :

images/03EP51.png

Dans un premier temps, le développeur crée son fichier Dockerfile, permettant de construire un conteneur dont il a besoin pour son service ou son application. Une fois terminé, il push ce fichier dans le dépôt GitLab de son équipe, sur lequel l’ensemble des jobs de tests à exécuter sont répertoriés. GitLab envoie ensuite le fichier vers un/des Runner(s) pour effectuer ces différents tests.

Le premier test qu’il est nécessaire d’effectuer correspond au lint du fichier Dockerfile, c’est-à-dire que l’outil vérifie si les règles de bonnes pratiques ont été respectées au moment de rédiger le fichier Dockerfile.

Les deuxième et troisième tests s’occupent davantage de l’aspect « fonctionnel ». Ils cherchent donc à construire l’image et à tester de façon sommaire le conteneur généré, pour s’assurer que celui-ci fonctionne correctement et comme attendu.

Enfin, dans un dernier test, des actions de vérification de la sécurité de l’image sont effectuées, afin de valdier qu’il n’y a pas d’importantes vulnérabilités...

Conclusion

Dans ce chapitre, nous avons vu comment installer Docker sur une machine Linux, MacOs ou Windows, en fonction de notre version, mais également comment utiliser Play With Docker si vous n’avez pas la possibilité d’utiliser Docker Toolbox ou Docker Desktop.

Grâce aux différentes commandes et à la façon dont fonctionne Docker, il vous est désormais possible de construire vos propres images et de vérifier leur fonctionnement et leur sécurité. En effet, Lynis et Docker Bench Security vous permettent de vérifier que l’hôte sur lequel est installé Docker ne présente pas de failles de sécurité importantes. C’est ensuite grâce à Hadolint, Dockle et Trivy que vous pouvez effectuer des tests de sécurité sur les fichiers Dockerfile et sur les images Docker que vous utilisez ou que vous construisez.

Maintenant que le sujet des conteneurs a été traité, nous allons nous tourner vers l’utilisation d’un outil pour orchestrer les conteneurs, afin de les utiliser de manière plus industrialisée.