hcornet 603cfd5625
Ansible - controle du code / lint (push) Successful in 30s
Ansible - controle du code / promouvoir (push) Skipped
add serveur
2026-10-04 18:20:11 +02:00
2026-09-26 11:49:01 +02:00
2026-09-18 13:16:35 +02:00
2026-09-18 13:16:35 +02:00
2026-10-04 18:20:11 +02:00
2026-09-18 13:16:35 +02:00
2026-09-18 13:16:35 +02:00
2026-09-18 13:16:35 +02:00
2026-09-18 13:16:35 +02:00
2026-09-18 13:16:35 +02:00
2026-09-18 13:16:35 +02:00
2026-09-18 13:16:35 +02:00
2026-09-18 13:16:35 +02:00
2026-09-18 13:16:35 +02:00

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 homonymes docker/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'ancien docker.list est retiré) ;
  • installe docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin, docker-compose-plugin, sans paquets recommandés (pas de docker-ce-rootless-extras) ;
  • fige la version si docker_install_version est 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é dans docker_hardening_firewall_public_ports s'il doit être joignable hors des réseaux autorisés.
  • no-new-privileges : les images qui s'appuient sur sudo/su ou 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.json redé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 ruleset ni une politique drop sur la chaîne forward : 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.

S
Description
Installation de Docker Engine et Docker Compose sur Debian/Ubuntu avec durcissement de l'hôte (daemon.json, DOCKER-USER, auditd) — validé par Gitea, exécuté par Semaphore
Readme
59 KiB
0 Stars 3 Watchers 0 Forks
Languages
Jinja 100%