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
–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