« Sudo » : différence entre les versions
(licence ; cf page de discussion) |
m (Lea a déplacé la page Admin-admin env-sudo vers Sudo par-dessus une redirection) |
(Aucune différence)
|
Dernière version du 3 décembre 2023 à 21:28
Lancer des commandes avec les droits de root
par Fred
Comment exécuter une commande avec les droits de root sans utiliser le suid-bit.
Introduction
Supposons que vous souhaitiez lancer la commande /sbin/halt, dans ce cas vous avez plusieurs possibilités :
- vous lancez la commande :
su -c /sbin/halt qui vous demande le mot de passe root, on peut utiliser l'astuce suivante pour s'en affranchir : su -c /sbin/halt < root.pw où root.pw contient le mot de passe du root, mais cela n'est pas très sûr (si quelqu'un de mal intentionné réussit à lire ce fichier la sécurité de votre système est compromise)
- vous pouvez activer le suid-bit (voir : SUID Scripts):
chmod +s /sbin/halt
(il faut être root pour pouvoir faire cela)
et ensuite, n'importe quelle personne ayant les droits d'exécutions sur /sbin/halt peut lancer cette commande, mais ce n'est pas très pratique (la création de groupe de personne ayant de tels droits va être fastidieuse et, activer des suid-bit pour de multiples fichiers risque d'être encore plus pénible).
- vous pouvez utiliser sudo, c'est ce que nous allons voir dans la suite de ce document.
La commande sudo est presque toujours fournie avec votre distribution, mais n'est parfois pas installée automatiquement. Le paquetage doit s'appeler sudo-xxxxxx.
Exemples d'utilisation
Si sudo est correctement configuré, vous serez en mesure de taper des commandes de ce type :
qui lance la commande /sbin/halt en tant que root (si l'utilisateur qui tape cette commande est autorisé à la lancer par sudo).
qui lance la commande /etc/ppp/scripts/pppdisconnect en tant qu'utilisateur 'fred'.
Il faut savoir que chacune de ces commandes peut (ou peut ne pas) nous demander le mot de passe de l'utilisateur pour lequel nous voulons nous faire passer. Comme vous pouvez le constater c'est très simple à utiliser.
La commande sudo est beaucoup plus sophistiquée que cela, cette commande :
peut être autorisée, alors que :
sudo su fred -c ls
ne le sont pas : c'est très souple à configurer.
Comment ça marche ?
Le plus complexe est de configurer correctement sudo. La configuration passe par l'édition du fichier /etc/sudoers (voir man sudoers). La syntaxe est relativement simple, mais la page de man n'est pas très claire pour un non anglophone. Normalement l'édition de ce fichier passe par l'utilitaire visudo qui vérifie la syntaxe de ce fichier. On peut (normalement, mais pas avec la Mandrake 8.0) utiliser l'éditeur que l'on veut en conjonction avec visudo en tapant :
Mais, contrairement à ce que prétend la documentation de sudo, il n'est pas obligatoire de passer par visudo pour éditer ce fichier, n'importe quel éditeur fera l'affaire, en tous cas avec la Mandrake 8.0.
Ces préliminaires étant dits, passons à :
La syntaxe.
Dans un premier temps nous devons définir des groupes d'utilisateurs qui auront tous les mêmes droits (cela n'est pas obligatoire, mais simplifie l'administration d'un système ayant beaucoup d'utilisateurs potentiels). Pour cela il suffit de mettre dans /etc/sudoers une ligne du type :
Exemples :
User_Alias HALTUSERS = fred, bibi
User_Alias ROOT_FRIENDS = jice, serge, fred
Ensuite, nous allons avoir besoin de groupe de machines (dans le cas où vous comptez donner des droits à des utilisateurs qui sont connectés depuis divers endroits). La syntaxe est :
Exemples :
Host_Alias LABAS = www.tuxfamily.org, talk.revolink.com, 233.12.66.4
Host_Alias WWW = www*, mail*, pop*, *fr
(Le groupe WWW contient toutes les machines dont les noms commencent par www, mail et pop ou finissent par fr).
Puis, il faut créer un groupe contenant les utilisateurs pour lesquels on souhaite se faire passer :
Exemple :
Enfin, on peut grouper les commandes que l'on va autoriser à exécuter pour le compte de quelqu'un d'autre :
Exemples :
Cmnd_Alias PPPCMD = /etc/ppp/scripts/pppconnect, /etc/ppp/scripts/pppdisconnect
Cela regroupe les commandes /sbin/halt, /sbin/reboot et /sbin/shutdown mais uniquement si celui-ci est suivi de -r ou -h (halt ou reboot tout de suite) aucune autre option ne sera acceptée (c'est le ! qui veut dire 'pas' la commande décrite par /sbin/shutdown -* , ie: toute commande shutdown ayant une option).
Maintenant, donnons des droits par :
(Le NOPASSWD: est facultatif : il signifie que le mot de passe de l'utilisateur pour lequel on veut se faire passer ne sera pas demandé ; si (GROUP_DE_RUNAS) est omis c'est que l'on n'autorise qu'à se faire passer pour root).
Exemples :
signifie que fred peut lancer pour le compte de n'importe qui (premier ALL) n'importe quelle commande (second ALL), sauf qu'il ne peut lancer aucune commande pour le compte de root (!ALL). Mais cela n'est qu'un exemple n'utilisant pas les groupes; réparons cet oubli :
tous les utilisateurs listés dans PPPUSERS, s'ils se connectent depuis une machine listée dans MONRESEAU, peuvent se faire passer pour un utilisateur listé dans USERPPP pour exécuter /sbin/ppp ou une commande listée dans PPPCMD.
L'utilisateur john peut lancer la commande su depuis une machine listée dans ALPHA mais pas su tout seul, ni su root ni su suivi d'un quelconque flag ( [!-]* ).
un '+' devant un nom 'd'utilisateur' signifie qu'il faut considérer les personnes appartennant à ce groupe (au sens unix du terme : c'est à dire listées dans /etc/group), ici les personnes appartenant au groupe 'secretaires' (dans /etc/group, il y a une ligne : secretaire:xxxx:user1, user2,... ,usern : ce sont les utilisateurs user1 à usern qui sont considérés) ont droit de lancer les commandes du groupe PRINTINGCMDS ainsi que la commande /usr/sbin/adduser pourvu que celui-ci soit suivi d'un nom d'utilisateur.
Vous trouverez plus d'exemples dans man sudoers.
Mon /etc/sudoers
Voilà mon /etc/sudoers :
#
# Host alias specification
Host_Alias ICI = localhost
Host_Alias LOCALNET = 192.168.1.*
# User alias specification
User_Alias ROOT_FRIENDS = fred, bibi
# Cmnd alias specification
Cmnd_Alias SOUND = /usr/bin/xmms
Cmnd_Alias SHUTDOWN = /sbin/shutdown, \
/sbin/halt, \
/sbin/reboot
Cmnd_Alias PPPCMD = /etc/ppp/scripts/pppconnect, \
/etc/ppp/scripts/pppdisconnect
Cmnd_Alias PRINTINGCMDS = /usr/bin/lpq, \
/usr/bin/lprm
# Runas alias specification
# User privilege specification
# root peut tout !
root ALL=(ALL) ALL
# Les amis de root peuvent lancer les commandes
# du groupe SHUTDOWN
ROOT_FRIENDS ICI = NOPASSWD: SHUTDOWN
# ils peuvent aussi administrer l'imprimante (mais sous
# le compte de lpadmin, avec un mot de passe) :
ROOT_FRIENDS ICI = PRINTINGCMDS
# tout le monde peux lancer xmms avec les droit de root (pour le
# mode 'temps réel') en local
ALL ICI = NOPASSWD: SOUND
# tout le monde sur le réseau local peut demander l'établisement
# de la liaison internet
ALL LOCALNET = NOPASSWD: PPPCMD
Il n'est pas très complexe, mais permet d'éviter de mettre des programmes suid (c'est toujours dangereux) !
Vérification de /etc/sudoers.
Pour éditer /etc/sudoers le programme approprié est visudo (en fait c'est vi, emballé dans un programme pour vérifier la syntaxe du fichier. Mais, souvant vous préférerez éditer ce fichier avec votre éditeur préféré. Seulement, comment voir si la syntaxe de ce fichier est correcte ? C'est simple, après avoir modifié /etc/sudoers, tapez :
Si rien ne s'affiche : il est correcte, sinon vous obtiendrez quelque chose comme :
sudo: parse error in /etc/sudoers near line 18
Voilà, vous savez tout, enfin presque. ;-)
@ Retour à la rubrique Administration système
Copyright
© Frédéric Bonnaud 16/05/2001
Ce document est publié sous licence Creative Commons Attribution, Partage à l'identique 4.0 : https://creativecommons.org/licenses/by-sa/4.0/ |