Comment donner certains droits root à un utilisateur avec sudo

Description

Un simple utilisateur n'a pas beaucoup de droits sur un système Debian GNU/linux, ce privilège étant réservé au compte root. Toutefois, l'administrateur lui-même travaille le plus souvent sous un autre compte, principalement pour des raisons de sécurité. A la longue il peut être pénible de devoir utiliser la commande su pour effectuer des opérations brèves comme l'installation d'un programme avec apt-get. Le programme sudo permet de s'affranchir de cette contrainte et d'exécuter des commandes en tant que root ou qu'un autre utilisateur sans utiliser la commande su. De plus comme sudo permet de logguer tous les évènements, on sait qui a fait quoi et quand.

Pré-requis théorique

Le principe de la commande su doit être connu. Connaître VI(m) est un plus pour utiliser la commande visudo, indispensable pour éditer le fichier de configuration /etc/sudoers.

Installer

Nous allons installer le paquet sudo :

# apt-get install sudo

Configurer

Fichier de configuration

Toute la configuration se fait par l'intermédiaire d'un seul fichier : /etc/sudoers.

L'édition de /etc/sudoers se fait par une commande spéciale: visudo. Cet éditeur se présente comme VI(m) mais il est optimisé pour sudo. En particulier, vous pouvez utiliser la commande :

# visudo -c

pour contrôler le fichier de configuration et repérer les erreurs de syntaxe. Tout dépend de la configuration de votre environnement, pour choisir l'éditeur de texte utilisé par visudo, il suffit d'exporter la variable EDITOR qui va bien :

# export EDITOR=vi

