Gentoo Logo

Guide Gentoo pour les utilisateurs de sudo

Table des matières :

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 : (Entrer le mot de passe utilisateur, pas le mot de passe root !)

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.



Imprimer

Dernière mise à jour le 14 juillet 2006

Une version originale plus récente datée du 13 août 2011 existe.

Résumé : Si vous voulez donner la possibilité à certaines personnes d'exécuter certaines tâches administratives sur votre machine sans leur donner un accès root total, sudo est fait pour vous. Sudo vous permet de contrôler qui peut faire quoi. Ce guide vous offre une petite introduction à cet outil formidable.

Sven Vermeulen
Auteur

Nicolas Cornu
Traducteur

Donate to support our development efforts.

Copyright 2001-2013 Gentoo Foundation, Inc. Questions, Comments? Contact us.