5.1 KiB
5.1 KiB
ansible-docker
Installation de Docker Engine et du plugin Docker Compose depuis le dépôt officiel Docker, puis durcissement de l'hôte, sur Debian 12/13 et Ubuntu 22.04/24.04.
Gitea valide le code, Semaphore l'exécute (branche valide) : voir CICD.md.
Arborescence
ansible-docker/
├── ansible.cfg
├── site.yml # playbook unique (groupe d'inventaire « docker »)
├── collections/requirements.yml # ansible.posix
├── inventory/hosts.yml
├── group_vars/all/main.yml # valeurs du lab (DNS, réseaux autorisés)
├── roles/
│ ├── docker_install/ # dépôt officiel, clé vérifiée, paquets, services
│ └── docker_hardening/ # daemon.json, groupe docker, DOCKER-USER, auditd, contrôles
└── .gitea/workflows/ansible-lint.yml
Aucun secret n'est nécessaire : pas de vault.yml dans ce projet.
Ce que fait chaque rôle
docker_install
- refuse toute distribution non prise en charge ;
- retire les paquets en conflit (
docker.io,containerd,runc,podman-docker…, ainsi que les homonymesdocker/wmdocker, un dock pour gestionnaire de fenêtres) ; - télécharge la clé du dépôt Docker et vérifie son empreinte avant de déclarer le dépôt
(format deb822,
/etc/apt/sources.list.d/docker.sources, l'anciendocker.listest retiré) ; - installe
docker-ce,docker-ce-cli,containerd.io,docker-buildx-plugin,docker-compose-plugin, sans paquets recommandés (pas dedocker-ce-rootless-extras) ; - fige la version si
docker_install_versionest renseignée.
docker_hardening
| Mesure | Détail |
|---|---|
daemon.json |
icc: false, no-new-privileges, live-restore, userland-proxy: false, rotation des journaux, experimental: false, validé par dockerd --validate avant écriture |
| Liaison par défaut | ip: 127.0.0.1 : un -p 8080:80 n'expose plus rien au réseau |
Groupe docker |
réduit à docker_hardening_group_members (vide par défaut) : tout autre membre est retiré |
| Ports publiés | chaîne DOCKER-USER (IPv4 et IPv6) : seules les sources autorisées et les ports déclarés publics passent |
| Audit | règles auditd sur les binaires, la configuration et les unités Docker/containerd |
| Routage | net.ipv4.ip_forward=1 posé en dernier (99-zz-docker.conf) |
| Contrôle final | seccomp, AppArmor, no-new-privileges, live-restore, socket 0660 root:docker, aucune API sur 2375/2376 |
Variables à connaître
| Variable | Défaut | Rôle |
|---|---|---|
docker_install_version |
"" |
version d'Engine à installer et figer (ex. 29.1.5) |
docker_hardening_default_bind_ip |
127.0.0.1 |
IP de publication quand le compose n'en précise pas |
docker_hardening_firewall_allowed_sources |
10.0.4.0/24, 10.0.5.0/24 |
sources autorisées sur tous les ports publiés |
docker_hardening_firewall_public_ports |
[] |
ports ouverts à toute source, ex. { port: 443, proto: tcp } |
docker_hardening_firewall_interfaces |
interface de la route par défaut | interfaces d'entrée filtrées |
docker_hardening_group_members |
[] |
comptes autorisés dans le groupe docker |
docker_hardening_dns |
10.0.4.2 |
résolveurs transmis aux conteneurs |
docker_hardening_default_address_pools |
[] |
plages des réseaux Docker |
docker_hardening_userns_remap |
"" |
remappage des UID, à décider avant tout déploiement de conteneurs |
docker_hardening_audit_watch_data_root |
false |
audit de /var/lib/docker (très verbeux) |
La liste complète et commentée est dans roles/*/defaults/main.yml.
Points d'attention
- Publication des ports : avec
ip: 127.0.0.1, un service à ouvrir au réseau doit être publié explicitement dans son compose, par exemple"0.0.0.0:443:443"pour Traefik, puis déclaré dansdocker_hardening_firewall_public_portss'il doit être joignable hors des réseaux autorisés. no-new-privileges: les images qui s'appuient sursudo/suou un binaire setuid à l'intérieur du conteneur échouent. Le lever pour un seul service :security_opt: ["no-new-privileges:false"].- Redémarrage du démon : un changement de
daemon.jsonredémarre Docker. Grâce àlive-restore, les conteneurs continuent de tourner, mais les options réseau (icc, plages d'adresses…) ne s'appliquent qu'aux réseaux et conteneurs recréés. - Pare-feu de l'hôte : si un autre rôle (par exemple le durcissement Linux) gère nftables,
sa configuration ne doit pas contenir
flush rulesetni une politiquedropsur la chaîneforward: elle effacerait ou bloquerait les règles de Docker. - auditd immuable : si une autre configuration pose
-e 2,augenrules --loadéchoue jusqu'au prochain redémarrage.
Exécution (Semaphore)
Modèle de tâche sur site.yml, inventaire inventory/hosts.yml. Premier passage conseillé en
--check --diff : sur un hôte vierge, le rôle de durcissement s'arrête proprement après
l'installation simulée, puisque Docker n'existe pas encore.
Tags : docker_install, docker_hardening.