Configurer correctement Docker
Dans la section précédente, nous avions vu quelques mécanismes existent pour sécuriser docker. Aujourd'hui, je vous propose un billet sur quelques règles d'installation de Docker pour renforcer son fonctionnement.
Créer une partition dédiée pour Docker
Docker utilise par défaut le répertoire /var/lib/docker
pour stocker tous ces
fichiers dont les images. Souvent /var est une partition de petite taille et
vous pourriez rapidement atteindre sa limite de stockage, ce qui rendrait votre
serveur indisponible. Vous devez créer une partition distincte pour Docker.
Contrôle
sudo mountpoint -- "$(docker info -f '{{ .DockerRootDir }}')"
/var/lib/docker is not a mountpoint
Remède
Lors de la création du serveur, veillez bien à créer une partition distincte de
taille suffisante pour le point de montage /var/lib/docker
. Si c'est déjà
installé, stoppez Docker, renommer le dossier existant, créer la partition et la
monter. Ensuite déplacer les données de l'ancien répertoire dans le nouveau.
Un exemple avec un second disque vide que je viens de créer sur ma VM :
lsblk -l | grep disk
sda 8:0 0 129G 0 disk
sdb 8:16 0 25G 0 disk
docker system prune -f --volumes
sudo systemctl stop docker
sudo mv /var/lib/docker /var/lib/docker.old
sudo pvcreate /dev/sdb
sudo vgcreate docker /dev/sdb
sudo lvcreate --size 20G docker
sudo mkfs.ext4 /dev/docker/lvol0
sudo mv /var/lib/docker /var/lib/docker.old
sudo mkdir -p /var/lib/docker
sudo mount -t ext4 /dev/docker/lvol0 /var/lib/docker errors=remount-ro
echo '/dev/docker/lvol0 /var/lib/docker ext4 errors=remount-ro 0 1' | sudo tee -a /etc/fstab
sudo mv /var/lib/docker.old/* /var/lib/docker
sudo rm -f /var/lib/docker.old
sudo systemctl start docker
df -h /var/lib/docker
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/docker-lvol0 20G 5.4G 14G 29% /var/lib/docker
Désactiver les communications entre conteneur
Il est possible de couper les communications entre les conteneurs qui va isoler
tous les conteneurs par défaut. Si des conteneurs doivent communiquer entre eux,
il faudra l'indiquer explicitement avec l'option --link
de docker ou le paramètre
link
d'un docker compose.
Contrôle
Il suffit de lancer cette commande :
docker network ls --quiet | xargs docker network inspect --format '{{ .Name }}: {{ .Options }}' |grep enable_icc:true
bridge: map[com.docker.network.bridge.default_bridge:true com.docker.network.bridge.enable_icc:true com.docker.network.bridge.enable_ip_masquerade:true com.docker.network.bridge.host_binding_ipv4:0.0.0.0 com.docker.network.bridge.name:docker0 com.docker.network.driver.mtu:1500]
Si ça retourne une ligne, c'est que les communications entre conteneurs sont activées.
Remède
Il suffit d'éditer le fichier /etc/docker/daemon.json
et d'y ajouter "icc": false
.
cat /etc/docker/daemon.json
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
}
}
sudo vi /etc/docker/daemon.json
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
},
"icc": false
}
sudo systemctl restart docker
Activer le support des user namespace
Vu dans mon précédent billet. Les user namespaces permettent de mapper un user du conteneur vers un utilisateur différent sur la machine hôte. Concrètement, à l'intérieur le conteneur pense être root, mais en fait sur la machine hôte l'utilisateur n'est en fait qu'un utilisateur lambda aux droits limités.
Contrôle
Il suffit de contrôler que le user dockremap existe sur le système :
sudo id dockremap
Si aucune ligne n'est retournée, c'est que ce n'est pas activé.
Remède
Il suffit d'éditer le fichier /etc/docker/daemon.json
et d'y ajouter "userns-remap": default
.
cat /etc/docker/daemon.json
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
}
"icc": false
}
sudo vi /etc/docker/daemon.json
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
},
"icc": false,
"userns-remap": "default"
}
sudo systemctl restart docker
sudo id dockremap
uid=973(dockremap) gid=971(dockremap) groups=971(dockremap)
Vous pouvez aussi mettre votre username au lieu de default, cela évitera les pb de montage de volumes.
Avant de faire cette opération mettre à blanc Docker.
sudo docker system prune -f -a
. Sinon vous atteindrez rapidement la limite de
votre espace disque sur /var/lib/docker
! Le test de point de montage va
échouer, car docker va créer un répertoire dans /var/lib/docker
.
Mais ce n'est pas grave puisque que le répertoire est bien séparé.
Activation du live restore
Cette option permet à vos conteneurs de continuer à fonctionner même si vous arrêtez le daemon Docker. Cool ça
Activation
Comme précédemment :
cat /etc/docker/daemon.json
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
}
"icc": false,
"userns-remap": "default"
}
sudo vi /etc/docker/daemon.json
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
},
"icc": false,
"userns-remap": "default",
"live-restore": true
}
sudo systemctl restart docker
Désactiver l'élévation de privilège
Docker possède un mécanisme permettant d'empêcher aux processus fonctionnant à l'intérieur du conteneur d'obtenir de nouveaux privilèges. Cette option n'est pas activée par défaut!
Activation
Comme précédemment :
cat /etc/docker/daemon.json
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
}
"icc": false,
"userns-remap": "default",
"live-restore": true
}
sudo vi /etc/docker/daemon.json
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
},
"icc": false,
"userns-remap": "default",
"live-restore": true,
"no-new-privileges": true
}
sudo systemctl restart docker
Activation de l'audit sur les fichiers et répertoires Docker
Je vous conseille d'activer l’audit au niveau du système sur les principaux répertoires Docker. L’audit enregistre toutes les opérations qui affectent les fichiers et répertoires surveillés.
Activation
Il suffit d'ajouter ces lignes au fichier /etc/audit/rules.d/audit.rules
.
cat <<EOF | sudo tee -a /etc/audit/rules.d/audit.rules
-w /usr/bin/dockerd -k docker
-w /etc/docker -p rwxa -k docker
-w /etc/default/docker -p rwxa -k docker
-w /etc/docker/daemon.json -p rwxa -k docker
-w /var/lib/docker -p rwxa -k docker
-w /usr/lib/systemd/system/docker.service -p rwxa -k docker
-w /usr/lib/systemd/system/docker.socket -p rwxa -k docker
-w /usr/bin/docker-runc -p rwxa -k docker
-w /usr/bin/docker-containerd -p rwxa -k docker
-w /usr/bin/containerd -p rwxa -k docker
EOF
sudo /sbin/service auditd restart
Désactivation du userland proxy
Alors là attention, j'ai déjà eu des soucis en désactivant cette fonctionnalité. Donc, je ne la documente pas volontairement.
Source Projet Atomic