Docker - Bonnes pratiques de sécurité

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 :

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

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

1
2
RUN useradd -d /home/myappuser -m -s /bin/bash myappuser
USER 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à.

1
# groupadd docker

Ajoutez votre utilisateur au groupe de docker.

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

1
# 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 !

1
2
# sudo systemctl enable docker
# sudo systemctl disable 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/

Partager