Déploiement d'une stack Docker Compose sécurisée
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.
# 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
{
"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.
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