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

- 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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn