Aller au contenu
Infrastructure as Code medium

Module sudoers Ansible : gérer les droits sudo de façon sûre

10 min de lecture

Logo Ansible

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:.

  • Pourquoi ne jamais modifier /etc/sudoers directement.
  • 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.
  • Avoir community.general installé : ansible-galaxy collection install community.general.
  • Comprendre la syntaxe sudoers de base (user host=(runas) commands).
# ❌ 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/sudoers devient invalide.
  • sudo refuse 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é.

- 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: present

Le 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).
- name: Compte CI sans password
community.general.sudoers:
name: lab-ci-bot
user: ci-bot
commands: ALL
nopassword: true
state: present

Gé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: present

Alice peut uniquement lancer ces 2 commandes en sudo. sudo systemctl restart sshdrefusé. 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.

- 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: present

Gé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.

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: present

Génère : alice ALL=(deploy) NOPASSWD:/opt/myapp/bin/deploy.sh.

Alice peut faire sudo -u deploy /opt/myapp/bin/deploy.shmais 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.

- name: Revoquer les droits sudo de bob
community.general.sudoers:
name: lab-bob
state: absent

Le 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).

# ❌ DANGER
- community.general.sudoers:
name: lab-broken
user: alice
commands: "INVALID SYNTAX !@#$"
validation: absent # Desactive visudo -cf

Avec 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.

SymptômeCauseFix
Sudo cassé partout après deploylineinfile: sur /etc/sudoers ou validation: absentToujours community.general.sudoers: avec validation
Tous les sudoers sont NOPASSWD:Défaut nopassword: true depuis 11.0Explicite nopassword: false quand password attendu
Permissions du fichier 0644 → sudo refusecommunity.general.sudoers: pose 0440 automatiquementSi fichier corrompu, supprimer et recréer via le module
no module named community.general.sudoersCollection non installéeansible-galaxy collection install community.general
  • /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/secure sur RHEL) tracent toutes les invocations.
  • Audit complet : Defaults log_input,log_output dans un fichier /etc/sudoers.d/audit pour 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.
  • Module community.general.sudoers: (pas builtin — collection requise).
  • Validation visudo -cf automatique — toujours laisser activée.
  • Défaut surprenant : nopassword: true depuis community.general 11.
  • Permissions 0440 posé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/sudoers directement — toujours /etc/sudoers.d/*.

Cette page a un lab d’accompagnement : labs/modules-utilisateurs/sudoers/ dans stephrobert/ansible-training.

Challenge — sur db1.lab :

  1. Créer 3 règles : alice (sudo avec password), ops-team (sudo NOPASSWD), alice can run as deploy (commande spécifique).
  2. Vérifier la validation globale visudo -cf /etc/sudoers.

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook solution.yml
pytest -v labs/modules-utilisateurs/sudoers/challenge/tests/

7 tests vérifient permissions, contenu de chaque règle, et validation globale.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn