
community.general.sudoers: génère des fichiers dans /etc/sudoers.d/ avec validation visudo -cf automatique. C’est le module de référence pour les droits sudo en Ansible — bien plus sûr qu’un lineinfile: sur /etc/sudoers (un fichier mal formé verrouille sudo pour tous les utilisateurs).
Ce module appartient à la collection community.general (pas builtin). Sur Ansible Core 2.20, l’installer via ansible-galaxy collection install community.general.
Options principales : name: (filename dans /etc/sudoers.d/), user: ou group:, commands:, nopassword:, state:, runas:, validation:.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Pourquoi ne jamais modifier
/etc/sudoersdirectement. - Créer une règle sudo simple avec validation automatique.
- Limiter l’accès à des commandes précises (principe de moindre privilège).
- Distinguer sudo avec password (défaut) de
nopassword: true. - Cibler un groupe (préfixe
%en syntaxe sudoers). - Forcer un
runas:différent de root.
Prérequis
Section intitulée « Prérequis »- Avoir
community.generalinstallé :ansible-galaxy collection install community.general. - Comprendre la syntaxe sudoers de base (
user host=(runas) commands).
Pourquoi pas lineinfile: sur /etc/sudoers ?
Section intitulée « Pourquoi pas lineinfile: sur /etc/sudoers ? »# ❌ TRES DANGEREUX- ansible.builtin.lineinfile: path: /etc/sudoers line: "alice ALL=(ALL) NOPASSWD:ALL"Risques :
- Si la ligne est mal formée (typo, syntaxe non standard),
/etc/sudoersdevient invalide. sudorefuse alors de fonctionner — personne ne peut élever ses droits.- Sur un serveur en production, vous êtes bloqué : impossible de revenir en arrière sans accès console physique ou IPMI.
Avec community.general.sudoers:, la validation visudo -cf %s est automatique et obligatoire — un fichier invalide n’est jamais déposé.
Création d’une règle simple
Section intitulée « Création d’une règle simple »- name: Sudo complet pour alice (avec password) community.general.sudoers: name: lab-alice user: alice commands: ALL nopassword: false # Defaut: true depuis community.general 11+ ! state: presentLe module crée /etc/sudoers.d/lab-alice avec :
- Permissions
0440(lecture root uniquement + groupe root). - Validation visudo automatique avant le dépôt.
- Contenu :
alice ALL=(ALL) ALL(avec password requis).
Sudo sans password (nopassword: true)
Section intitulée « Sudo sans password (nopassword: true) »- name: Compte CI sans password community.general.sudoers: name: lab-ci-bot user: ci-bot commands: ALL nopassword: true state: presentGénère : ci-bot ALL=(ALL) NOPASSWD:ALL.
Cas légitimes :
- Compte ansible sur un managed node (NOPASSWD pour tous les modules).
- Compte CI/CD qui doit lancer des commandes sans interaction.
Cas dangereux : utilisateurs humains — un attaquant qui prend le compte a root immédiatement. À éviter sauf raison technique précise.
Moindre privilège : limiter aux commandes nécessaires
Section intitulée « Moindre privilège : limiter aux commandes nécessaires »- name: Alice peut redemarrer chronyd uniquement community.general.sudoers: name: lab-alice-chronyd user: alice commands: - /usr/bin/systemctl restart chronyd - /usr/bin/systemctl status chronyd nopassword: true state: presentAlice peut uniquement lancer ces 2 commandes en sudo. sudo systemctl restart sshd → refusé. C’est le pattern moindre privilège standard.
Combiné avec un user dédié + clés SSH restreintes (authorized_key), un développeur peut uniquement redémarrer son service sans accès root complet.
Règles sur un groupe (préfixe %)
Section intitulée « Règles sur un groupe (préfixe %) »- name: Tous les membres de ops-team ont sudo community.general.sudoers: name: lab-ops-team group: ops-team # Au lieu de "user:" commands: ALL state: presentGénère : %ops-team ALL=(ALL) ALL. Le préfixe % désigne un groupe en syntaxe sudoers.
Avantage : ajouter un nouveau membre = usermod -aG ops-team carl → automatiquement sudoer. Pas besoin de modifier le fichier sudoers.
runas: (exécuter en tant que…)
Section intitulée « runas: (exécuter en tant que…) »Par défaut, sudo exécute en tant que root. runas: force un autre utilisateur cible.
- name: Alice peut runner comme deploy uniquement community.general.sudoers: name: lab-alice-as-deploy user: alice runas: deploy commands: /opt/myapp/bin/deploy.sh nopassword: true state: presentGénère : alice ALL=(deploy) NOPASSWD:/opt/myapp/bin/deploy.sh.
Alice peut faire sudo -u deploy /opt/myapp/bin/deploy.sh — mais pas sudo /opt/myapp/bin/deploy.sh (qui tenterait root → refusé).
Cas d’usage : un opérateur peut redémarrer une app sous le user applicatif sans escalade root.
Suppression
Section intitulée « Suppression »- name: Revoquer les droits sudo de bob community.general.sudoers: name: lab-bob state: absentLe fichier /etc/sudoers.d/lab-bob est supprimé. Bob n’a plus de droits sudo (issus de cette règle — d’autres règles dans /etc/sudoers.d/* ne sont pas affectées).
Le piège : validation: absent
Section intitulée « Le piège : validation: absent »# ❌ DANGER- community.general.sudoers: name: lab-broken user: alice commands: "INVALID SYNTAX !@#$" validation: absent # Desactive visudo -cfAvec validation: absent, le module ne valide pas la syntaxe. Le fichier est déposé tel quel. Si la syntaxe est invalide, sudo se casse globalement (refuse de lire /etc/sudoers.d/*).
Règle absolue : ne jamais désactiver validation:. La validation est gratuite (quelques ms) et empêche des incidents critiques.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
| Sudo cassé partout après deploy | lineinfile: sur /etc/sudoers ou validation: absent | Toujours community.general.sudoers: avec validation |
Tous les sudoers sont NOPASSWD: | Défaut nopassword: true depuis 11.0 | Explicite nopassword: false quand password attendu |
Permissions du fichier 0644 → sudo refuse | community.general.sudoers: pose 0440 automatiquement | Si fichier corrompu, supprimer et recréer via le module |
no module named community.general.sudoers | Collection non installée | ansible-galaxy collection install community.general |
Audit et bonnes pratiques
Section intitulée « Audit et bonnes pratiques »/etc/sudoers.d/vs/etc/sudoers: isoler chaque règle dans un fichier dédié facilite l’audit, le rollback et la revue.- Logs sudo :
journalctl -u sudo(ou/var/log/securesur RHEL) tracent toutes les invocations. - Audit complet :
Defaults log_input,log_outputdans un fichier/etc/sudoers.d/auditpour logger les sessions complètes. - Convention naming : préfixer le
name:par le rôle ou l’équipe (hr-team-readonly,ops-team-full) pour faciliter le tri.
À retenir
Section intitulée « À retenir »- Module
community.general.sudoers:(pas builtin — collection requise). - Validation
visudo -cfautomatique — toujours laisser activée. - Défaut surprenant :
nopassword: truedepuis community.general 11. - Permissions
0440posées automatiquement. commands:pour le moindre privilège (commandes spécifiques uniquement).group:+ préfixe%pour des règles sur un groupe.runas:pour exécuter en tant qu’un autre user (pas root par défaut).- Ne jamais modifier
/etc/sudoersdirectement — toujours/etc/sudoers.d/*.
Pratiquer dans le lab
Section intitulée « Pratiquer dans le lab »Cette page a un lab d’accompagnement : labs/modules-utilisateurs/sudoers/ dans stephrobert/ansible-training.
Challenge — sur db1.lab :
- Créer 3 règles : alice (sudo avec password), ops-team (sudo NOPASSWD), alice can run as deploy (commande spécifique).
- Vérifier la validation globale
visudo -cf /etc/sudoers.
Validation pytest+testinfra :
ansible-playbook solution.ymlpytest -v labs/modules-utilisateurs/sudoers/challenge/tests/7 tests vérifient permissions, contenu de chaque règle, et validation globale.