Passer au contenu principal

Production (Docker)

Sécurité Docker

Un container n'est pas une VM. L'isolation repose sur des mécanismes noyau qui ont une surface d'attaque. Durcir un container n'est pas optionnel en production — c'est la base.

Utilisateur non-root

# Créer un utilisateur dédié
RUN groupadd -r appuser && useradd -r -g appuser appuser

# Changer de propriétaire sur les fichiers
COPY --chown=appuser:appuser . /app

# Basculer sur cet utilisateur
USER appuser
# Forcer un UID au runtime (utile si l'image n'a pas d'USER)
docker run -u 1000:1000 myapp:latest

# Vérifier l'UID du processus dans le container
docker exec myapp id

Filesystem en lecture seule

docker run -d   --read-only   --tmpfs /tmp:size=64m   --tmpfs /run:size=16m   myapp:latest

Le flag --read-only monte le filesystem racine en lecture seule. Les répertoires temporaires nécessitant des écritures sont montés en tmpfs. Un attaquant qui compromet le container ne peut pas modifier les binaires.

Capabilities Linux

# Retirer toutes les capabilities, n'ajouter que le strict nécessaire
docker run -d   --cap-drop ALL   --cap-add NET_BIND_SERVICE   nginx:alpine

Par défaut, Docker accorde une dizaine de capabilities. Les applications web n'en ont besoin d'aucune en général. NET_BIND_SERVICE permet de binder sur les ports < 1024.

Profils seccomp

# Profil par défaut : bloque ~44 syscalls potentiellement dangereux
# Voir /usr/share/doc/docker.io/examples/seccomp.json

# Profil strict personnalisé
docker run -d   --security-opt seccomp=/path/to/profil.json   myapp:latest

# Désactiver seccomp (déconseillé)
docker run -d --security-opt seccomp=unconfined myapp:latest

no-new-privileges

# Empêche l'escalade de privilèges via setuid/setgid
docker run -d   --security-opt no-new-privileges:true   myapp:latest

AppArmor

# Profil AppArmor par défaut : docker-default (chargé automatiquement)
docker run -d --security-opt apparmor=docker-default nginx:alpine

# Charger un profil custom
apparmor_parser -r /etc/apparmor.d/docker-myapp
docker run -d --security-opt apparmor=docker-myapp myapp:latest

Audit et scanning

# Trivy : scan de vulnérabilités des images
trivy image myapp:latest
trivy image --severity HIGH,CRITICAL myapp:latest

# Docker Scout (intégré à Docker Desktop et Docker Hub)
docker scout cves myapp:latest