Cours Linux : sudo

Tous les utilisateurs d'Ubuntu et ses dérivés connaissent la fameuse commande sudo su. En revanche, tout le monde ne sait pas exactement pourquoi on est obligé d'utiliser sudo, pourquoi n'est il pas possible de se connecter en tant que root directement, pourquoi root n'a pas de mot de passe, est-ce un manque de sécurité ?

Aujourd'hui, je vais tenter d'éclaircir cette notion de sudo, afin que tout le monde maîtrise encore un peu plus son système !

I. Présentation de sudo

Sudo est un logiciel permettant à un utilisateur lambda d'exécuter des commandes nécessitant les droits Administrateur (root). Pour en finir avec cette légende, sudo ne signifie pas SuperUser DO mais Substitute User DO !
Concrètement, pour exécuter une commande avec les droits de root, il faut taper cette commande : sudo commande puis taper votre mot de passe utilisateur.

Sous Ubuntu, l'utilisateur root ne possède pas de mot de passe (par défaut). Ce qui pourrait, pour certains, être considéré comme un manque de sécurité notable est, en fait, une protection supplémentaire.

Pourquoi ? La raison est simple : Dans un système Unix, il est impossible de se connecter avec un utilisateur qui ne possède pas de mot de passe. Il est donc impossible, sous Ubuntu de se loguer directement en tant que root. Pour faire un petit test, tapez la commande su dans un terminal (c'est la commande qui permet de passer en root sous Debian), il vous faudra ensuite renseigner un mot de passe...qui n'existe pas. La connexion sera donc impossible.

En fait le principe est le suivant sous Ubuntu : on accorde à un (ou plusieurs) utilisateur(s) de confiance (par défaut le premier créé) le droit d'effectuer des tâches nécessitant les droits d'administrateur (via la commande sudo et son fichier de configuration : /etc/sudoers)


Un petit exemple pour vous prouver que ce n'est pas un manque de sécurité : si un pirate détecte que le port 22 de votre machine est ouvert, il pourra en déduire que vous utilisez SSH. Il essayera donc de se connecter directement avec le compte root : ssh root@votre_ip. Il n'aura donc aucune chance de trouver le mot de passe root (car il n'y en a pas) et très peu de chances de trouver ne serais-ce que votre login utilisateur (avant d'essayer de trouver votre mot de passe utilisateur). C'est donc une sécurité supplémentaire.


Notez qu'il est également possible de lancer une application graphique en root grâce à la commande gksudo (ou kdesu). Par exemple, pour éditer un fichier avec gedit en root : gksudo gedit /etc/phpldapadmin/config.php.
Vous pouvez-vous dire : "mais moi je fais sudo gedit et ça fonctionne très bien". Certes, mais cela est déconseillé. Il faut utiliser gksudo ou kdesu pour les applications graphiques et sudo pour les lignes de commandes, au risque de voir apparaître certains conflits.


II. Les différentes commandes

Si vous avez une suite de commandes à taper nécessitant les droits d'administrateur, il devient vite fastidieux d'ajouter sudo devant chaque commande. Il est donc possible de se loguer en tant que root grâce, entre autres, à la commande sudo su.

Vous connaissez peut-être des personnes qui utilisent des commandes différentes pour cela. Un petit exemple assez marrant qui m'est arrivé le mois dernier : Un camarade (dont l'anonymat sera préservé bien sûr^^) me voit faire sudo su dans mon terminal et ma lance : "ben pourquoi tu fais pas sudo -s à la place, ça irait plus vite, il y a moins de lettres"... et je précise que c'était sérieux :)

Bref, cela m'a poussé à me renseigner sur les différences entre ces commandes. Je trouve qu'il est intéressant de la savoir, je vais donc les décrire ci-dessous.


Tout se joue dans les variables d'environnement (je ferais un cours à ce sujet je pense). En fait les variables changent en fonction de la commande.
Essayez cette manipulation :
sudo su
env|grep HOME
Vous pouvez vous apercevoir que lorsque vous êtes logué en root avec sudo su, votre home devient /root et non plus /home/login.

Maintenant faites ceci :
Ctrl+d (vous permet de repasser sous le compte de l'utilisateur).
sudo -s
env|grep HOME

Vous êtes désormais toujours root mais vous avez conservé votre home utilisateur. Par conséquent, vous conservez également les paramètres de votre /home/login/.bashrc (ou de tout autre fichier de configuration présent dans votre /home/login). Cela évite, dans le cas du .bashrc, d'avoir à éditer le fichier /etc/bash.bashrc ou bien de devoir éditer le /home/login/.bashrc et /root/.bashrc.
Note : C'est également pratique pour le répertoire .ssh.

Je vous conseillerais donc sudo -s plutôt que sudo su, mais c'est à vous de voir :)

Petite astuce : Lorsque vous avez tappé une commande nécessitant les droits administrateur sans sudo devant, vous pouvez taper la commande sudo !! qui reprendra automatiquement votre dernière commande en lui ajoutant sudo devant.

Source XKCD

III. Le fichier de configuration

Comme je l'ai évoqué ci-dessus, le fichier de configuration de sudo est /etc/sudoers.

Mise en garde : Ne modifiez votre fichier de configuration que si vous savez vraiment ce que vous faites, une erreur sur ce fichier pourrait avoir des conséquences plus que fâcheuses :)

