Guides des bonnes pratiques pour assurer une sécurité optimale pour l’utilisation de docker.
Concernant le système et les disques
Créer une partition séparée pour Docker###
Docker stocke par défaut dans /var/lib/docker
et ce répertoire peut vite se remplir et rendre le système inutilisable.
Il peut exister des cas ou une image mal configurée/mal intentionnée puisse remplir à elle seule tout l’espace disque.
Maintenez votre système hôte à jour
Vérifier également les dernière MAJ de Docker.
La sécurité dans les containers doit être la même que celle sur votre machine locale (droits, accès, virus, faille, …).
Concernant le réseau et la communication inter container
Interdire les communications entre les containers###
Par défaut les containers communiquent entre eux sans connexion sécurisée car la variable correspondante est par défaut à la valeur TRUE
: --icc Enable inter-container communication (default true)
.
Pour interdire les communications entre container il faut :
Sous Service
Passer le paramètre -icc=false au deamon
. Sous Debian et Ubuntu, cette opération se fait dans le fichier /etc/default/docker
en modifiant la variable DOCKER_OPTS à DOCKER_OPTS="-icc=false"
.
Sous SystemD
pas trouvé de méthode qui fonctionne
Note : Par défaut les containers communiquent entre eux, il est possible de changer la valeur de Link
et d’ensuite faire communiquer au cas par cas les containers entre eux. Cependant Link
est maintenant dépréciée.
Méthode recommandée
La bonne méthode est maintenant d’isoler les container en sous réseaux.
Ne mapper que les ports utiles
Pour un accès depuis tout l’Internet docker run -p 80:80 apache
.
Sur une interface précise docker run -p 192.168.0.1:9200:9200 elasticsearch
.
Isoler les containers dans des sous réseaux
Nécessite de se faire un mini plan réseau avec sous réseau et plan d’adressage.
Concernant les droits et les accès
Ne pas utiliser privileged pour n’importe quelle image
Par défaut, les conteneurs Docker sont unprivileged
et ne peuvent pas, par exemple, exécuter un daemon Docker dans un conteneur Docker. Un conteneur n’est par défaut autorisé à accéder à aucun périphérique, contrairement à un conteneur privileged
qui aura accès à tous les périphériques.
L’option --privileged
donnera toutes les fonctionnalités au conteneur et lèvera également toutes les limitations imposées. En d’autres termes, le conteneur pourra alors faire presque tout ce que l’hôte peut faire. Cet indicateur existe pour permettre des cas d’utilisations spéciales, tels que l’exécution de Docker dans Docker. Il est possible d’attribuer seulement des capacités spécifiques en utilisant l’option --cap-add
. (Voir man 7 capacités).
Limiter les droits des containers
Vérifier que le container n’est pas en root
Pour se faire :
docker inspect --format '{{ .Id }}: User={{.Config.User}}' (Note : Ne marche pas) |
(Alternative avec PodMan https://fedoramagazine.org/running-containers-with-podman/)
Limiter les capabilities
Le but est de supprimer toutes les capabilities ou quelques-unes et d’éventuellement en accorder certaines :
docker run -ti --cap-drop=all debian grep Cap /proc/self/status |
Pour ajouter des capabilities : --cap-add
Pour supprimer des capabilities : --cap-drop
Créer un utilisateur non root
Créer un utilisateur dans votre dockerfile avec les 2 instructions suivantes :
RUN useradd -d /home/myappuser -m -s /bin/bash myappuser |
Choisir les bons registry
N’utilisez pas n’importe quel registry
- Préférez les dépôts officiels validés par docker
- Pour les autres dépôts vérifier le nombre d’étoiles
- Vérifier le dockerfile de l’image sur git
- Vérifier les images intermédiaires utilisées pour construire celle que vous voulez télécharger
- Si l’image n’existe pas sur dockerHub, vérifier le registry et la communication sécurisée entre ce dernier et Docker
Manage Docker as a non-root user
Le démon Docker se lie à un socket Unix au lieu d’un port TCP. Par défaut, ce socket Unix appartient à l’utilisateur root et les autres utilisateurs ne peuvent y accéder qu’en utilisant sudo. Le démon Docker s’exécute toujours en tant qu’utilisateur root.
Si vous ne souhaitez pas préfacer la commande docker avec sudo, créez un groupe Unix appelé docker et ajoutez-lui des utilisateurs. Lorsque le démon Docker démarre, il crée un socket Unix accessible aux membres du groupe de menus.
Avertissement : le groupe docker accorde des privilèges équivalents à l’utilisateur root. Pour plus d’informations sur l’impact de cette modification sur la sécurité de votre système, voir Docker Daemon Attack Surface.
Créez le groupe de docker, selon les distributions il est possible que ce groupe existe déjà.
# groupadd docker |
Ajoutez votre utilisateur au groupe de docker.
# usermod -aG docker $USER |
Déconnectez-vous et reconnectez-vous pour que votre appartenance au groupe soit prise en compte et vérifiez que vous pouvez exécuter la commande docker
sans sudo.
# docker run hello-world |
Cette commande télécharge une image de test et l’exécute dans un conteneur. Lorsque le conteneur s’exécute, il imprime un message d’information et se ferme.
Configure Docker pour un lancement au demarrage de votre machine
La plupart des distributions Linux actuelles (RHEL, CentOS, Fedora, Ubuntu 16.04 et supérieure) utilisent systemd
pour gérer les services qui démarrent au démarrage du système. Pour activer/désactiver le service Docker !
# sudo systemctl enable docker |
Documentation
https://w3blog.fr/2016/02/23/docker-securite-10-bonnes-pratiques/
https://www.atomit.fr/2016/11/les-bonnes-pratiques/
https://www.sans.org/reading-room/whitepapers/auditing/checklist-audit-docker-containers-37437 Les bonnes pratiques Docker du SANS Institute (Sysadmin, Audit, Network, Security Institute )
https://opensource.com/business/15/3/docker-security-tuning
https://github.com/docker/labs/tree/master/security/capabilities#docker_cap
https://www.projectatomic.io/blog/2016/01/how-to-run-a-more-secure-non-root-user-container/
https://docs.docker.com/install/linux/linux-postinstall/
https://fedoramagazine.org/running-containers-with-podman/