Sudo
| Fiche express | |
|---|---|
| Domaine | Élévation de privilèges |
| Fichiers | /etc/sudoers, /etc/sudoers.d/*
|
| Commandes | sudo, visudo
|
| Contexte | Linux (toutes distributions) — délégation contrôlée de droits root |
| Voir aussi | PAM (authentification du service sudo) |
sudo (substitute user do) permet d'exécuter une commande avec les privilèges d'un autre utilisateur — le plus souvent root — sans partager le mot de passe de ce compte. Les autorisations sont décrites dans /etc/sudoers (et les fichiers inclus sous /etc/sudoers.d/), ce qui permet d'accorder des droits fins et auditables plutôt qu'un accès root complet et anonyme.
Vérifier ses droits
sudo -l # liste les commandes autorisées en sudo pour l'utilisateur courant
Obtenir un shell root
sudo -s # ouvre un shell root en conservant l'environnement de l'utilisateur courant
sudo -i # ouvre un shell root de connexion (environnement root complet, comme un login direct)
sudo -s dépanne notamment quand le mot de passe root a été perdu : tant qu'un compte dispose des droits sudo, il peut ouvrir un shell root sans jamais saisir le mot de passe de root lui-même. Si aucun compte n'a de droits sudo, il faut redémarrer la machine en mode single/rescue pour réinitialiser le mot de passe root directement.
Éditer /etc/sudoers
Ne jamais éditer /etc/sudoers avec un éditeur classique : visudo verrouille le fichier contre les écritures concurrentes et valide la syntaxe avant d'enregistrer, ce qui évite de se retrouver avec un fichier corrompu et plus aucun moyen d'obtenir les droits root pour le corriger.
sudo visudo
Pour choisir l'éditeur utilisé par visudo (ici vi) :
export EDITOR=/usr/bin/vi
Syntaxe du fichier sudoers
Ligne simple : autoriser un compte à lancer une liste de commandes précises, sans mot de passe.
confmach ALL=(ALL) NOPASSWD: /sbin/fdisk -l, /usr/sbin/dmidecode, /usr/sbin/vgdisplay, /bin/df, /bin/cat
Alias : pour un jeu de règles réutilisable, on peut nommer des groupes d'utilisateurs, de comptes cibles et de commandes.
User_Alias UTILISATEURS_HABILITES = user1, user3
Runas_Alias EXEC_EN_TANT_QUE = user2
Cmnd_Alias COMMANDES_AUTORISEES = /bin/ls, /bin/cat
UTILISATEURS_HABILITES ALL=(EXEC_EN_TANT_QUE) NOPASSWD: COMMANDES_AUTORISEES
Cette règle autorise user1 et user3 à exécuter /bin/ls et /bin/cat en tant que user2 (et non root), sans avoir à saisir de mot de passe. À l'usage :
sudo -u user2 /bin/cat /home/user1/.bashrc
Accès administratif complet à un utilisateur ou un groupe :
UserName ALL=(ALL) ALL
%GroupName ALL=(ALL) ALL
Autoriser une seule commande précise, y compris ses arguments :
UserName localhost=/usr/sbin/shutdown -r now
Durée de validité du mot de passe saisi (timestamp) : par défaut sudo ne redemande pas le mot de passe pendant quelques minutes après une saisie réussie.
Defaults timestamp_timeout=1 # ne redemande pas le mot de passe pendant 1 minute
Defaults timestamp_timeout=0 # redemande le mot de passe à chaque commande
Points de sécurité à auditer
Une revue de /etc/sudoers (et de /etc/sudoers.d/) doit vérifier :
- les permissions excessives — une règle trop large permet un usage détourné (accès à des fichiers ou commandes hors du périmètre prévu) ;
- les chemins non sécurisés dans les commandes autorisées — un chemin relatif ou modifiable par l'utilisateur permet de substituer le binaire réellement exécuté ;
- les directives
#includedir/#include— les fichiers qu'elles chargent doivent être aussi bien protégés que/etc/sudoerslui-même, sinon ils offrent un contournement ; - les
Cmnd_Aliaspersonnalisés — vérifier que les commandes autorisées ne permettent pas d'obtenir indirectement un shell root ou d'éditer des fichiers sensibles ; - les journaux système —
sudojournalise chaque invocation (par défaut via syslog/journald), à surveiller pour détecter un usage anormal ; - l'intention métier de chaque règle — une règle doit correspondre à un besoin identifié, pas à une facilité accordée « au cas où ».