Introduction à la sécurité des conteneurs avec Docker

CompTIABeginner
Pratiquer maintenant

Introduction

Bienvenue dans ce laboratoire pratique sur les bases de la sécurité des conteneurs avec Docker. Docker est une plateforme puissante pour développer, expédier et exécuter des applications dans des conteneurs. Bien que les conteneurs offrent une isolation des processus, leur sécurisation est cruciale pour protéger vos applications et le système hôte.

Dans ce laboratoire, vous explorerez les fondamentaux de la sécurité des conteneurs Docker. Vous commencerez par vérifier que Docker est correctement configuré dans l'environnement LabEx. Ensuite, vous exécuterez un conteneur de serveur web Nginx de base, inspecterez ses processus en cours d'exécution et examinerez sa consommation de ressources. Enfin, vous apprendrez à appliquer des contrôles de sécurité fondamentaux en définissant des limites de ressources sur un conteneur.

À la fin de ce laboratoire, vous aurez une compréhension pratique des premières étapes impliquées dans la sécurisation d'un environnement Docker.

Vérifier l'installation et la configuration de Docker

Dans cette étape, vous allez vérifier que Docker est déjà installé dans l'environnement LabEx et vous assurer que vous avez les permissions nécessaires pour l'utiliser.

La machine virtuelle LabEx est livrée avec Docker pré-installé. Vérifions d'abord la version de Docker pour confirmer sa disponibilité.

docker --version

Vous devriez voir une sortie similaire à celle-ci, confirmant que Docker est correctement installé :

Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3

Vérifions maintenant si le démon Docker est en cours d'exécution :

sudo systemctl status docker

Cette commande vous montrera l'état du service Docker. Vous devriez voir qu'il est actif et en cours d'exécution.

Pour exécuter des commandes Docker sans sudo, votre utilisateur doit appartenir au groupe docker. Dans l'environnement LabEx, votre utilisateur est déjà configuré avec les permissions appropriées. Vérifions cela :

groups $USER

Vous devriez voir docker dans la sortie, confirmant que votre utilisateur dispose des permissions nécessaires :

labex : labex sudo docker ssl-cert

Étant donné que votre utilisateur fait déjà partie du groupe docker, vous pouvez exécuter les commandes Docker directement sans avoir besoin de sudo.

Testons que Docker fonctionne correctement en exécutant une commande simple :

docker info

Cette commande affichera des informations système sur Docker, confirmant que vous pouvez communiquer avec le démon Docker avec succès.

Exécuter un conteneur de serveur web basique

Dans cette étape, vous allez exécuter votre premier conteneur. Nous utiliserons l'image officielle nginx, qui fournit un serveur web léger et haute performance.

Pour exécuter un conteneur, vous utilisez la commande docker run. Nous utiliserons quelques options courantes :

  • -d : Exécute le conteneur en mode détaché (en arrière-plan).
  • -p 8080:80 : Mappe le port 8080 sur l'hôte au port 80 à l'intérieur du conteneur. Cela vous permet d'accéder au serveur Nginx via localhost:8080.
  • --name webserver : Attribue un nom mémorable à votre conteneur.
  • nginx : Le nom de l'image à utiliser.

Exécutez la commande suivante pour démarrer le conteneur Nginx :

docker run -d -p 8080:80 --name webserver nginx

Docker vérifiera d'abord si l'image nginx est disponible localement. Sinon, il la téléchargera automatiquement depuis Docker Hub, puis démarrera le conteneur. Vous pouvez voir que le conteneur est en cours d'exécution en utilisant la commande docker ps.

docker ps

La sortie affichera votre conteneur webserver, son ID, l'image sur laquelle il est basé et le mappage des ports.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   webserver

Maintenant, testons si le serveur web fonctionne. Utilisez curl pour envoyer une requête au serveur sur le port mappé.

curl localhost:8080

Vous devriez voir le code HTML de la page d'accueil par défaut de Nginx en sortie, ce qui confirme que votre conteneur est en cours d'exécution et accessible.

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. For further configuration, refer to the
      <a href="http://nginx.org/">nginx.org</a> documentation.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Examiner les processus et l'utilisation des ressources du conteneur

Dans cette étape, vous apprendrez à inspecter les processus en cours d'exécution à l'intérieur d'un conteneur et à surveiller sa consommation de ressources. C'est une compétence fondamentale pour le débogage et la compréhension du comportement de votre application conteneurisée.

Une caractéristique clé des conteneurs est l'isolation des processus. Du point de vue de l'hôte, vous pouvez voir ce qui s'exécute à l'intérieur d'un conteneur sans avoir à y accéder via exec. La commande docker top vous permet de visualiser les processus principaux d'un conteneur.

