Installation
src:
Installation du dépôt Docker
Installet les pacquet permettant à apt d’utiliser des dépôts en HTTPS :
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
Ajouter les clés GPG officiels de Docker :
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Mettre en place le dépôt :
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Installation de Docker Engine
Installation des paquets Docker Engine, containerd et Docker Compose :
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Vérifier que DockerEngine et Docker Copose sont bien installés :
sudo docker run hello-world
sudo docker compose version
Sécuriser son hôte Docker avec Docker Bench Security
src :
- https://www.grottedubarbu.fr/securiser-installation-hote-docker/
- https://www.grottedubarbu.fr/securiser-daemon-docker/
- https://github.com/docker/docker-bench-security
- https://www.digitalocean.com/community/tutorials/how-to-audit-docker-host-security-with-docker-bench-for-security-on-ubuntu-16-04
Installation de Docker Bench Security
Cloner le dépôt git :
git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
Lancer l’utilitaire :
sudo ./docker-bench-security.sh
Le retour est composé d’éléments INFO, NOTE, PASS et WARN. Les WARN sont les plus critiques et sont à corriger en premier.
Correction des Warnings
1.1.1 - Ensure a separate partition for containers has been created (Automated)
src :
- https://contabo.com/blog/changing-the-partition-layout-of-your-vps-after-os-installation/#h-customize-the-partition-layout
- https://contabo.com/blog/vnc-connect-vps/
- https://www.tecmint.com/parted-command-to-create-resize-rescue-linux-disk-partitions/
- https://www.malekal.com/reparer-debian-mode-rescue-recuperation/
- https://www.addictivetips.com/ubuntu-linux-tips/add-items-to-the-fstab-file-in-linux/
Il faut créer une partition dédié pour docker afin de monter le dossier /var/lib/docker dans cette partition.
Avant de commencer, il peut être utilise de faire une sauvegarde de vos données, une modification de partition peut entrainer une perte de donnée définitive.
Via interface graphique (GParted)
Tout d’abord, redémarrer le serveur en mode récupération. Dans l’interface de contrôle du fournisseur de VPS, utiliser le bouton dédié au redémarrage en mode récupération et définir le mot de passe root de maintenance. Se connecter au VPS via VNC avec l’adresse et les identifiants transmis par le fournisseur. Ensuite, saisir le mot de passe root pour la maintenance. Lancer l’interface graphique:
startxfce4
Et accéder à l’application GParted. Une fois GParted lancé, sélectionner la partition à réduire. Puis faire un clique droit desssus et sélectionner “Resize/move”.
Dans la nouvelle fenêtre qui apparaît, spécifier la taille voulue pour la partition. Pour confirmer le nouveau dimensionnement, cliquer sur “Resize/move”. Maintenant, sélectionner la nouvelle partition vide et cliquer droit dessus pour sélectionner “New” afin de créer une nouvelle partition. Comme précedemment, saisisser la taille voulue pour la partition.
Une fois fait, il faut appliquer les changement en clicant sur le bouton de validation vert, et confirmer avec “Apply”. Attender que les modifications s’appliquent, puis redémarrer le serveur.
Via commande (Parted)
Tout d’abord, connecter vous au VPS à partir du protocol VNC pour redémarrer le serveur en mode récupération.
Redémarrer le serveur et lors de l’apparition de l’interface grub, sélectionner option avancées pour Debian GNU/Linux au lieu de Debian GNU/Linux.
Dans ce nouveau menu, sélectionner Debian GNU/Linux [...] (recovery mode)
Ensuite, saisir le mot de passe root pour la maintenance.
Si Parted n’est pas installer :
sudo apt parted
Lancer Parted :
sudo parted
Une session en ligne ce commande se créer, reconnaissable avec le début de ligne (parted).
Les commandes suivantes sont saisi dans cette session.
Lister les partition du système :
print
Si il y a plusieurs disque de stockage sur le système, il faut sélectionner le disque sur lequel la partition est à modifier se situe :
select /dev/sdX
Où ‘X’ est la lettre du disque (sda, sdb, sdc, …)
Changer la taille de la partition :
resizepart <numero_partition> <fin>
Par exemple, avec les partitions suivantes :
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB primary bios_grub
2 2097kB 2147MB 2145MB ext4 primary
3 2147MB 216GB 214GB ext4 primary
4 216GB 429GB 214GB ext4
Pour réduire la dernière partition :
resizepart 4 400
Il restera un espace vide de 29Gb.
Créer une partition :
mkpart <partition_type> <format_type> <debut> <fin>
Par exemple, pour la partition de 29Gb :
mkpart primary ext4 400 429
Pour appliquer les changement et quitter la session :
quit
Attender que les modifications s’appliquent, puis redémarrer le serveur.
Vérification
Une fois le serveur redémarré, vérifier avec la commande suivante, que les partitions sont bien comme souhaité :
sudo lsblk
Pour monter la partition au démarrage, commencer par récupérer l’UUID de la partition :
sudo blkid
Puis modifier le fichier /etc/fstab en ajoutant l’UUID récupéré et le point de montage (le dossier qui doit être sur la partition), par exemple:
# /var/lib/docker was on /dev/sda4 after installation
UUID=d******4-6**h-2**0-5**2-9**********1 /var/lib/docker ext4 defaults 0 3
Le dernier numéro indique au noyau la priorité ou la séquence de vérification du système de fichiers. Dans le cas ci-dessus, cela indique que ça sera la 3ème partition monté au démarrage.
Redémarrer le serveur et vérifier que la partition est bien monté :
sudo reboot
df -h
La partition avec le point de montage devrait apparaître.
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.2 - Ensure only trusted users are allowed to control Docker daemon (Automated)
Src:
Afficher les membres du group docker :
getent group docker
Si un utilisateur autre que docker est affiché, retiré le :
gpasswd -d <username> docker
1.1.3 - Ensure auditing is configured for the Docker daemon (Automated)
Si ce n’est pas fait, installer le service auditd:
sudo apt update && sudo apt install auditd
Vérifier si une règle auditd existe pour docker :
sudo auditctl -l | grep /usr/bin/dockerd
Si ce n’est pas le cas, ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /usr/bin/dockerd -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.4 - Ensure auditing is configured for Docker files and directories -/run/containerd (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-a exit,always -F path=/run/containerd -F perm=war -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.5 - Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-a exit,always -F path=/var/lib/docker -F perm=war -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.6 - Ensure auditing is configured for Docker files and directories - /etc/docker (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /etc/docker -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.7 - Ensure auditing is configured for Docker files and directories - docker.service (Automated)
Src :
Vérifier que le fichier docker.service existe :
systemctl show -p FragmentPath docker.service
S’il n’existe pas, la recommendation ne s’applique pas. Vérifier s’il existe une règle auditd pour docker.service :
sudo auditctl -l | grep docker.service
Si ce n’est pas le cas, ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /usr/lib/systemd/system/docker.service -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.8 - Ensure auditing is configured for Docker files and directories - containerd.sock (Automated)
Src :
Vérifier que le fichier containerd.sock existe :
systemctl show -p FragmentPath containerd.sock
S’il n’existe pas, la recommendation ne s’applique pas.
S’il existe, ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /run/containerd/containerd.sock -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.9 - Ensure auditing is configured for Docker files and directories - docker.socket (Automated)
Src :
Localiser la socket de docker :
systemctl show -p FragmentPath docker.socket
Si le fichier n’existe pas, la recommendation ne s’applique pas.
S’il existe, ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w <location_FragmentPath> -k docker
## Pour moi
-w /usr/lib/systemd/system/docker.socket -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.10 - Ensure auditing is configured for Docker files and directories - /etc/default/docker (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /etc/default/docker -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.11 - Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /etc/docker/daemon.json -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.12 - Ensure auditing is configured for Docker files and directories - /etc/containerd/config.toml (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /etc/containerd/config.toml -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.13 - Ensure auditing is configured for Docker files and directories - /etc/sysconfig/docker (Automated)
Src :
/!\ Uniquement pour les distributions basées sur CentOS et RHEL. Pour les autres (Debian, Ubuntu, etc.), ne pas appliqués, sinon auditd ne charge pas les règles suivantes /!\
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /etc/sysconfig/docker -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.14 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /usr/bin/containerd -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.15 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /usr/bin/containerd-shim -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.16 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v1 (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /usr/bin/containerd-shim-runc-v1 -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.17 - Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v2 (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /usr/bin/containerd-shim-runc-v2 -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.1.18 - Ensure auditing is configured for Docker files and directories - /usr/bin/runc (Automated)
Src :
Ajouter la ligne suivante à la fin du fichier /etc/audit/rules.d/audit.rules:
-w /usr/bin/runc -k docker
Redémarrer le service auditd :
sudo service auditd restart
Relancer DBfS pour vérifier que le WARN est maintenant PASS:
sudo ./docker-bench-security.sh
1.2.1 - Ensure the container host has been Hardened (Manual)
See Hardening in Configuration VPS
- @TODO faire l’hardening du VPS
1.2.2 - Ensure that the version of Docker is up to date (Manual)
Set up automaticly update, see configuration VPS
2.1 - Run the Docker daemon as a non-root user, if possible (Manual)
- @TODO faire le docker daemon rootless
2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored)
Src :
Créer ou modifier le fichier /etc/docker/daemon.json et ajouter le contenu suivant :
{
"icc": false,
}
2.3 - Ensure the logging level is set to ‘info’ (Scored)
Src :
Créer ou modifier le fichier /etc/docker/daemon.json et ajouter le contenu suivant :
{
"log-level": "info",
}
2.4 - Ensure Docker is allowed to make changes to iptables (Scored)
Src :
Créer ou modifier le fichier /etc/docker/daemon.json et ajouter le contenu suivant :
{
"iptables": true,
}
2.5 - Ensure insecure registries are not used (Scored)
Src :
S’assurer que le Daemon Docker n’est pas lancé avec l’option --insecure-registry.
2.6 - Ensure aufs storage driver is not used (Scored)
Src :
S’assurer que le Daemon Docker n’est pas lancé avec l’option --storage-driver aufs.
2.7 - Ensure TLS authentication for Docker daemon is configured (Scored)
Src :
Par défaut, pas besoin d’être configuré car le daemon est lié à un socket Unix non connecté au réseau. Si vous modifiez la liaison par défaut du démon Docker à un port TCP ou à tout autre socket Unix, vous devez appliquer la recommendation comme indiqué dans la documentation de Docker :
@TODO Faire la mise en place du TLS sur le daemon
2.8 - Ensure the default ulimit is configured appropriately (Manual)
Pas configuré par défaut
2.9 - Enable user namespace support (Scored)
Créer ou modifier le fichier /etc/docker/daemon.json et ajouter le contenu suivant :
{
userns-remap": "default",
}
Vérifier que l’utilisateur dockremap a bien été créé par Docker :
sudo id dockremap
2.10 - Ensure the default cgroup usage has been confirmed (Scored)
Src :
Par défaut, pas de changement nécessaire. Le daemon Docker utilise /docker pour le driver de cgroup fs et system.slice pour le driver de cgroup systemd.
2.11 - Ensure base device size is not changed until needed (Scored)
Src :
Ne pas utiliser l’option --storage-opt dm.basesize. Par défaut, la taille ded la device est ded 10 Go.
2.12 - Ensure that authorization for Docker client commands is enabled (Scored)
- @TODO Faire l’installation du plugin d’authorisation (besoin de TLS)