TP
Le but de ce TP est de deployer docker puis de durcir au maximum les conteneurs déployés.
Prérequis : https://doc.oxyhack.com/books/ynov/page/lab-docker-default
Docker Bench - Premier test
Docker Bench est un outil que j’utilise pour évaluer la sécurité de ma configuration Docker. Il exécute une série de tests automatisés basés sur les bonnes pratiques de sécurité, m'aidant à identifier et corriger les failles potentielles dans mon environnement Docker.
Mise en Place :
Clonez Docker Bench :
git clone https://github.com/docker/docker-bench-security.gitExécutez l’outil :
cd docker-bench-security sudo ./docker-bench-security.sh
Résultat du premier test :

Mise en place des actions de hardenninng (DockerFile)
1. Exécution de Conteneurs avec des Privilèges Réduits
Risques de Sécurité :
Exécuter des conteneurs avec des privilèges root expose l'hôte à des risques élevés en cas de compromission du conteneur.
Solution :
Pour limiter les risques, je vais exécuter mes conteneurs avec un utilisateur non-root. Docker permet de configurer un mappage des utilisateurs entre l'hôte et le conteneur grâce aux user namespaces. Cela permet de mapper l'utilisateur root du conteneur à un utilisateur non-privilégié sur l'hôte.
Comment ça fonctionne ?
Le mappage des utilisateurs permet de faire en sorte que le root dans le conteneur ne soit pas réellement un utilisateur root sur l'hôte. Par exemple, l'utilisateur root du conteneur peut être mappé à un utilisateur non privilégié sur l'hôte. Cela permet de restreindre les permissions d’un conteneur compromis.
Mise en Place :
Activer le mappage des utilisateurs (userns-remap) :
Pour cela, je vais modifier la configuration de Docker en ajoutant l'option
userns-remapdans le fichier/etc/docker/daemon.json. Cela va forcer Docker à utiliser des espaces de noms utilisateurs pour mapper les utilisateurs du conteneur à ceux de l'hôte.
Modifier le Dockerfile : Dans mon Dockerfile, je vais créer un utilisateur non-root qui sera utilisé pour exécuter l'application à l'intérieur du conteneur.
Vérification : Une fois le conteneur lancé, je peux vérifier que l'application tourne sous un utilisateur non-root avec la commande suivante :

2. Hardenning du compose .yaml
Voici le docker-compose.yml
Explication des mesures de sécurité appliquées :
Exécution sous un utilisateur non-root (
user: "1000:1000") :Risque : Si un conteneur s'exécute en tant que root, un attaquant ayant compromis le conteneur pourrait potentiellement obtenir un accès complet au système hôte.
Solution : En exécutant les conteneurs sous un utilisateur non-root (ici l'UID 1000 et le GID 1000), on limite les privilèges d'un conteneur, réduisant ainsi le risque de prise de contrôle complète.
Système de fichiers en lecture seule (
read_only: true) :Risque : Un système de fichiers en écriture peut être manipulé par un attaquant pour injecter du code malveillant ou modifier des fichiers sensibles.
Solution : En rendant le système de fichiers en lecture seule, on empêche toute modification par des processus malveillants, ce qui est particulièrement utile pour les services qui n'ont pas besoin d'écrire sur le disque.
Options de sécurité (
security_opt) :seccomp:unconfined: Restreint les appels système que les conteneurs peuvent effectuer. Cela permet de réduire les risques d'exploitation des vulnérabilités dans le noyau.no-new-privileges: Empêche l'élévation de privilèges. Même si un processus est compromis, il ne pourra pas obtenir des privilèges plus élevés que ceux accordés initialement au conteneur.
Retrait des capacités inutiles (
cap_drop: - ALL) :Risque : Certains conteneurs peuvent avoir des capacités qui leur permettent d'effectuer des actions non sécurisées, comme manipuler les ressources du noyau ou interagir avec d'autres conteneurs de manière dangereuse.
Solution : En retirant toutes les capacités inutiles, on minimise la surface d'attaque. Cela empêche des actions malveillantes comme l'accès non autorisé au système hôte ou la manipulation de la configuration du conteneur.
Limitation des ressources (CPU et mémoire) (
deploy.resources.limits) :Risque : Si un conteneur consomme trop de ressources (CPU, mémoire), il peut entraîner un déni de service (DoS) sur le système hôte ou affecter les autres conteneurs en partageant les ressources.
Solution : En limitant la mémoire et l'utilisation du CPU de chaque conteneur, on garantit que chaque service reste dans des limites contrôlées, prévenant ainsi l'épuisement des ressources du système.
Contrôle de santé du conteneur (
healthcheck) :Risque : Si un service est défaillant et n'est pas détecté, il peut entraîner une perte de service sans alerte.
Solution : Un contrôle de santé vérifie régulièrement si le service fonctionne correctement. Si le service est en panne, Docker peut redémarrer automatiquement le conteneur pour maintenir la disponibilité du service.
3. Isolation Réseau et Restriction du Trafic
Risques de Sécurité : La communication réseau libre entre conteneurs expose le système à des attaques réseau internes.
Solution : Configurez des réseaux Docker et des règles
nftablespour restreindre le trafic.Mise en Place sur Fedora :
Créez un réseau Docker isolé :
Associez les conteneurs au réseau isolé :
Utilisez
nftablespour restreindre le trafic :
Vérification :
4. Configurer l'Audit des Fichiers Docker
Risque : L'absence d'audit des fichiers Docker peut permettre des modifications malveillantes non détectées, affectant la sécurité du système.
Solution : J'ai configuré auditd pour suivre les accès et modifications aux fichiers critiques de Docker (comme
/var/lib/docker,/etc/docker, etc.).
Commandes pour configurer les règles d'audit :
Voici ma config :
Test d'une règle :

