Cours Linux : sudo
Cet article a été publié par Benjamin
le 24-03-09 à 09:59 dans la catégorie Cours Linux
Tags :
- Cours
- Libre
- Ubuntu
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.
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
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 commandevi /etc/phpldapadmin/config.php
.
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.
Commentaires
Merci pour ces explications très détaillées!!
Je garde le lien dans mes marques page
J'ai pas tout lu, je me suis arreter a "Pour en finir avec cette légende, sudo ne signifie pas SuperUser DO mais Substitute User DO !" ...
J'aimerai bien une preuve car c'est la 1er fois que je vois ca et aussi parce-que wikipedia dit le contraire ..
Merci,
Cet article balaie pas mal d'idées reçues et éclaircit bien ce fameux sudo.
Ps: Pour ce qui est du sandwich, la commande "s'il te plaît" fonctionne aussi. :)
Sudo apt-get install café
Merci pour ces explications détaillées !!!
Tres bon article!
@ lemulot : sudo vient de " su "do" ", et le su vient de la commande su Substitute User, donc substitute user do. Et sur la page de wikipedia, la note a propos de la signification de sudo dit clairement Substitute User Do.
http://linux.die.net/man/1/su
http://www.sudo.ws/
http://fr.wikipedia.org/wiki/Su_(unix)
Pour le mulot : http://en.wikipedia.org/wiki/Su_(Unix) explique bien que SU veut dire Substitute User ou Switch User.
Et http://www.sudo.ws/sudo/intro.html explique que SUDO veut dire SU "do" donc...
cEd
@lemulot : Ce qui prouve bien que Wikipédia ne doit pas être l'unique source de renseignements ;-)
@Xenom : Merci d'avoir corrigé la fameuse page de Wikipédia.
AH! Mais oui, un mythe vient de tomber ..
Tres bon article. Le sudo !! que je ne connaissais pas est plutôt sympa !
Salut,
Très bon article.
J'ai juste tiqué sur:
"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."
Pour moi la différence entre sudo et gksudo (ou kesu) c'est la manière de demander le mdp, dans le terminal ou avec une boite de dialogue.
Quel rapport avec le fait qu'on lance une appli console ou graphique ?
On peut très bien faire
% sudo vi file
ou
% sudo gim file
Le résultat est le même, on édite un fichier avec les droits root.
Peux-tu donner tes sources sur le "au risque de voir apparaître certains conflits", stp.
Ça m'intéresse.
Merci :-)
Très bon article !
Je vais néanmoins être obligé de tiquer sur la très bonne illustration provenant d'XKCD (http://xkcd.com/149/ ) sous licence CC, qui aimerait bien que sa source soit indiquée ...
Quand utiliser sudo ou gksudo/kdesudo ? :
http://doc.ubuntu-fr.org/sudo#quand_utiliser_sudo_ou_gksudokdesudo
Je plussoie fortement @pol ! C'est franchement regrettable !
http://creativecommons.org/licenses/by-nc/2.5/deed.fr
Le fait de ne pas avoir de mot de passe root est peut être gage de sécurité en distant (ssh) mais pas en local.
En mode single user, le fait de ne pas mettre de mdp root permet à n'importe qui de de changer et prendre contrôle de la machine (un ordi portable volé par exemple...)
Bref, pas que du positif !
no comment
@FlyTbird : heuu en mode single user on te demande pas de mot de passe root t'es connecté directement root ... tu fais un passwd et tu fais ce que tu veux sur la machine. la seule solution pour éviter ça c'est :
- 1 : mot de passe grub
- 2 : chiffrer son système de fichiers
++
@FlyTbird, @Benjamin
tout bon serveur sshd bien configuré comporte dans sa config:
PermitRootLogin no
ça ne change rien à la sécurité du système. la sécurité d'un système se juge à la qualité de la configuration des démons et autres portes ouvertes vers l'extérieur. Avoir un mot de passe (a priori, un mot de passe "fort" doit suffire) pour le compte root est une facilité, pas une faille. si la config des démons est pourrie, rendre un compte root "étoilé" (sans mot de passe, pour comprendre il faut regarder le fichier /etc/shadow) c'est un peu comme faire pipi dans la mer :)
@wazyk
merci pour le lien
@Benjamin
du coup tu peux peut être un peu plus précis dans le paragraphe ?
Merci !
@Matthias : Je pensais comme toi avant de lire cette page que tu me demandes et que wazyk nous a donné (merci)
@pol et KAgou : En effet, oubli de ma part, j'ai modifié cela, merci de me l'avoir signalé
@FlyTbird : Dans ce cas, en plus de ce qu'a dit Myckeul (merci), il est toujours possible d'ajouter un mot de passe root et de forcer la demande de ce mot de passe root pour sudo (option rootpw des Defaults)
@ogouriche2005 : ?
@regala : C'est vrai que le plus important reste un bon mot de passe (que ce soit celui de root ou de l'utilisateur) et une configuration des démons correxte (ainsi qu'une politique de sécurité du genre firewall.
En tout cas merci à tous pour vos commentaires :-)
qu'en est-il de sudo -i ? y a-t-il une autre différence avec "sudo su" mis à part le fait qu'on soit téléporté dans le home de root ?
article très complet et très clair, bravo!
Et j'aime beaucoup l'option pour le logfile que je ne connaissais pas. (ça m'embêtait pas mal d'avoir tous les sudos dans /var/log/access.log)
merci ;)
Et dire que je croyais à une faille le fait d'avoir root sans mot de passe en single user...
Moi j'ai carrément ajouté un mot de passe parce que je ne savais pas quoi faire d'autre pour éviter qu'on me "malmène" ma machine (mdr). Alors merci regala et merci Benjamin, cet article est parfait ;)
franchement à lire les articles sur linux et bah ca donne pas envie de s'y metre.
Windows ne me demande jamais de mot de passe pour bidouiller dans le systeme.
C'est quand même plus agréable.
@ d4troll: c'est clair, et puis que dire des bugs et des virus...une vraie partie de plaisir...il est fort ce Window$.
sudo -u utilisateur cmd
Exécute en tant qu'utilisateur la commande, pratique comme dans :
sudo -u postgres psql
sudo su -
Pour avoir les variables d'environnements.
Bravo pour cet article et les autres
Super tes cours. On y apprend ou redécouvre plein d'astuces hyper pratiques.
Je pensais faire un article sur sudo prochainement me voilà grillé. Enfin ca m'évite de chercher les éléments que je ne connaissais pas.
Merci tout simplement.
d4troll : le but d'un mot de passe est d'empêcher à n'importe qui ou n'importe quoi de faire ce qu'il veut sur ta machine mais la sécurité doit être le derniers de tes soucis apparemment :p
Pas tout à fait d'accord avec l'argument de la "protection supplémentaire" en particulier avec le deamon sshd. La 1ere chose à faire lorsque l'on ouvre le service ssh est d'interdire la connexion via le user "root" avec la directive "PermitRootLogin no" dans le /etc/ssh/sshd_config" (sur fedora, debian).
Du coup, pour obtenir les droits root, un éventuel intrus devra "craquer" 2 mots de passe !
@lemulot :
Tout simplement parce que, dans Wikipédia, on trouve un peu n'importe quoi, et pas forcément des infos et des renseignements avérés. Quoique les créateurs de Wikipédia semblent, depuis quelques tems, mettre un peu d'ordre dans tout ça !
Salut,
Juste pour te dire qu'il y a une erreur dans l'article, ce n'est pas:
passwd_tries:2
Mais:
passwd_tries=2
A+
@lemulot
1ere ligne
http://fr.wikipedia.org/wiki/Sudo
sudo (abréviation de substitute user do, en anglais : « exécuter en se substituant à l'utilisateur »)
@lemulot love you
no comment
merci pr ces informations mais si sudo n'est pas super user pourquoi on ne peut y accedé sans mettre le mot de passe
Il y a tout de même un problème avec SUDO (sous Ubuntu notamment). A force de donner des droits admin aux utilisateurs on se retrouve avec plusieurs comptes qui peuvent potentiellement faire des dégâts. Et la seule protection est le mot de passe de l'utilisateur (qui est "passe", on le trouve scotché sous le clavier !).
Il ne faut pas oublier qu'on ne doit mettre dans la table des sudoers uniquement les utilisateurs de confiance à qui on souhaite confier une tâche d'administration. Et encore il ne faut lui attribuer que les droits nécessaires.
Je trouve que certaines distrib ont tendance à faire un peu trop de ALL=(ALL) ALL.
Merci pour ces explications.