Docs Administration Système Docker Compose Sécurisé
Débutant Conteneurisation

Déploiement d'une stack Docker Compose sécurisée

D
Par Dylan Pacques

Docker Compose simplifie considérablement la gestion d'applications multi-conteneurs. Cependant, par défaut, les conteneurs s'exécutent souvent avec des privilèges trop élevés (root) et sans restrictions de ressources, ce qui représente un risque majeur en cas de compromission d'une application web. Ce guide vous montre comment installer Docker et déployer une architecture durcie et isolée.

Prérequis

  • Un serveur virtuel exécutant Debian 12 ou Ubuntu.
  • Un utilisateur standard avec les privilèges `sudo`.

Étape 1 : Installer Docker et Docker Compose

Pour obtenir la version la plus récente et sécurisée de Docker, nous allons utiliser le dépôt officiel plutôt que les paquets génériques de la distribution.

Terminal - Installation
# Ajouter les clés GPG officielles de Docker
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg -y
sudo install -m 0755 -v -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Ajouter le dépôt APT officiel
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.p/docker.list > /dev/null

# Installer le moteur Docker et le plugin Compose
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

Étape 2 : Durcir le daemon Docker

Par défaut, Docker expose un socket UNIX possédé par root. Pour limiter la surface d'attaque, nous allons configurer le daemon pour désactiver les fonctionnalités inutiles (comme l'intercommunication inter-conteneurs non contrôlée sur le bridge par défaut) et restreindre les privilèges.

Créez ou modifiez le fichier de configuration du daemon :

sudo nano /etc/docker/daemon.json
/etc/docker/daemon.json
{
  "icc": false,
  "no-new-privileges": true,
  "userns-remap": "default"
}

Note : Le paramètre `icc: false` empêche les conteneurs de communiquer entre eux s'ils ne sont pas explicitement liés dans le même réseau Docker Compose. `no-new-privileges` empêche les applications conteneurisées d'élever leurs privilèges système via un SUID.

Redémarrez le service pour appliquer le durcissement : sudo systemctl restart docker.

Étape 3 : Écrire un fichier Docker Compose durci

Voici un exemple d'architecture durcie pour une stack web standard (Nginx + App). Nous allons appliquer des limites strictes de CPU/RAM, forcer l'exécution avec un utilisateur non privilégié, et monter le système de fichiers en lecture seule partout où cela est possible.

docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro # Montage en Lecture seule (Read-Only)
    networks:
      - frontend-net
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 256M # Évite les dénis de service par saturation mémoire
    security_opt:
      - no-new-privileges:true
    read_only: true # Empêche l'écriture de fichiers malveillants sur l'OS du conteneur
    tmpfs:
      - /var/cache/nginx
      - /var/run

networks:
  frontend-net:
    driver: bridge
    internal: false # Autorise l'accès internet pour répondre aux requêtes

Étape 4 : Lancement et vérification

Déployez votre stack en arrière-plan à l'aide de l'outil de commande Compose :

docker compose up -d

Pour vous assurer que les restrictions de sécurité et d'isolation réseau fonctionnent comme prévu, vous pouvez inspecter l'utilisation des ressources en temps réel :

docker stats