Attention : Il ne faut jamais éditer ce fichier "à la main". Pour modifier ce fichier, nous utiliserons la commande visudo. L'avantage de visudo est qu'il détecte les éventuelles erreurs de syntaxe avant d'enregistrer le fichier (c'est un peu le même principe que le crontab).

Voici, pour l'exemple, mon fichier de configuration :

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL

# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
# %sudo ALL=NOPASSWD: ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL


Voici maintenant l'explication de ce fichier de configuration :

Nous allons commencer par les spécifications de privilèges (en fin de fichier. Elles se présentent ainsi :
utilisateur machine= () commandes

Par exemple :
  • benjamin localhost = /usr/bin/wireshark, permet d'autoriser l'utilisateur benjamin à exécuter Wireshark en tant que root sur sa propre machine
  • benjamin localhost = (nagios) /usr/bin/pkill, /usr/bin/kill, permet d'autoriser l'utilisateur benjamin à exécuter pkill et kill en tant qu'utilisateur nagios (par exemple, grâce à cette commande : sudo -u nagios pkill nagios)
  • %admin ALL=(ALL) ALL, permet d'autoriser aux membres du groupe admin d"exécuter toutes les commandes sous n'importe quel compte (=(ALL)), à partir de n'importe quelle machine
  •  #%sudo ALL=NOPASSWD: ALL, autoriserait (s'il n'était pas commenté) les utilisateurs du groupe sudo à exécuter n'importe quelle commande à partir de n'importe quelle machine en tant que n'importe quel utilisateur sans entrer de mot de passe.

Attention : Veillez à ne pas donner de droits root à vos utilisateurs qui leur permettrait de modifier leur propres droits. Par exemple, si vous leur donnez les droits root pour l'exécution de gedit, rien ne les empêcherait de modifier le fichier /etc/group pour s'ajouter dans le groupe admin.

Les alias :

Pour éviter de taper de trop nombreuses lignes, vous pouvez utiliser des alias. Voici quelques exemples :

  • User_Alias groupeapache = benjamin, elodie
  • Host_Alias maison = 192.168.0.2, 192.168.0.3, 192.168.0.4
  • Cmnd_Alias stop = /usr/bin/pkill, /usr/bin/kill
Ainsi, vous pouvez les utiliser dans cette ligne : groupeapache maison=(apache) stop. Vous comprenez cette ligne désormais :-)

Les commandes Defaults :

Quelques commandes supplémentaires sont à votre disposition pour paramétrer votre commande sudo. Ils sont à ajouter à la ligne Defaults. Voici quelques exemples :

  • insults : Affiche des messages marrants lorsque vous vous trompez de mot de passe pour sudo (Exemple : I've seen penguins that can type better than that)
  • timestamp_timeout : Modifie le temps nécessaire avant de devoir retaper le mot de passe (par défaut de 5 minutes). (Exemple : timestamp_timeout=0, ne conserve pas en mémoire le mot de passe. L'utilisateur devra donc taper son mot de passe à chaque fois)
  • passwd_tries : Modifie le nombre de mots de passe incorrects acceptés (par défaut 3 tentatives). (Exemple : passwd_tries:2 n'autorise que 2 tentatives avant d'échouer)
  • logfile : Défini le fichier de log de sudo (Exemple logfile=/var/log/sudo). Voici une ligne de ce fichier :
    Mar 22 14:07:45 : benj : TTY=pts/0 ; PWD=/home/benj ; USER=root ; COMMAND=/usr/bin/vi /etc/phpldapadmin/config.php
    Nous pouvons voir que le mardi 22 à 14h07, l'utilisateur benj (se trouvant dans le dossier /home/benj) à exécuté (au nom de root) la commande vi /etc/phpldapadmin/config.php.
Je ne vous présenterai que ces options, cependant vous pouvez voir la liste complète içi.

Vous avez deux façons d'ajouter ces options :
Soit vous les ajoutez pour tout le monde, dans ce cas la ligne adéquat sera celle-ci :
Defaults        insults,logfile=/var/log/sudo
Soit vous les ajoutez pour une personne en particulier :
Defaults:benj        insults,logfile=/var/log/sudo,passwd_tries:2


Ainsi ce termine ce petit cours, j'espère que vous l'avez apprécié. Comme d'habitude, si vous pensez qu'il manque des choses, n'hésitez pas à me le dire afin que je complète cet article.

À bientôt.

Vus : 541
Publié par Génération Linux : 126