5. Autoriser Uniquement les Utilisateurs de Confiance à Contrôler Docker
Risque : Si des utilisateurs non autorisés ont accès à Docker, ils peuvent exécuter des actions malveillantes ou causer des erreurs humaines affectant la sécurité du système.
Solution : Je vais créer un groupe dédié aux administrateurs Docker et m'assurer que seuls les utilisateurs de confiance sont membres de ce groupe.
Commande :

6. Activer TLS + les logs
Risque : Si Docker écoute sans cryptage (HTTP non sécurisé), des attaquants peuvent intercepter et manipuler la communication entre le client Docker et le serveur Docker, exposant ainsi le système à des risques.
Solution : Je vais configurer Docker pour utiliser TLS (Transport Layer Security) afin d'assurer que les connexions avec:
J’ai configuré Docker pour envoyer ses logs vers un serveur syslog distant afin de centraliser la gestion des logs. Voici les modifications apportées
7. Sécurisation des fichiers TLS dans Docker
8. Activer Docker Content Trust (DCT)
Risque : Si Docker Content Trust (DCT) est désactivé, il est possible de télécharger et utiliser des images non vérifiées. Cela expose le système à des images malveillantes.
Solution : Je vais activer Docker Content Trust afin de garantir que seules des images signées et vérifiées sont téléchargées et utilisées.

Commande :
9. Ne Pas Désactiver le Profil Seccomp par Défaut
Risque : Le profil seccomp est un mécanisme de sécurité qui limite les appels système que les conteneurs peuvent effectuer. Le désactiver augmente la surface d'attaque, permettant à un conteneur d'effectuer des actions potentiellement dangereuses.
Solution : Je vais m'assurer que le profil seccomp est activé et que les conteneurs n'utilisent pas des configurations trop permissives.
Commande pour appliquer le profil seccomp par défaut :
10. Créer une Partition Séparée pour Docker
Je n'ai pas pu le faire car la répartition de mes partitions ne laissait pas la place à l'utilisation d'une nouvelle partition.
Risque : Si Docker utilise la même partition que le système d'exploitation, une surcharge de l'espace disque utilisé par Docker peut impacter la performance et la stabilité du système.
Solution : Pour limiter ce risque, je vais créer une partition dédiée pour Docker, en particulier pour le dossier
/var/lib/dockeroù Docker stocke ses images et conteneurs.
Résultat après hardenning
Nous pouvons observer que ces modifications ont permis d’améliorer drastiquement mon score afin d’atteindre un niveau de sécurité plus qu’acceptable. Le risque de continuer trop le hardening serait de provoquer des conflits de configuration, de restreindre excessivement certaines fonctionnalités nécessaires au bon fonctionnement des services, ou de compliquer la gestion et la maintenance des systèmes. Il est donc important de trouver un équilibre entre sécurité et fonctionnalité.

Last updated