Sudoers

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Syntaxe du fichier de configuration sudo
Fichiers /etc/sudoers, /etc/sudoers.d/*
Commande visudo
Contexte Linux (toutes distributions)
Voir aussi Sudo (usage de la commande, audit de sécurité)

/etc/sudoers est le fichier qui décrit toutes les règles de délégation de privilèges lues par sudo. Il ne se modifie jamais avec un éditeur classique mais uniquement via visudo, qui verrouille le fichier et valide sa syntaxe avant d'enregistrer (voir Sudo pour les détails d'édition et les bonnes pratiques d'audit). Cette page décrit la grammaire du fichier lui-même : anatomie d'une règle, alias, tags et directives.

Anatomie d'une règle

Une règle sudoers suit toujours la même structure :

qui   hôtes = (en tant que utilisateur:groupe)   tags:   commande1, commande2
  • qui — un nom d'utilisateur, un %groupe, ou un alias (User_Alias) ;
  • hôtes — la ou les machines sur lesquelles la règle s'applique (ALL le plus souvent, ou un Host_Alias) ;
  • (en tant que) — l'utilisateur et/ou le groupe cible autorisé via -u/-g ; omis, il vaut (root) ;
  • tags — modificateurs de comportement comme NOPASSWD (voir plus bas) ;
  • commande(s) — chemin absolu vers le ou les binaires autorisés, séparés par des virgules, ou un Cmnd_Alias.

Les quatre types d'alias

Les alias permettent de nommer des groupes réutilisables plutôt que de répéter des listes dans chaque règle :

User_Alias   EQUIPE_OPS       = alice, bob
Host_Alias   SERVEURS_WEB     = web1, web2, 10.0.0.0/24
Runas_Alias  COMPTES_SERVICE  = www-data, deploy
Cmnd_Alias   GESTION_SERVICES = /bin/systemctl restart nginx, /bin/systemctl restart php-fpm

EQUIPE_OPS SERVEURS_WEB = (COMPTES_SERVICE) NOPASSWD: GESTION_SERVICES

Cette règle autorise alice et bob, uniquement sur les hôtes du groupe SERVEURS_WEB, à exécuter les commandes de GESTION_SERVICES en tant que www-data ou deploy, sans mot de passe.

Groupes système : %groupe

Plutôt qu'un alias, on peut cibler directement un groupe Unix avec le préfixe % :

%wheel  ALL=(ALL)       NOPASSWD: ALL
%admin  ALL=(ALL)       NOPASSWD: /usr/bin/apt-get
%deploy ALL=(root)      NOPASSWD: ALL

Tout membre du groupe hérite alors de la règle, sans qu'il soit besoin de lister les comptes un par un.

Tags de règle

Les tags se placent avant la liste de commandes et modifient le comportement de la règle :

  • NOPASSWD / PASSWD — dispense ou exige le mot de passe (par défaut, un mot de passe est demandé) ;
  • NOEXEC — empêche la commande autorisée de lancer un sous-processus non contrôlé (utile pour bloquer les échappements shell de certains éditeurs ou pagers) ;
  • SETENV / NOSETENV — autorise ou interdit à l'utilisateur de conserver ses variables d'environnement via sudo -E.

Un tag reste actif pour toutes les commandes qui suivent jusqu'au prochain tag de même catégorie :

alice ALL=(ALL) NOPASSWD: /bin/systemctl status nginx, PASSWD: /bin/systemctl restart nginx

Ici, consulter le statut ne demande pas de mot de passe, mais redémarrer le service en redemande un.

Exclure des commandes avec !

Le préfixe ! retire une commande d'un alias ou d'une portée ALL — utile pour autoriser « presque tout » sauf un point précis :

Cmnd_Alias SANS_SHELL = ALL, !/bin/bash, !/bin/sh, !/usr/bin/su
alice ALL=(ALL) SANS_SHELL

⚠️ Cette négation est fragile : un binaire équivalent non listé (ex. python3 -c "import os; os.system('/bin/sh')") contourne facilement la restriction. Elle ne doit jamais être le seul rempart contre une élévation non désirée.

Restreindre à un hôte précis

Une règle sudoers s'applique par défaut à tous les hôtes qui partagent le même fichier (cas des déploiements centralisés type LDAP/NIS) ; pour limiter une règle à une machine nommée :

alice web1 = (ALL) /sbin/reboot, /sbin/poweroff, /sbin/shutdown

Sur un fichier /etc/sudoers purement local, cette distinction hôte n'a d'effet que si le nom déclaré correspond à celui résolu par hostname.

Directives Defaults

Defaults ajuste le comportement global de sudo, ou celui d'un utilisateur précis avec Defaults:utilisateur :

Defaults          requiretty          # exige un terminal interactif (à commenter pour l'usage en cron/script)
Defaults:deploy   !authenticate       # ne redemande jamais de mot de passe à ce compte
Defaults          secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

secure_path ignore volontairement le $PATH de l'utilisateur appelant : sans le chemin complet, une commande autorisée par alias ou par nom simple (ex. fdisk au lieu de /sbin/fdisk) peut échouer si son répertoire n'y figure pas.

Fichiers additionnels : /etc/sudoers.d

Plutôt que d'alourdir /etc/sudoers lui-même, la directive #includedir (présente par défaut sur la plupart des distributions) charge tout fichier du répertoire /etc/sudoers.d/ :

#includedir /etc/sudoers.d
cat /etc/sudoers.d/deploy
# %deploy ALL=(root) NOPASSWD: ALL

Contraintes de nommage à respecter dans ce répertoire : pas de point (.) dans le nom de fichier, pas de ~ final, pas de # en tête — sudo ignore silencieusement les fichiers qui ne les respectent pas (utile à savoir quand une règle déposée dans sudoers.d semble « ne pas prendre »).

Vérifier la syntaxe sans ouvrir visudo

visudo -c                              # vérifie /etc/sudoers et les fichiers inclus
visudo -cf /etc/sudoers.d/deploy       # vérifie un fichier précis, sans le charger

Voir aussi

  • Sudo — usage de la commande sudo, édition sécurisée avec visudo, points de sécurité à auditer