ou bien si on est plutôt emacs (pas de troll s'il vous plaît) :

# export EDITOR=emacs

Voici comment se présente le fichier /etc/sudoers. par défaut :

# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL) ALL

On peut voir 4 rubriques après les commentaires :

La section Host alias specification

Cette section permet de définir des groupes de machines ou réseaux : j'avoue ne pas avoir vraiment cherché, n'en ayant pas l'utilité. En gros, cela veut dire que vous pourrez recopier votre fichier sudoers sur des machines différentes et n'autoriser que certains des droits supplémentaires en fonction de la machine sur laquelle on se trouve.

La section User alias specification

Cette partie permet de définir des alias pour les utilisateurs auquel sudo va donner des droits particuliers. Par exemple, vous pouvez décider que les utilisateur gaelle, barnabe et chris auront tous des droits identiques dans sudo: alors au lieu de bêtement retaper ces droits, vous pouvez définir un groupe qui les concernera tous les trois. Voici ce que cela donne :

User_Alias STAFF=gaelle,barnabe,chris

Désormais, lorsque vous donnerez des droits à STAFF, ce sont Gaelle, Barnabe et Chris qui en bénéficieront.

La section Cmnd alias specification

Cette partie permet de définir des alias pour les commandes que vont pouvoir exécuter les utilisateurs. En regroupant les commandes, vous pouvez ainsi éviter d'avoir à retaper toute la liste pour tel ou tel utilisateur. Par exemple :

Cmnd_Alias NET=/bin/ping,/usr/bin/traceroute,/usr/bin/ftp,/usr/bin/nmap

Désormais, en attribuant la commande NET, vous autorisez le ping, le traceroute, le ftp et le nmap.

La section User privilege specification

root ALL=(ALL) ALL

Cette section, la plus importante, permet de donner effectivement les droits à un utilisateur. Vous pouvez remarquer que par défaut une ligne est déjà présente: elle concerne l'utilisateur root qui a droit à tout partout tout le temps (pas un scoop: pourquoi root irait utiliser sudo je vous le demande).

Voyons quand même cette ligne d'un peu plus près:

  • root : Premier argument, il s'agit de l'utilisateur à qui on donne des droits sur cette ligne. Bien entendu il peut s'agir d'un User Alias, qui regroupe alors plusieurs users.
  • Le premier ALL : Il s'agit de la machine sur laquelle les droits de la ligne sont valables. Le plus souvent ce n'est pas très important, mais lorsqu'on désire exporter son fichier sudoers sur plusieurs machines, cela devient vraiment un paramètre intéressant (à utiliser avec la directive Host alias)
  • Le second ALL : Il s'agit de l'utilisateur dont root prend les droits. Par défaut ce paramètre est root. Mais vous pouvez le spécifier vous même. Par exemple si vous souhaitez que le user toto dispose des droits de l'utilisateur 'jerome' vous avez une ligne du type:
toto ALL=(jerome) ALL

Elle signifie que pour toutes les commandes que va taper toto (avec sudo devant ou après s'être authentifié avec sudo) cumuleront ses droits à lui et ceux de jerome. Plus concrètement il pourra tout détruire dans le /home de Jerome quoi.

  • Le dernier ALL : Ce sont les commandes auxquelles root à droit. On pourrait y mettre des commandes simples espacées de virgules ou alors un groupe de commande comme celui défini dans Cmnd_Alias.

Exemple de configuration

Reprenons notre fichier de configuration depuis le début, avec notre exemple:

# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
User_Alias STAFF=gaelle,barnabe,chris
# Cmnd alias specification
Cmnd_Alias NET = /bin/ping, /usr/bin/traceroute, /usr/bin/ftp, /usr/bin/nmap
# User privilege specification
root ALL=(ALL) ALL
STAFF ALL=(ALL) NET

Grâce à ce fichier sudoers, les utilisateurs gaelle,barnabe et chris peuvent désormais exécuter des ping, des traceroute, des transferts FTP et des nmap comme si ils étaient root.

Vous pouvez trouver de nombreux exemples de la syntaxe de sudoers dans la page de manuel ( $ man sudoers ) avec les explications correspondantes, et vous verrez que de nombreuses possibilités existent en plus de celles que nous venons de voir.

Utiliser

Vous êtes maintenant à même de définir votre politique sudo sur la machine, toutefois pour rester dans le concret, la première utilisation qu'on en fait, c'est d'autoriser son utilisateur à effectuer des opérations sans passer root. Pour cela il suffit d'ajouter la ligne suivante avec visudo :

toto ALL=(ALL) NOPASSWD:ALL

Désormais, pour passer root, il suffira à toto de taper la commande sudo suivie de la touche “ENTREE”. On ne lui réclamera pas de mot de passe à cause de la directive NOPASSWD. Sans cette directive _son_ mot de passe lui serait réclamé (j'insiste: le sien, pas celui du compte root).

Mais il y a une autre manière bien commode d'utiliser la commande: lorsqu'on souhaite effectuer une commande ponctuelle en tant que root, il suffit de faire précéder la commande en question par “sudo”. Voici ce que ca donne :

$ sudo rm mp3blaster-3.1.3.tar.gz

Cette commande efface le fichier même si il est interdit à l'utilisateur de le faire et sans demander de mot de passe ou de confirmation. C'est pourquoi il faut être très prudent quand on utilise sudo, surtout avec la directive : NOPASSWD:ALL.

Désinstaller

Pour désinstaller sudo, utilisez la commande classique sur un système Debian :

# apt-get remove sudo

Supprimer toute trace du package précédement installé : Lorsque vous décidez de retirer un package de votre Debian GNU/Linux apt n'efface par les fichiers de configuration de ce package. Ceci permet de réinstaller plus rapidement le package. Cependant si vous souhaitez faire table rase et ne plus entendre parler du package, vous pouvez ajouter l'option –purge lors de la suppression :

# apt-get remove --purge <package>

Annexe : Configurer sudo pour utiliser apt

Selon les principes de paramétrage précédents, voici un exemple de fichier de configuration pour sudo qui autorise un utilisateur toto à utiliser apt par le biais d'un alias sur un groupe de commandes : DEBIAN_TOOLS.

# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
User_Alias APT=toto
# Cmnd alias specification
Cmnd_Alias DEBIAN_TOOLS = /usr/bin/apt-get, /usr/bin/auto-apt, /usr/bin/dpkg, /usr/bin/dselect
# User privilege specification
root  ALL=(ALL) ALL
APT   ALL=NOPASSWD: DEBIAN_TOOLS

Vous pouvez à présent mettre à jour la liste des packets de votre machine sans ouvrir de session root :

$ sudo apt-get update
 
securite/comment-donner-certains-droits-root-a-un-utilisateur-avec-sudo.txt · Dernière modification: 11/12/2010 15:38 par orgrim