Aller au contenu principal

Sécurité et maintenance

Comprendre les risques et les bonnes pratiques pour des conteneurs robustes

attention

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é.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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).

  8. 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.

  9. Isolation des conteneurs : Utiliser des options comme --read-only, --cap-drop, --user, et --security-opt=no-new-privileges pour renforcer l’isolation du conteneur.

  10. 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

  1. 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.

  2. Versionner les images : Ne pas utiliser latest en production. Privilégier des tags explicites (v1.2, 3.11-slim, etc.) pour garantir la reproductibilité.

  3. Automatiser les builds : Utiliser des systèmes d’intégration continue (CI) pour reconstruire et tester automatiquement les images.

  4. 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.

  5. 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

  1. Créer un dossier de travail :
mkdir ~/app_secure && cd ~/app_secure
  1. Ajouter un script Python :
echo "print('Application sécurisée')" > app.py
  1. É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"]
  1. Construire l’image :
docker build -t app_secure .
  1. Exécuter le conteneur :
docker run --rm app_secure
  1. Scanner l’image avec Docker Scan (nécessite Docker Desktop) :
docker scan app_secure
  1. Nettoyer les ressources :
docker image rm app_secure

Test de mémorisation/compréhension


Quel est le risque principal d'utiliser une image non vérifiée ?


Quel utilisateur est utilisé par défaut dans un conteneur ?


Quelle option permet de rendre un conteneur en lecture seule ?


Quel outil permet de scanner une image Docker ?


Pourquoi éviter d'utiliser le tag 'latest' en production ?


Quelle commande supprime les ressources inutilisées ?


Quel fichier est utilisé pour définir un utilisateur non root ?


Quel est le rôle de la commande 'USER' dans un Dockerfile ?


Quel est le danger de stocker des secrets dans les variables d’environnement ?


Que permet la commande 'docker image rm' ?



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

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

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

4. Construire l’image Docker

Construire l’image Docker à partir du Dockerfile.

Une solution

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

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

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

8. Nettoyer les ressources Docker

Supprimer les images et conteneurs inutilisés pour libérer de l’espace disque.

Une solution

9. Supprimer les fichiers locaux

Nettoyer le répertoire local si le projet n’est plus nécessaire.

Une solution

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