Guide Gentoo pour les utilisateurs de sudo
1.
À propos de sudo sous Gentoo Linux
Accorder des droits
Le paquet app-admin/sudo autorise l'administrateur à accorder aux
utilisateurs le droit d'exécuter une ou plusieurs applications qui leur sont
interdites en temps normal. Sudo est différent de l'uid. Il permet
d'affiner les droits de l'utilisateur en lui autorisant d'exécuter une commande
spécifique au moment où on le désire.
Avec sudo, vous pouvez créer une liste claire de qui peut
exécuter quoi. Si vous utilisiez l'uid, n'importe quel utilisateur pourrait
utiliser telle ou telle application (ou tout utilisateur d'un certain groupe,
en fonction des permissions accordées). Vous pouvez (vous devriez même
l'obliger) demander que l'utilisateur utilise un mot de passe pour pouvoir
exécuter l'application pour laquelle vous lui avez accordé les droits. Vous
pouvez même affiner ses droits en fonction de sa localisation : connecté
en local ou via SSH.
Traçabilité
Un autre avantage de sudo est la possibilité d'enregistrer dans un
fichier log toute tentative (réussie ou non) d'utilisation d'une application.
Cela peut être très utile si jamais vous voulez savoir qui a commis une erreur
grave qui vous a pris dix heures de votre temps à résoudre.
Configurer Sudo
La configuration de sudo est gérée par le fichier
/etc/sudoers. Ce fichier ne devrait jamais être édité avec
nano /etc/sudoers ou vim /etc/sudoers ou n'importe quel
autre éditeur. Lorsque vous voulez modifier ce fichier, vous devriez utiliser
visudo.
Cet outil assure qu'il n'y a qu'un seul administrateur en train d'éditer ce
fichier. Il préserve les permissions du fichier et vérifie la syntaxe afin de
s'assurer qu'il n'y ait pas d'erreurs graves dans le fichier.
À propos de ce guide
Ce guide n'est qu'une rapide introduction. Le paquet sudo offre des
possibilités bien plus puissantes que ce qui est décrit dans ce guide. Il offre
des outils spéciaux qui permettent d'éditer des fichiers en tant qu'utilisateur
différent (sudoedit), être exécuté à partir d'un script (il peut donc,
en arrière-plan, lire le mot de passe d'une entrée standard au lieu du clavier,
...)
Vous pouvez lire le manuel de sudo et sudoers pour plus
d'information.
2.
La syntaxe de sudoers
Syntaxe de base
La partie la plus difficile de sudo est la syntaxe du fichier
/etc/sudoers. La syntaxe de base ressemble à :
Exemple de code 2.1 : La syntaxe de base de /etc/sudoers |
utilisateur machine = commandes
|
Cette syntaxe explique à sudo que l'utilisateur qui est connecté
au travers de la machine peut exécuter n'importe quelle commande
en tant qu'utilisateur root. Prenons un exemple pour que cela soit plus
clair : on peut autoriser l'utilisateur swift à exécuter
emerge s'il est connecté en local (et non au travers d'SSH).
Exemple de code 2.2 : Exemple concret de /etc/sudoers |
swift localhost = /usr/bin/emerge
|
Un avertissement très important s'impose : n'autorisez pas
à un utilisateur lancer une application qui permet d'augmenter ses privilèges.
Par exemple, autoriser les utilisateurs à exécuter emerge en tant que
root peut en fait leur donner l'accès root total de la machine, car
emerge peut être manipulé pour modifier le système de fichiers en cours
d'exécution à l'avantage de l'utilisateur. Si vous ne faites pas confiance à
vos utilisateurs sudo, ne leur accordez aucun droit.
Le nom de l'utilisateur peut être remplacé par le nom du groupe. Dans ce cas,
vous devriez ajouter un % devant le nom du groupe. Voici comment
autoriser n'importe quel membre du groupe wheel à exécuter
emerge :
Exemple de code 2.3 : Autoriser les membres du groupe wheel à exécuter emerge |
%wheel localhost = /usr/bin/emerge
|
Vous pouvez ajouter plusieurs commandes sur la même ligne (au lieu de faire une
entrée pour chaque commande). Voici comment autoriser un utilisateur à utiliser
emerge, mais aussi ebuild et emerge-webrsync en tant que
root :
Exemple de code 2.4 : Plusieurs commandes pour un seul utilisateur |
swift localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync
|
Vous pouvez spécifier une commande au lieu de l'outil lui-même. Cela peut être
assez utile de restreindre l'utilisation d'un outil en n'autorisant que
certaines commandes précises. L'outil sudo autorise aussi l'utilisation
des méta-caractères du shell (c-à-d. pas des expressions régulières) pour les
commandes et leurs paramètres dans le fichier /etc/sudoers.
Testons un peu tout cela :
Exemple de code 2.5 : Tentative de mise à jour du système en utilisant sudo |
$ sudo emerge -uDN world
Considérons que vous avez reçu le message habituel de l'administrateur
système. Il s'arrête généralement sur ces trois points :
#1) Respecter la vie privée des autres
#2) Réfléchir aux conséquences avant de taper une commande
#3) À grand pouvoir, grande responsabilité
Mot de passe :
|
sudo requiert le mot de passe de l'utilisateur. Ceci assure qu'aucun
terminal laissé ouvert par mégarde ne puisse être utilisé par des personnes
malveillantes.
Il est bon de savoir que sudo n'altère pas la variable
${PATH} : Toute commande utilisée après sudo est traitée à
partir de votre environement. Lorsque l'utilisateur utilisera un outil
se situant dans /sbin, il devra utiliser le chemin complet comme
montré ci-dessous :
Exemple de code 2.6 : Utiliser le chemin complet d'un outil |
$ sudo /usr/sbin/emerge-webrsync
|
Utiliser les alias
Dans les environnements plus importants, entrer des utilisateurs encore et
encore (ou des machines, voire des commandes) peut être fastidieux. Pour
faciliter l'administration de /etc/sudoers, vous pouvez définir
des alias. Le format pour déclarer des alias est assez simple :
Exemple de code 2.7 : Déclarer des alias dans /etc/sudoers |
Host_Alias hostalias = hostname1, hostname2, ...
User_Alias useralias = user1, user2, ...
Cmnd_Alias cmndalias = command1, command2, ...
|
Un alias qui fonctionne toujours, à n'importe quelle position, est l'alias
ALL. Pour mieux les distinguer, on écrit les alias en majuscule. Comme
vous l'avez sûrement deviné ; l'alias ALL est un alias qui englobe
toutes les occurrences d'un paramètre.
Un exemple d'utilisation de l'alias ALL est d'autoriser n'importe
quel utilisateur à lancer la commande shutdown s'il est connecté en
local :
Exemple de code 2.8 : Autoriser n'importe quel utilisateur à exécuter shutdown |
ALL localhost = /sbin/shutdown
|
Un autre exemple est d'autoriser l'utilisateur swift à exécuter la
commande emerge en tant que root, sans se soucier de l'endroit où il se
connecte :
Exemple de code 2.9 : Autoriser un utilisateur à exécuter la commande emerge sans se soucier de son lieu de connexion |
swift ALL = /usr/bin/emerge
|
Cela peut être intéressant de définir des utilisateurs qui peuvent lancer des
applications administratives (comme emerge et ebuild) sur une
machine et un groupe d'administrateurs qui peuvent changer le mot de passe de
n'importe quel utilisateur, excepté root !
Exemple de code 2.10 : Utiliser les alias pour les utilisateurs et les commandes |
User_Alias SOFTWAREMAINTAINERS = swift, john, danny
User_Alias PASSWORDMAINTAINERS = swift, sysop
Cmnd_Alias SOFTWARECOMMANDS = /usr/bin/emerge, /usr/bin/ebuild
Cmnd_Alias PASSWORDCOMMANDS = /usr/bin/passwd [a-zA-Z0-9_-]*, !/usr/bin/passwd root
SOFTWAREMAINTAINERS localhost = SOFTWARECOMMANDS
PASSWORDMAINTAINERS localhost = PASSWORDCOMMANDS
|
Utiliser sudo pour un utilisateur autre que root
Il est aussi possible qu'un utilisateur puisse lancer une application sous un
autre utilisateur que root. Cela peut être intéressant si vous exécutez des
applications utilisant un nom d'utilisateur spécifique (comme apache
pour le serveur web). Vous pouvez ainsi autoriser certains utilisateurs à
exécuter des tâches administratives en utilisant cet utilisateur spécifique
(comme tuer des processus zombies).
Dans /etc/sudoers, vous inscrivez le(s) utilisateur(s) entre
( et ) avant d'inscrire la liste des commandes :
Exemple de code 2.11 : Syntaxe lorsqu'il s'agit d'un utilisateur autre que root |
users hosts = (run-as) commands
|
Voici comment autoriser swift à utiliser la commande kill en tant
qu'utilisateur apache ou gorg :
Exemple de code 2.12 : Exemple d'utilisation lorsque l'utilisateur sudo n'est pas root |
Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill
swift ALL = (apache, gorg) KILL
|
Avec ce paramétrage, l'utilisateur peut lancer sudo -u et
sélectionner ensuite l'utilisateur qu'il veut pour lancer l'application :
Exemple de code 2.13 : Lancer pkill en tant qu'utilisateur apache |
$ sudo -u apache pkill apache
|
Vous pouvez paramétrer un alias pour lancer une application utilisant la
directive Runas_Alias. Son utilisation est identique aux autres
directives _Alias que nous avons vues ce-dessus.
Mots de passe et paramètres par défaut
Par défaut, sudo demande à l'utilisateur de s'identifier en utilisant
son propre mot de passe. Une fois le mot de passe entré, sudo s'en
rappelle pendant cinq minutes, autorisant l'utilisateur à se concentrer sur ses
tâches et ne pas constamment entrer son mot de passe.
Bien sûr, ce temps peut être changé : vous pouvez paramétrer la
directive Defaults: dans /etc/sudoers pour changer
le temps par défaut par utilisateur.
On peut par exemple modifier les cinq minutes par défaut à 0 (ne jamais s'en
rappeler).
Exemple de code 2.14 : Modifier la valeur du timeout |
Defaults:swift timestamp_timeout=0
|
La valeur -1 permet de rester identifié indéfiniment (jusqu'à ce que le
système redémarre).
Un autre paramètre permet de demander que l'utilisateur se connecte avec le mot
de passe root au lieu de son mot de passe personnel. Ceci est possible grâce à
runaspw. Dans cet exemple, nous avons aussi paramétré le nombres
d'essais (combien de fois l'utilisateur peut entrer à nouveau le mot de passe
avant que sudo n'échoue) à 2 au lieu de 3 qui est la valeur par
défaut :
Exemple de code 2.15 : Demander le mot de passe root au lieu du mot de passe utilisateur |
Defaults:john runaspw, passwd_tries=2
|
Il est aussi possible d'utiliser la variable DISPLAY afin que l'utilisateur
puisse exécuter des applications graphiques :
Exemple de code 2.16 : Paramétrer la variable DISPLAY |
Defaults:john env_keep=DISPLAY
|
Vous pouvez changer une douzaine de paramètres par défaut en utilisant la
directive Defaults. Faites un man sudo et lancez une recherche
sur Defaults si cette partie vous intéresse.
Vous pouvez aussi autoriser l'accès sans mot de passe d'un utilisateur.
Vous devez pour cela commencer la commande avec NOPASSWD:, comme
montré ci-dessous :
Exemple de code 2.17 : Autoriser l'exécution d'emerge en root sans fournir de mot de passe |
swift localhost = NOPASSWD: /usr/bin/emerge
|
3.
Utiliser sudo
S'informer de ses privilèges
Pour savoir quels sont vos droits, exécutez sudo -l :
Exemple de code 3.1 : Les différents privilèges de swift |
$ sudo -l
User swift may run the following commands on this host:
(root) /usr/libexec/xfsm-shutdown-helper
(root) /usr/bin/emerge
(root) /usr/bin/passwd [a-zA-Z0-9_-]*
(root) !/usr/bin/passwd root
(apache) /usr/bin/pkill
(apache) /bin/kill
|
Si vous avez des commandes dans /etc/sudoers qui ne requièrent pas
de mot de passe, sudo ne demandera pas de mot de passe non plus.
Prolonger le timeout du mot de passe
Par défaut, si un utilisateur a entré son mot de passe lui-même avec sudo,
il est authentifié pendant cinq minutes. Si l'utilisateur veut prolonger cette periode
d'authentification, il peut exécuter sudo -v pour rester cinq minutes de plus
sans que sudo ne demande de mot de passe une nouvelle fois.
Exemple de code 3.2 : Augmenter le timeout du mot de passe |
$ sudo -v
|
On peut aussi supprimer ce temps avec sudo -k.
Ce document est protégé par la licence Creative
Commons : Paternité - Partage des Conditions Initiales à
l'Identique 2.5.
|