Sécurité et maintenance
Comprendre les risques et les bonnes pratiques pour des conteneurs robustes
Il est recommandé de consulter la documentation officielle pour des informations à jour et détaillées.
Notions théoriques
Sécurité dans Docker
Docker permet d’isoler les applications dans des conteneurs. Cependant, cette isolation n’est pas aussi forte que celle d’une machine virtuelle. Il est donc important de prendre en compte certains aspects de sécurité.
-
Images non fiables : Télécharger une image depuis Docker Hub peut introduire des vulnérabilités si l’image a été créée par une source inconnue. Il est recommandé d’utiliser des images officielles ou vérifiées.
-
Utilisateurs root dans les conteneurs : Par défaut, les conteneurs s’exécutent en tant qu’utilisateur root. Cela peut poser un risque si le conteneur est compromis. Il est préférable de créer un utilisateur non privilégié dans le Dockerfile.
-
Volumes partagés : Monter un volume entre l’hôte et le conteneur donne au conteneur un accès potentiellement large au système de fichiers de l’hôte. Il faut limiter les permissions accordées.
-
Capacités Linux : Docker utilise des mécanismes de sécurité du noyau Linux comme les namespaces, les cgroups et les profils AppArmor/SELinux. Ces mécanismes limitent ce que peut faire un conteneur.
-
Réseau et ports exposés : Ouvrir un port dans un conteneur peut exposer des services à des attaques extérieures. Il est conseillé de ne publier que les ports nécessaires et de restreindre l’accès via un pare-feu.
-
Secrets et variables d’environnement : Ne jamais stocker de mots de passe ou de clés API directement dans les images ou dans les variables d’environnement. Utiliser des solutions de gestion de secrets.
-
Mises à jour et correctifs : Les images Docker peuvent contenir des bibliothèques obsolètes. Il est important de reconstruire régulièrement les images à partir de versions à jour des bases (ex :
python:3.11-slim
). -
Analyse de vulnérabilités : Des outils comme
docker scan
, Trivy ou Clair permettent d’analyser une image Docker pour détecter des failles de sécurité connues. -
Isolation des conteneurs : Utiliser des options comme
--read-only
,--cap-drop
,--user
, et--security-opt=no-new-privileges
pour renforcer l’isolation du conteneur. -
Journalisation et surveillance : Pour détecter les comportements anormaux, il est utile de centraliser les logs et de surveiller l’activité réseau et système des conteneurs.
Maintenance des conteneurs
-
Nettoyage des ressources : Docker accumule rapidement des images, conteneurs arrêtés, volumes et réseaux inutilisés. Utiliser
docker system prune
pour faire le ménage. -
Versionner les images : Ne pas utiliser
latest
en production. Privilégier des tags explicites (v1.2
,3.11-slim
, etc.) pour garantir la reproductibilité. -
Automatiser les builds : Utiliser des systèmes d’intégration continue (CI) pour reconstruire et tester automatiquement les images.
-
Surveiller l’espace disque : Les images Docker peuvent être lourdes. Il est recommandé d’optimiser les Dockerfiles (multi-stage builds, suppression des fichiers temporaires) pour réduire la taille.
-
Documentation et audit : Documenter les images, les configurations réseau et les volumes utilisés. Réaliser des audits réguliers pour vérifier la conformité avec les bonnes pratiques.
Exemple pratique
Il est possible de créer une image Docker sécurisée pour une application Python simple :
- en configurant un utilisateur non privilégié,
- en limitant les permissions,
- et en analysant l’image avec un outil de scan.
Étapes
- Créer un dossier de travail :
mkdir ~/app_secure && cd ~/app_secure
- Ajouter un script Python :
echo "print('Application sécurisée')" > app.py
- Écrire un Dockerfile sécurisé :
FROM python:3.11-slim
RUN adduser --disabled-password --gecos '' appuser
WORKDIR /home/appuser
COPY app.py .
USER appuser
CMD ["python", "app.py"]
- Construire l’image :
docker build -t app_secure .
- Exécuter le conteneur :
docker run --rm app_secure
- Scanner l’image avec Docker Scan (nécessite Docker Desktop) :
docker scan app_secure
- Nettoyer les ressources :
docker image rm app_secure
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Créer un conteneur sécurisé pour exécuter un script Python avec un volume partagé
Ce TP propose de créer un environnement sécurisé dans lequel un script Python est exécuté depuis un volume partagé entre l’hôte et le conteneur Docker.
L’objectif est de mettre en pratique les bonnes pratiques de sécurité tout en découvrant l’intérêt des volumes pour le développement et la maintenance.
1. Créer un dossier de travail local
Créer un dossier sur la machine hôte qui contiendra le script Python à exécuter dans le conteneur.
Une solution
Vous devez être connecté pour voir le contenu.
2. Écrire un script Python simple dans ce dossier
Créer un fichier calcul.py
qui affiche le carré d’un nombre donné par l’utilisateur.
Une solution
Vous devez être connecté pour voir le contenu.
3. Écrire un Dockerfile sécurisé pour exécuter ce script
Créer un Dockerfile qui utilise une image Python légère, crée un utilisateur non privilégié, et monte un volume partagé.
Une solution
Vous devez être connecté pour voir le contenu.
4. Construire l’image Docker
Construire l’image Docker à partir du Dockerfile.
Une solution
Vous devez être connecté pour voir le contenu.
5. Lancer le conteneur avec un volume partagé
Lancer le conteneur en montant le dossier courant comme volume dans le conteneur. Cela permet de modifier le script sans reconstruire l’image.
Une solution
Vous devez être connecté pour voir le contenu.
6. Modifier le script localement sans reconstruire l’image
Modifier le fichier calcul.py
pour afficher également la racine carrée du nombre.
Une solution
Vous devez être connecté pour voir le contenu.
7. Scanner l’image initiale avec Docker Scan
Utiliser un outil de scan pour vérifier les vulnérabilités dans l’image Docker construite précédemment.
Une solution
Vous devez être connecté pour voir le contenu.
8. Nettoyer les ressources Docker
Supprimer les images et conteneurs inutilisés pour libérer de l’espace disque.
Une solution
Vous devez être connecté pour voir le contenu.
9. Supprimer les fichiers locaux
Nettoyer le répertoire local si le projet n’est plus nécessaire.
Une solution
Vous devez être connecté pour voir le contenu.
10. Bonus (facultatif) : créer une image multi-stage pour réduire la taille finale
Créer un Dockerfile avec une étape de build et une étape d’exécution séparée.
Une solution
Vous devez être connecté pour voir le contenu.