Exécutez la commande suivante pour voir les processus à l'intérieur de votre conteneur webserver :

docker top webserver

La sortie montre le processus maître Nginx s'exécutant en tant que root et ses processus workers s'exécutant en tant que systemd+ (un utilisateur système pour une sécurité améliorée). Notez qu'il y a plusieurs processus workers, ce qui est typique pour Nginx afin de gérer efficacement les requêtes concurrentes.

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4098                4078                0                   14:34               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            4161                4098                0                   14:34               ?                   00:00:00            nginx: worker process
systemd+            4162                4098                0                   14:34               ?                   00:00:00            nginx: worker process

Ensuite, examinons l'utilisation des ressources du conteneur. La commande docker stats fournit un flux en direct du CPU, de la mémoire, du réseau et des entrées/sorties disque d'un conteneur. Pour obtenir un instantané statique pour ce laboratoire, nous utiliserons l'option --no-stream.

docker stats --no-stream webserver

Cette commande affichera un tableau avec les métriques de ressources actuelles pour le conteneur webserver.

CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O     PIDS
bda2386621a1   webserver   0.00%     3.125MiB / 3.505GiB   0.09%     6.31kB / 1.27kB   0B / 12.3kB   3

À partir de cette sortie, vous pouvez constater que le conteneur utilise très peu de CPU (0,00 %), environ 3,1 MiB de mémoire sur les 3,5 GiB de mémoire système disponibles (0,09 %), et qu'il compte 3 processus en cours d'exécution (le maître Nginx et 2 processus workers). Ces informations sont essentielles pour identifier les goulots d'étranglement de performance ou les fuites de ressources potentielles dans vos applications.

Inspecter les propriétés de sécurité du conteneur telles que les limites de ressources

Dans cette étape, vous allez explorer l'une des fonctionnalités de sécurité des conteneurs les plus basiques mais critiques : les limites de ressources. Par défaut, un conteneur peut utiliser autant de CPU et de mémoire de l'hôte qu'il le souhaite. La définition de limites empêche un seul conteneur de consommer toutes les ressources disponibles et d'impacter d'autres conteneurs ou l'hôte lui-même.

Tout d'abord, inspectons la configuration du conteneur webserver que nous avons créé précédemment. La commande docker inspect fournit une sortie JSON détaillée avec tous les paramètres du conteneur.

docker inspect webserver

La sortie est très longue. Vous pouvez utiliser l'option --format pour extraire des champs spécifiques. Vérifions si une limite de mémoire est définie.

docker inspect --format='{{.HostConfig.Memory}}' webserver

La sortie sera 0, ce qui signifie qu'il n'y a pas de limite de mémoire.

0

Maintenant, créons un nouveau conteneur avec une limite de mémoire. Tout d'abord, vous devez arrêter et supprimer le conteneur existant, car nous allons réutiliser le mappage de port.

docker stop webserver
docker rm webserver

Ensuite, exécutez un nouveau conteneur Nginx, mais cette fois ajoutez l'option --memory="100m" pour limiter son utilisation de mémoire à 100 mégaoctets. Nous lui donnerons également un nouveau nom.

docker run -d -p 8080:80 --name webserver-limited --memory="100m" nginx

Maintenant, inspectez la limite de mémoire de ce nouveau conteneur.

docker inspect --format='{{.HostConfig.Memory}}' webserver-limited

Cette fois, la sortie sera la limite de mémoire en octets (100 × 1024 × 1024).

104857600

Vous avez appliqué avec succès une contrainte de ressources à un conteneur, ce qui constitue une étape fondamentale dans la sécurité des conteneurs et la gestion des ressources.

Résumé

Dans ce laboratoire, vous avez acquis une expérience pratique des aspects fondamentaux de Docker et de la sécurité des conteneurs.

Vous avez réussi à :

  • Vérifier l'installation de Docker et configurer les autorisations d'accès appropriées dans l'environnement LabEx.
  • Exécuter un serveur web Nginx de base en tant que conteneur Docker.
  • Mapper des ports pour accéder à l'application conteneurisée depuis l'hôte.
  • Inspecter les processus en cours d'exécution à l'intérieur d'un conteneur à l'aide de docker top.
  • Surveiller l'utilisation des ressources en direct avec docker stats.
  • Apprendre à définir des limites de ressources, telles que la mémoire, sur un conteneur pour améliorer la stabilité et la sécurité du système.

Ces compétences constituent les bases pour gérer et sécuriser des applications plus complexes, multi-conteneurs, dans un environnement de production.