Sudo, première approche du super utilisateur

De HomeServer.DIY.
Aller à : Navigation, rechercher

Sous linux, par défaut seul l'administrateur (root) a le droit d'effectuer les taches courantes de gestion comme installer des programmes/mises à jour, lancer/arrêter des services, modifier des paramètres noyau en temps réel... Sous Windows, depuis Vista, l'utilisateur n'est plus administrateur par défaut et doit accepter une élévation de privilèges quand il installe un programme (ou d'autres taches "administratives"). Hors, sous "Unix", depuis 1980 existe un programme permettant lui aussi de donner temporairement des droits administrateur à un utilisateur standard. Il aura fallu l'arrivée d'Ubuntu pour voir son utilisation décuplée.

Les avantages sont évidents : il est possible de déléguer le pouvoir quelques minutes, pratique si par exemple un correctif critique doit être déployé, ou relancer un service planté. Ça ne sera pas abordé, mais il est possible aussi de garder une trace des utilisations de sudo. Bref, les cas d'usages sont multiples, et l'on ne va voir que deux cas dans cette introduction : l'élévation complète, qui est celle retenue par Ubuntu, et l'élévation sélective (c'est-à-dire donner uniquement les droits sur certaines commandes).

Bien évidemment les manipulations seront présentées sous Debian, et testées plus précisément sur une Wheezy 7.4. Mais en dehors de l'installation, les commandes sont applicables telles quelles sur d'autres systèmes.


Sommaire

Installation de sudo

L'installation sur une Debian est comme toujours des plus simples. Il faut juste se connecter avec root et lancer la commande suivante :

root@heberg:/root# apt-get install sudo
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les NOUVEAUX paquets suivants seront installés :
  sudo
0 mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 842 ko dans les archives.
Après cette opération, 1 882 ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://ftp.fr.debian.org/debian/ wheezy/main sudo amd64 1.8.5p2-1+nmu1 [842 kB]
842 ko réceptionnés en 5s (164 ko/s)
Sélection du paquet sudo précédemment désélectionné.
(Lecture de la base de données... 36661 fichiers et répertoires déjà installés.)
Dépaquetage de sudo (à partir de .../sudo_1.8.5p2-1+nmu1_amd64.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de sudo (1.8.5p2-1+nmu1) ...
root@heberg:/root#

Comme on le voit, sudo n'a pas besoin de dépendances particulières, ce qui le rend très portable. En effet, tout est déjà installé de base.


Premier exemple : élévation complète

C'est le cas le plus simple. Par défaut, du moins sous Debian, sudo donne les accès complets à un utilisateur qui fait partie du groupe sudo créé à l'installation. Donc il suffit d'ajouter un utilisateur au groupe en question :

root@heberg:/root# adduser seboss666 sudo
Ajout de l'utilisateur « seboss666 » au groupe « sudo »...
Ajout de l'utilisateur seboss666 au groupe sudo
Fait.
root@heberg:/root#

Une fois que c'est fait, il faut déconnecter le compte en question (le mien ici), et se reconnecter dessus. Pour le tester, j'essaie de faire une mise à jour du système. La commande 'maj' n'est qu'un script qui fait un 'apt-get update && apt-get upgrade', script placé dans /sbin/maj :

seboss666@heberg:~$ sudo maj

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for seboss666: 
Atteint http://packages.dotdeb.org wheezy Release.gpg
Atteint http://ftp.fr.debian.org wheezy Release.gpg
Réception de : 1 http://mirrors.linsrv.net wheezy Release.gpg [198 B]
Atteint http://packages.dotdeb.org wheezy Release
Réception de : 2 http://mirrors.linsrv.net wheezy Release [2 260 B]
(...)

Tada ! Maintenant, j'ai aussi accès à toutes les autres possibilités de l'administrateur, si je commence mes commandes par 'sudo'. Ce n'est pas un problème puisque c'est ma machine, mais dans le cadre d'une machine partagée, et si vous ne voulez pas que votre "délégué" puisse aller jusqu'à redémarrer la machine sans votre permission, vous pouvez n'autoriser que certaines commandes.


Élévation sélective

Ici, il ne faut pas que le compte appartienne au groupe sudo, mais le fichier /etc/sudoers nous renseigne sur comment définir quels droits sont octroyé aux comptes ajoutés. Ce fichier n'est lisible que par le compte root :

# cat /etc/sudoers

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

On voit la ligne '%sudo ALL=(ALL:ALL) ALL' qui donne les pleins pouvoirs aux membres du groupe sudo. root est bien évidemment présent, et ils conseillent d'ajouter les comptes dans le dossier /etc/sudoers.d. Par défaut, ce dossier ne contient qu'un README très utile puisqu'il donne les conseils à suivre pour qu'un fichier soit pris en compte par sudo. Notamment, il ne doit pas avoir d'extension, et doit disposer de droits d'accès spécifiques. Un peu à l'image des clés SSH qui ne sont pas prises en compte par le client si les droits ne sont pas à 600 (lecture/écriture par le propriétaire seul).

Donc, si on a un autre compte toto, qu'on veut seulement qu'il aie accès aux mises à jour, on va créer le fichier /etc/sudoers.d/toto, et y mettre ça dedans :

toto	ALL=(ALL:ALL) /sbin/maj

On change ensuite les droits du fichier /etc/sudoers.d/toto de la manière suivante (toujours en root) :

# chmod 0660 /etc/sudoers.d/toto

En se loggant avec toto, on peut alors tester si tout se passe bien :

toto@heberg:~$ sudo maj
[sudo] password for toto: 
Atteint http://packages.dotdeb.org wheezy Release.gpg
Atteint http://ftp.fr.debian.org wheezy Release.gpg
Atteint http://packages.dotdeb.org wheezy Release
Réception de : 1 http://ftp.fr.debian.org wheezy-updates Release.gpg [836 B]
Atteint http://security.debian.org wheezy/updates Release.gpg
Réception de : 2 http://mirrors.linsrv.net wheezy Release.gpg [198 B]
(...)
129 ko réceptionnés en 2s (48,3 ko/s)
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.
toto@heberg:~$ l
total 0
-rw-r--r-- 1 toto toto 24 avril 12 12:27 toto.txt
toto@heberg:~$ sudo chown seboss666:users toto.txt 
[sudo] password for toto: 
Sorry, user toto is not allowed to execute '/bin/chown seb:seb toto.txt' as root on heberg.seboss666.info.
toto@heberg:~$


Aller plus loin

"Voilà, c'est tout pour aujourd'hui". Cet article n'est qu'une introduction, mais sudo permet bien plus de choses. Si on regarde bien le fichier /etc/sudoers, on voit qu'on peut créer des groupes de commandes, des groupes d'utilisateurs, bref, une vraie petite gestion d'ACL maison sur les commandes du système. Il est surtout utile pour dès lors ne plus autoriser root à se connecter en SSH sur votre serveur. Voici donc quelques liens pour approfondir un peu le sujet :