.. | ||
docker-breakout-privilege-escalation | ||
namespaces | ||
abusing-docker-socket-for-privilege-escalation.md | ||
apparmor.md | ||
authz-and-authn-docker-access-authorization-plugin.md | ||
cgroups.md | ||
docker-privileged.md | ||
README.md | ||
seccomp.md | ||
weaponizing-distroless.md |
Sécurité Docker
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFTs
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.
![](/Mirrors/hacktricks/media/commit/e594ea0efc147bd99b5fbb65b6a6963ce951a142/.gitbook/assets/image%20%283%29%20%281%29%20%281%29.png)
Utilisez Trickest pour créer et automatiser facilement des flux de travail alimentés par les outils communautaires les plus avancés au monde.
Obtenez un accès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
Sécurité de base du moteur Docker
Le moteur Docker effectue le gros du travail d'exécution et de gestion des conteneurs. Le moteur Docker utilise des fonctionnalités du noyau Linux telles que les espaces de noms et les groupes de contrôle pour fournir une isolation de base entre les conteneurs. Il utilise également des fonctionnalités telles que la réduction des capacités, Seccomp, SELinux/AppArmor pour une meilleure isolation.
Enfin, un plugin d'authentification peut être utilisé pour limiter les actions que les utilisateurs peuvent effectuer.
Accès sécurisé au moteur Docker
Le client Docker peut accéder au moteur Docker en local en utilisant un socket Unix ou à distance en utilisant le mécanisme http. Pour l'utiliser à distance, il est nécessaire d'utiliser https et TLS afin de garantir la confidentialité, l'intégrité et l'authentification.
Par défaut, il écoute sur le socket Unix unix:///var/
run/docker.sock
et dans les distributions Ubuntu, les options de démarrage de Docker sont spécifiées dans /etc/default/docker
. Pour permettre à l'API Docker et au client d'accéder au moteur Docker à distance, nous devons exposer le démon Docker en utilisant un socket http. Cela peut être fait en :
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H
tcp://192.168.56.101:2376" -> add this to /etc/default/docker
Sudo service docker restart -> Restart Docker daemon
Exposer le démon Docker en utilisant http n'est pas une bonne pratique et il est nécessaire de sécuriser la connexion en utilisant https. Il existe deux options : la première option est pour le client de vérifier l'identité du serveur et la deuxième option est que le client et le serveur se vérifient mutuellement. Les certificats établissent l'identité d'un serveur. Pour un exemple des deux options, consultez cette page.
Sécurité des images de conteneurs
Les images de conteneurs sont stockées soit dans un référentiel privé, soit dans un référentiel public. Voici les options que Docker propose pour stocker les images de conteneurs :
- Docker hub - Il s'agit d'un service de registre public fourni par Docker.
- Docker registry - Il s'agit d'un projet open source que les utilisateurs peuvent utiliser pour héberger leur propre registre.
- Docker trusted registry - Il s'agit de la mise en œuvre commerciale de Docker du registre Docker et il offre une authentification des utilisateurs basée sur les rôles ainsi qu'une intégration avec le service d'annuaire LDAP.
Analyse des images
Les conteneurs peuvent présenter des vulnérabilités de sécurité soit en raison de l'image de base, soit en raison des logiciels installés par-dessus l'image de base. Docker travaille sur un projet appelé Nautilus qui effectue une analyse de sécurité des conteneurs et répertorie les vulnérabilités. Nautilus fonctionne en comparant chaque couche d'image de conteneur avec un référentiel de vulnérabilités pour identifier les failles de sécurité.
Pour plus d'informations, lisez ceci (https://docs.docker.com/engine/scan/).
docker scan
La commande docker scan
vous permet de scanner les images Docker existantes en utilisant le nom ou l'ID de l'image. Par exemple, exécutez la commande suivante pour analyser l'image hello-world :
docker scan hello-world
Testing hello-world...
Organization: docker-desktop-test
Package manager: linux
Project name: docker-image|hello-world
Docker image: hello-world
Licenses: enabled
✓ Tested 0 dependencies for known issues, no vulnerable paths found.
Note that we do not currently have vulnerability data for your image.
trivy -q -f json <ontainer_name>:<tag>
snyk container test <image> --json-file-output=<output file> --severity-threshold=high
clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5
Signature des images Docker
Les images de conteneurs Docker peuvent être stockées soit dans un registre public, soit dans un registre privé. Il est nécessaire de signer les images de conteneurs afin de pouvoir confirmer qu'elles n'ont pas été altérées. L'éditeur de contenu se charge de signer l'image du conteneur et de la pousser dans le registre.
Voici quelques détails sur la confiance du contenu Docker :
- La confiance du contenu Docker est une implémentation du projet open source Notary. Le projet open source Notary est basé sur le projet The Update Framework (TUF).
- La confiance du contenu Docker est activée avec
export DOCKER_CONTENT_TRUST=1
. À partir de la version 1.10 de Docker, la confiance du contenu n'est pas activée par défaut. - Lorsque la confiance du contenu est activée, nous ne pouvons tirer que des images signées. Lorsque l'image est poussée, nous devons entrer une clé de balisage.
- Lorsque l'éditeur pousse l'image pour la première fois en utilisant
docker push
, il est nécessaire d'entrer une phrase secrète pour la clé racine et la clé de balisage. Les autres clés sont générées automatiquement. - Docker a également ajouté la prise en charge de clés matérielles en utilisant Yubikey et les détails sont disponibles ici.
Voici l'erreur que nous obtenons lorsque la confiance du contenu est activée et que l'image n'est pas signée.
$ docker pull smakam/mybusybox
Using default tag: latest
No trust data for latest
Le résultat suivant montre que l'image du conteneur est en cours de téléversement vers Docker Hub avec la signature activée. Étant donné que ce n'est pas la première fois, l'utilisateur est invité à entrer uniquement la phrase secrète pour la clé du référentiel.
$ docker push smakam/mybusybox:v2
The push refers to a repository [docker.io/smakam/mybusybox]
a7022f99b0cc: Layer already exists
5f70bf18a086: Layer already exists
9508eff2c687: Layer already exists
v2: digest: sha256:8509fa814029e1c1baf7696b36f0b273492b87f59554a33589e1bd6283557fc9 size: 2205
Signing and pushing trust metadata
Enter passphrase for repository key with ID 001986b (docker.io/smakam/mybusybox):
Il est nécessaire de stocker la clé root, la clé du dépôt ainsi que la phrase secrète dans un endroit sûr. La commande suivante peut être utilisée pour sauvegarder les clés privées :
tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
Lorsque j'ai changé d'hôte Docker, j'ai dû déplacer les clés root et les clés de dépôt pour pouvoir opérer à partir du nouvel hôte.
![](/Mirrors/hacktricks/media/commit/e594ea0efc147bd99b5fbb65b6a6963ce951a142/.gitbook/assets/image%20%283%29%20%281%29%20%281%29.png)
Utilisez Trickest pour créer facilement et automatiser des flux de travail alimentés par les outils communautaires les plus avancés au monde.
Accédez dès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
Fonctionnalités de sécurité des conteneurs
Résumé des fonctionnalités de sécurité des conteneurs
Namespaces
Les namespaces sont utiles pour isoler un projet des autres, en isolant les communications entre les processus, le réseau, les montages... C'est utile pour isoler le processus Docker des autres processus (et même du dossier /proc) afin qu'il ne puisse pas s'échapper en abusant d'autres processus.
Il serait possible de "s'échapper" ou plus précisément de créer de nouveaux namespaces en utilisant la commande unshare
(qui utilise l'appel système unshare
). Docker l'empêche par défaut, mais Kubernetes ne le fait pas (au moment de la rédaction de ceci).
Quoi qu'il en soit, cela est utile pour créer de nouveaux namespaces, mais pas pour revenir aux namespaces par défaut de l'hôte (à moins d'avoir accès à certains /proc
à l'intérieur des namespaces de l'hôte, où vous pourriez utiliser nsenter
pour entrer dans les namespaces de l'hôte).
CGroups
Cela permet de limiter les ressources et n'affecte pas la sécurité de l'isolation du processus (à l'exception de release_agent
qui pourrait être utilisé pour s'échapper).
Abandon des capacités
Je trouve que c'est l'une des fonctionnalités les plus importantes en ce qui concerne la sécurité de l'isolation des processus. Cela est dû au fait que sans les capacités, même si le processus s'exécute en tant que root, vous ne pourrez pas effectuer certaines actions privilégiées (car l'appel syscall
renverra une erreur de permission car le processus n'a pas les capacités nécessaires).
Voici les capacités restantes après que le processus a abandonné les autres :
{% code overflow="wrap" %}
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
{% endcode %}
Seccomp
Il est activé par défaut dans Docker. Il aide à limiter encore plus les appels système que le processus peut effectuer.
Le profil Seccomp par défaut de Docker peut être trouvé à l'adresse https://github.com/moby/moby/blob/master/profiles/seccomp/default.json
AppArmor
Docker dispose d'un modèle que vous pouvez activer : https://github.com/moby/moby/tree/master/profiles/apparmor
Cela permettra de réduire les capacités, les appels système, l'accès aux fichiers et aux dossiers...
Namespaces
Les espaces de noms sont une fonctionnalité du noyau Linux qui partitionne les ressources du noyau de telle sorte qu'un ensemble de processus voit un ensemble de ressources tandis qu'un autre ensemble de processus voit un ensemble différent de ressources. La fonctionnalité fonctionne en ayant le même espace de noms pour un ensemble de ressources et de processus, mais ces espaces de noms font référence à des ressources distinctes. Les ressources peuvent exister dans plusieurs espaces.
Docker utilise les espaces de noms du noyau Linux suivants pour assurer l'isolation des conteneurs :
- espace de noms pid
- espace de noms mount
- espace de noms réseau
- espace de noms ipc
- espace de noms UTS
Pour plus d'informations sur les espaces de noms, consultez la page suivante :
{% content-ref url="namespaces/" %} namespaces {% endcontent-ref %}
cgroups
La fonctionnalité du noyau Linux appelée cgroups permet de restreindre les ressources telles que le CPU, la mémoire, l'E/S, la bande passante réseau pour un ensemble de processus. Docker permet de créer des conteneurs en utilisant la fonctionnalité cgroups, ce qui permet de contrôler les ressources spécifiques du conteneur.
Voici un exemple de création d'un conteneur avec une limite de mémoire de 500 Mo pour l'espace utilisateur, une limite de mémoire du noyau de 50 Mo, une part de CPU de 512 et un poids de blkioweight de 400. La part de CPU est un ratio qui contrôle l'utilisation du CPU par le conteneur. Sa valeur par défaut est de 1024 et sa plage va de 0 à 1024. Si trois conteneurs ont la même part de CPU de 1024, chaque conteneur peut utiliser jusqu'à 33% du CPU en cas de conflit de ressources CPU. Le poids de blkioweight est un ratio qui contrôle l'E/S du conteneur. Sa valeur par défaut est de 500 et sa plage va de 10 à 1000.
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
Pour obtenir le cgroup d'un conteneur, vous pouvez faire :
docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
ps -ef | grep 1234 #Get info about the sleep process
ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it)
Pour plus d'informations, consultez:
{% content-ref url="cgroups.md" %} cgroups.md {% endcontent-ref %}
Capacités
Les capacités permettent un contrôle plus précis des capacités autorisées pour l'utilisateur root. Docker utilise la fonctionnalité de capacité du noyau Linux pour limiter les opérations pouvant être effectuées à l'intérieur d'un conteneur, indépendamment du type d'utilisateur.
Lorsqu'un conteneur Docker est exécuté, le processus abandonne les capacités sensibles que le processus pourrait utiliser pour échapper à l'isolation. Cela vise à garantir que le processus ne pourra pas effectuer d'actions sensibles et s'échapper :
{% content-ref url="../linux-capabilities.md" %} linux-capabilities.md {% endcontent-ref %}
Seccomp dans Docker
Il s'agit d'une fonctionnalité de sécurité qui permet à Docker de limiter les appels système pouvant être utilisés à l'intérieur du conteneur :
{% content-ref url="seccomp.md" %} seccomp.md {% endcontent-ref %}
AppArmor dans Docker
AppArmor est une amélioration du noyau permettant de confiner les conteneurs à un ensemble limité de ressources avec des profils par programme :
{% content-ref url="apparmor.md" %} apparmor.md {% endcontent-ref %}
SELinux dans Docker
SELinux est un système d'étiquetage. Chaque processus et chaque objet de système de fichiers possède une étiquette. Les politiques SELinux définissent des règles sur ce qu'une étiquette de processus est autorisée à faire avec toutes les autres étiquettes du système.
Les moteurs de conteneur lancent des processus de conteneur avec une seule étiquette SELinux confinée, généralement container_t
, puis définissent le conteneur à l'intérieur du conteneur avec l'étiquette container_file_t
. Les règles de la politique SELinux disent essentiellement que les processus container_t
ne peuvent lire/écrire/exécuter que des fichiers étiquetés container_file_t
.
{% content-ref url="../selinux.md" %} selinux.md {% endcontent-ref %}
AuthZ & AuthN
Un plugin d'autorisation approuve ou refuse les demandes au démon Docker en fonction du contexte d'authentification actuel et du contexte de commande. Le contexte d'authentification contient tous les détails de l'utilisateur et la méthode d'authentification. Le contexte de commande contient toutes les données de demande pertinentes.
{% content-ref url="authz-and-authn-docker-access-authorization-plugin.md" %} authz-and-authn-docker-access-authorization-plugin.md {% endcontent-ref %}
DoS à partir d'un conteneur
Si vous ne limitez pas correctement les ressources qu'un conteneur peut utiliser, un conteneur compromis pourrait provoquer un déni de service (DoS) sur l'hôte où il s'exécute.
- DoS du CPU
# stress-ng
sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t 5m
# While loop
docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; done'
Bande passante DoS
Une attaque de déni de service (DoS) par bande passante consiste à saturer la bande passante d'un système cible afin de le rendre indisponible aux utilisateurs légitimes. Cette attaque vise à épuiser les ressources réseau du système, ce qui entraîne une dégradation des performances ou une interruption complète du service.
L'attaquant peut utiliser différentes techniques pour mener une attaque de déni de service par bande passante, telles que l'envoi massif de requêtes, la génération de trafic réseau volumineux ou l'exploitation de vulnérabilités dans les protocoles réseau.
Pour se protéger contre une attaque de déni de service par bande passante, il est recommandé de mettre en place des mesures de sécurité telles que la limitation de la bande passante, la mise en place de pare-feux et de systèmes de détection d'intrusion, ainsi que la surveillance du trafic réseau pour détecter les anomalies.
Il est également important de garder les systèmes à jour avec les derniers correctifs de sécurité et de mettre en œuvre des politiques de sécurité solides pour réduire les risques d'attaques de déni de service par bande passante.
nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444; done
Intéressants drapeaux Docker
Drapeau --privileged
Sur la page suivante, vous pouvez apprendre ce que signifie le drapeau --privileged
:
{% content-ref url="docker-privileged.md" %} docker-privileged.md {% endcontent-ref %}
--security-opt
no-new-privileges
Si vous exécutez un conteneur où un attaquant parvient à accéder en tant qu'utilisateur à faible privilège. Si vous avez un binaire suid mal configuré, l'attaquant peut l'exploiter et escalader les privilèges à l'intérieur du conteneur. Ce qui peut lui permettre de s'échapper.
L'exécution du conteneur avec l'option no-new-privileges
activée empêchera ce type d'escalade de privilèges.
docker run -it --security-opt=no-new-privileges:true nonewpriv
Autre
Docker Security
Sécurité Docker
Docker is a popular containerization platform that allows you to package applications and their dependencies into a standardized unit called a container. While Docker provides many benefits in terms of portability and scalability, it also introduces security challenges that need to be addressed.
Docker est une plateforme de conteneurisation populaire qui vous permet de regrouper des applications et leurs dépendances dans une unité standardisée appelée conteneur. Bien que Docker offre de nombreux avantages en termes de portabilité et de scalabilité, il introduit également des défis en matière de sécurité qui doivent être résolus.
This section covers various security best practices and techniques to harden your Docker environment and protect it from potential attacks.
Cette section couvre différentes meilleures pratiques de sécurité et techniques pour renforcer votre environnement Docker et le protéger contre d'éventuelles attaques.
-
Docker Security Best Practices: Learn about the best practices to secure your Docker installation and containers.
-
Meilleures pratiques de sécurité Docker : Découvrez les meilleures pratiques pour sécuriser votre installation Docker et vos conteneurs.
-
Docker Image Security: Understand the security considerations when working with Docker images and how to mitigate potential risks.
-
Sécurité des images Docker : Comprenez les considérations de sécurité lors de la manipulation des images Docker et comment atténuer les risques potentiels.
-
Docker Network Security: Explore techniques to secure Docker networking and prevent unauthorized access to your containers.
-
Sécurité du réseau Docker : Explorez les techniques pour sécuriser le réseau Docker et empêcher l'accès non autorisé à vos conteneurs.
-
Docker Runtime Security: Learn about runtime security measures to protect your Docker containers from exploitation.
-
Sécurité d'exécution Docker : Découvrez les mesures de sécurité d'exécution pour protéger vos conteneurs Docker contre l'exploitation.
-
Docker Orchestration Security: Understand the security considerations when using Docker orchestration tools like Kubernetes and how to secure your orchestration environment.
-
Sécurité de l'orchestration Docker : Comprenez les considérations de sécurité lors de l'utilisation d'outils d'orchestration Docker tels que Kubernetes et comment sécuriser votre environnement d'orchestration.
-
Docker Logging and Monitoring: Learn about the importance of logging and monitoring in Docker security and how to implement effective logging and monitoring practices.
-
Journalisation et surveillance Docker : Découvrez l'importance de la journalisation et de la surveillance dans la sécurité Docker et comment mettre en œuvre des pratiques de journalisation et de surveillance efficaces.
-
Docker Compliance and Auditing: Understand the compliance requirements for Docker environments and learn how to perform audits to ensure compliance.
-
Conformité et audit Docker : Comprenez les exigences de conformité pour les environnements Docker et apprenez comment effectuer des audits pour garantir la conformité.
-
Docker Security Tools: Explore various security tools and utilities that can help you assess and enhance the security of your Docker environment.
-
Outils de sécurité Docker : Explorez divers outils de sécurité et utilitaires qui peuvent vous aider à évaluer et à améliorer la sécurité de votre environnement Docker.
Contributing
Contribution
Contributions are welcome! If you have any security best practices, techniques, or tools related to Docker security, feel free to submit a pull request.
Les contributions sont les bienvenues ! Si vous avez des meilleures pratiques de sécurité, des techniques ou des outils liés à la sécurité Docker, n'hésitez pas à soumettre une demande d'extraction.
License
Licence
This project is licensed under the MIT License - see the LICENSE file for details.
Ce projet est sous licence MIT - consultez le fichier LICENSE pour plus de détails.
#You can manually add/drop capabilities with
--cap-add
--cap-drop
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined
# You can manually disable selinux in docker with
--security-opt label:disable
Pour plus d'options --security-opt
, consultez: https://docs.docker.com/engine/reference/run/#security-configuration
Autres considérations de sécurité
Gestion des secrets
Tout d'abord, ne les mettez pas à l'intérieur de votre image !
De plus, n'utilisez pas de variables d'environnement pour vos informations sensibles. Toute personne qui peut exécuter docker inspect
ou exec
dans le conteneur peut trouver votre secret.
Les volumes Docker sont meilleurs. Ils sont la méthode recommandée pour accéder à vos informations sensibles dans la documentation Docker. Vous pouvez utiliser un volume comme système de fichiers temporaire stocké en mémoire. Les volumes éliminent le risque de docker inspect
et de journalisation. Cependant, les utilisateurs root pourraient toujours voir le secret, tout comme toute personne pouvant exec
dans le conteneur.
Encore mieux que les volumes, utilisez les secrets Docker.
Si vous avez juste besoin du secret dans votre image, vous pouvez utiliser BuildKit. BuildKit réduit considérablement le temps de construction et offre d'autres fonctionnalités intéressantes, notamment la prise en charge des secrets au moment de la construction.
Il existe trois façons de spécifier le backend BuildKit afin de pouvoir utiliser ses fonctionnalités dès maintenant :
- Définissez-le en tant que variable d'environnement avec
export DOCKER_BUILDKIT=1
. - Démarrez votre commande
build
ourun
avecDOCKER_BUILDKIT=1
. - Activez BuildKit par défaut. Définissez la configuration dans /etc/docker/daemon.json sur true avec :
{ "features": { "buildkit": true } }
. Ensuite, redémarrez Docker. - Ensuite, vous pouvez utiliser les secrets au moment de la construction avec le drapeau
--secret
comme ceci :
docker build --secret my_key=my_value ,src=path/to/my_secret_file .
Lorsque votre fichier spécifie vos secrets sous forme de paires clé-valeur.
Ces secrets sont exclus du cache de construction de l'image et de l'image finale.
Si vous avez besoin de votre secret dans votre conteneur en cours d'exécution, et pas seulement lors de la construction de votre image, utilisez Docker Compose ou Kubernetes.
Avec Docker Compose, ajoutez la paire clé-valeur des secrets à un service et spécifiez le fichier secret. Un grand merci à la réponse de Stack Exchange pour le conseil sur les secrets de Docker Compose, dont l'exemple ci-dessous est adapté.
Exemple docker-compose.yml
avec des secrets :
version: "3.7"
services:
my_service:
image: centos:7
entrypoint: "cat /run/secrets/my_secret"
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret_file.txt
Ensuite, démarrez Compose comme d'habitude avec docker-compose up --build my_service
.
Si vous utilisez Kubernetes, il prend en charge les secrets. Helm-Secrets peut faciliter la gestion des secrets dans K8s. De plus, K8s dispose de contrôles d'accès basés sur les rôles (RBAC), tout comme Docker Enterprise. RBAC facilite la gestion et la sécurisation de l'accès aux secrets pour les équipes.
gVisor
gVisor est un noyau d'application, écrit en Go, qui implémente une partie importante de la surface du système Linux. Il comprend un runtime Open Container Initiative (OCI) appelé runsc
qui fournit une frontière d'isolation entre l'application et le noyau hôte. Le runtime runsc
s'intègre à Docker et Kubernetes, ce qui permet d'exécuter facilement des conteneurs sandbox.
{% embed url="https://github.com/google/gvisor" %}
Kata Containers
Kata Containers est une communauté open source qui travaille à la création d'un runtime de conteneur sécurisé avec des machines virtuelles légères qui offrent des performances et une isolation des charges de travail plus solides en utilisant la virtualisation matérielle comme deuxième couche de défense.
{% embed url="https://katacontainers.io/" %}
Conseils récapitulatifs
- N'utilisez pas le drapeau
--privileged
ou montez un socket Docker à l'intérieur du conteneur. Le socket Docker permet de créer des conteneurs, il est donc facile de prendre le contrôle total de l'hôte, par exemple en exécutant un autre conteneur avec le drapeau--privileged
. - N'exécutez pas en tant que root à l'intérieur du conteneur. Utilisez un utilisateur différent et des espaces de noms utilisateur. Le compte root dans le conteneur est le même que sur l'hôte, sauf s'il est remappé avec des espaces de noms utilisateur. Il est seulement légèrement restreint par les espaces de noms Linux, les capacités et les cgroups.
- Supprimez toutes les capacités (
--cap-drop=all
) et n'activez que celles qui sont nécessaires (--cap-add=...
). De nombreuses charges de travail n'ont pas besoin de capacités et leur ajout élargit la portée d'une attaque potentielle. - Utilisez l'option de sécurité "no-new-privileges" pour empêcher les processus d'obtenir plus de privilèges, par exemple via des binaires suid.
- Limitez les ressources disponibles pour le conteneur. Les limites des ressources peuvent protéger la machine contre les attaques de déni de service.
- Ajustez les profils seccomp, AppArmor (ou SELinux) pour restreindre les actions et les appels système disponibles pour le conteneur au strict minimum requis.
- Utilisez des images Docker officielles https://docs.docker.com/docker-hub/official_images/ et exigez des signatures ou créez vos propres images basées sur celles-ci. N'héritez pas ou n'utilisez pas d'images compromises. Stockez également les clés racines et les phrases secrètes dans un endroit sûr. Docker prévoit de gérer les clés avec UCP.
- Reconstruisez régulièrement vos images pour appliquer les correctifs de sécurité sur l'hôte et les images.
- Gérez vos secrets avec prudence afin qu'il soit difficile pour un attaquant de les accéder.
- Si vous exposez le démon Docker, utilisez HTTPS avec une authentification client et serveur.
- Dans votre Dockerfile, privilégiez COPY plutôt que ADD. ADD extrait automatiquement les fichiers compressés et peut copier des fichiers à partir d'URL. COPY n'a pas ces fonctionnalités. Dans la mesure du possible, évitez d'utiliser ADD pour ne pas être vulnérable aux attaques via des URL distantes et des fichiers Zip.
- Utilisez des conteneurs séparés pour chaque micro-service.
- N'incluez pas SSH à l'intérieur du conteneur, "docker exec" peut être utilisé pour se connecter en SSH au conteneur.
- Utilisez des images de conteneur plus petites.
Évasion de Docker / Élévation de privilèges
Si vous êtes à l'intérieur d'un conteneur Docker ou si vous avez accès à un utilisateur du groupe docker, vous pouvez essayer de vous échapper et d'escalader les privilèges :
{% content-ref url="docker-breakout-privilege-escalation/" %} docker-breakout-privilege-escalation {% endcontent-ref %}
Contournement du plugin d'authentification Docker
Si vous avez accès au socket Docker ou si vous avez accès à un utilisateur du groupe docker mais que vos actions sont limitées par un plugin d'authentification Docker, vérifiez si vous pouvez le contourner :
{% content-ref url="authz-and-authn-docker-access-authorization-plugin.md" %} authz-and-authn-docker-access-authorization-plugin.md {% endcontent-ref %}
Durcissement de Docker
- L'outil docker-bench-security est un script qui vérifie des dizaines de bonnes pratiques courantes pour le déploiement de conteneurs Docker en production. Les tests sont tous automatisés et sont basés sur le CIS Docker Benchmark v1.3.1.
Vous devez exécuter l'outil à partir de l'hôte exécutant Docker ou à partir d'un conteneur disposant des privilèges suffisants. Découvrez comment l'exécuter dans le README : https://github.com/docker/docker-bench-security.
Références
- https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/
- https://twitter.com/_fel1x/status/1151487051986087936
- https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html
- https://sreeninet.wordpress.com/2016/03/06/docker-security-part-1overview/
- https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/
- https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/
- https://sreeninet.wordpress.com/2016/03/06/docker-security-part-4container-image/
- https://en.wikipedia.org/wiki/Linux_namespaces
- https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57
![](/Mirrors/hacktricks/media/commit/e594ea0efc147bd99b5fbb65b6a6963ce951a142/.gitbook/assets/image%20%283%29%20%281%29%20%281%29.png)
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? Ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez La famille PEASS, notre collection exclusive de NFT
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.