« Sudo » : différence entre les versions
Aucun résumé des modifications |
(balises code) |
||
Ligne 8 : | Ligne 8 : | ||
== Introduction == | == Introduction == | ||
Supposons que vous souhaitiez lancer la commande < | Supposons que vous souhaitiez lancer la commande <tt>/sbin/halt</tt>, dans ce cas vous avez plusieurs possibilités : | ||
* vous lancez la commande : | * vous lancez la commande : | ||
< | <tt>su -c /sbin/halt | ||
</ | </tt> | ||
qui vous demande le mot de passe root, on peut utiliser l'astuce suivante pour s'en affranchir : | qui vous demande le mot de passe root, on peut utiliser l'astuce suivante pour s'en affranchir : | ||
< | <tt>su -c /sbin/halt < root.pw | ||
</ | </tt> | ||
où < | où <tt>root.pw</tt> 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 : [[Dev-suid_scripts|SUID Scripts]]): | * vous pouvez activer le suid-bit (voir : [[Dev-suid_scripts|SUID Scripts]]): | ||
< | <tt>chmod +s /sbin/halt | ||
</ | </tt> | ||
(il faut être root pour pouvoir faire cela) <br /> et ensuite, n'importe quelle personne ayant les droits d'exécutions sur < | (il faut être root pour pouvoir faire cela) <br /> et ensuite, n'importe quelle personne ayant les droits d'exécutions sur <tt>/sbin/halt</tt> 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. | * vous pouvez utiliser sudo, c'est ce que nous allons voir dans la suite de ce document. | ||
La commande < | La commande <tt>sudo</tt> est presque toujours fournie avec votre distribution, mais n'est parfois pas installée automatiquement. Le paquetage doit s'appeler <tt>sudo-xxxxxx</tt>. | ||
== Exemples d'utilisation == | == Exemples d'utilisation == | ||
Ligne 57 : | Ligne 57 : | ||
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 : | 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 : | ||
<div class="code"><span style="font-weight: bold;">User_Alias</span> | <div class="code"><span style="font-weight: bold;">User_Alias</span> NOM_DU_GROUP = user1, user2, ... , usern</div> | ||
<span style="text-decoration: underline;">Exemples :</span> | <span style="text-decoration: underline;">Exemples :</span> | ||
<div class="code"><span style="font-weight: bold;">User_Alias</span> | <div class="code"><span style="font-weight: bold;">User_Alias</span> PPPUSERS = fred, bibi, jice, serge <br /><span style="font-weight: bold;">User_Alias</span> HALTUSERS = fred, bibi <br /><span style="font-weight: bold;">User_Alias</span> ROOT_FRIENDS = jice, serge, fred</div> | ||
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 : | 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 : | ||
<div class="code"><span style="font-weight: bold;">Host_Alias</span> | <div class="code"><span style="font-weight: bold;">Host_Alias</span> NOM_DU_GROUP = host1, host2, ... , hostn</div> | ||
<span style="text-decoration: underline;">Exemples :</span> | <span style="text-decoration: underline;">Exemples :</span> | ||
<div class="code"><span style="font-weight: bold;">Host_Alias</span> | <div class="code"><span style="font-weight: bold;">Host_Alias</span> ICI = localhost, 192.168.1.1, ma.machine.fr <br /><span style="font-weight: bold;">Host_Alias</span> LABAS = www.tuxfamily.org, talk.revolink.com, 233.12.66.4 <br /><span style="font-weight: bold;">Host_Alias</span> WWW = www*, mail*, pop*, *fr</div> | ||
(Le groupe WWW contient toutes les machines dont les noms commencent par www, mail et pop ou finissent par fr). | (Le groupe WWW contient toutes les machines dont les noms commencent par www, mail et pop ou finissent par fr). | ||
Ligne 75 : | Ligne 75 : | ||
Puis, il faut créer un groupe contenant les utilisateurs pour lesquels on souhaite se faire passer : | Puis, il faut créer un groupe contenant les utilisateurs pour lesquels on souhaite se faire passer : | ||
<div class="code"><span style="font-weight: bold;">Runas_Alias</span> | <div class="code"><span style="font-weight: bold;">Runas_Alias</span> NOM_DU_GROUP = user1, ... , usern</div> | ||
<span style="text-decoration: underline;">Exemple :</span> | <span style="text-decoration: underline;">Exemple :</span> | ||
<div class="code"><span style="font-weight: bold;">Runsas_Alias</span> | <div class="code"><span style="font-weight: bold;">Runsas_Alias</span> USERPPP = pppuser, serialuser</div> | ||
Enfin, on peut grouper les commandes que l'on va autoriser à exécuter pour le compte de quelqu'un d'autre : | Enfin, on peut grouper les commandes que l'on va autoriser à exécuter pour le compte de quelqu'un d'autre : | ||
<div class="code"><span style="font-weight: bold;">Cmnd_Alias</span> | <div class="code"><span style="font-weight: bold;">Cmnd_Alias</span> NOM_DU_GROUP = cmd1, ... , cmdn</div> | ||
<span style="text-decoration: underline;">Exemples :</span> | <span style="text-decoration: underline;">Exemples :</span> | ||
<div class="code"><span style="font-weight: bold;">Cmnd_Alias</span> | <div class="code"><span style="font-weight: bold;">Cmnd_Alias</span> STOPPC = /sbin/halt, /sbin/reboot, !/sbin/shutdown -*, /sbin/shutdown -r, /sbin/shutdown -h <br /><span style="font-weight: bold;">Cmnd_Alias</span> PPPCMD = /etc/ppp/scripts/pppconnect, /etc/ppp/scripts/pppdisconnect</div> | ||
Cela regroupe les commandes <span class="code">/sbin/halt</span>, <span class="code">/sbin/reboot</span> et <span class="code">/sbin/shutdown</span> mais uniquement si celui-ci est suivi de <span class="code">-r</span> ou <span class="code">-h</span> (<span class="code">halt</span> ou <span class="code">reboot</span> tout de suite) aucune autre option ne sera acceptée (c'est le <span class="code">!</span> qui veut dire 'pas' la commande décrite par <span class="code">/sbin/shutdown -*</span> , ie: toute commande <span class="code">shutdown</span> ayant une option). | Cela regroupe les commandes <span class="code">/sbin/halt</span>, <span class="code">/sbin/reboot</span> et <span class="code">/sbin/shutdown</span> mais uniquement si celui-ci est suivi de <span class="code">-r</span> ou <span class="code">-h</span> (<span class="code">halt</span> ou <span class="code">reboot</span> tout de suite) aucune autre option ne sera acceptée (c'est le <span class="code">!</span> qui veut dire 'pas' la commande décrite par <span class="code">/sbin/shutdown -*</span> , ie: toute commande <span class="code">shutdown</span> ayant une option). | ||
Ligne 93 : | Ligne 93 : | ||
Maintenant, donnons des droits par : | Maintenant, donnons des droits par : | ||
<div class="code"> | <div class="code">GROUPE_DE_USER GROUPE_D_HOST = <span style="text-decoration: underline;">(GROUPE_DE_RUNAS)NOPASSWD:</span> GROUPE_DE_COMMANDES</div> | ||
(Le <span class="code">NOPASSWD:</span> est facultatif : il signifie que le mot de passe de l'utilisateur pour lequel on veut se faire passer ne sera pas demandé ; si <span class="code">(GROUP_DE_RUNAS)</span> est omis c'est que l'on n'autorise qu'à se faire passer pour root). <br /><span style="text-decoration: underline;">Exemples :</span> | (Le <span class="code">NOPASSWD:</span> est facultatif : il signifie que le mot de passe de l'utilisateur pour lequel on veut se faire passer ne sera pas demandé ; si <span class="code">(GROUP_DE_RUNAS)</span> est omis c'est que l'on n'autorise qu'à se faire passer pour root). <br /><span style="text-decoration: underline;">Exemples :</span> | ||
<div class="code"> | <div class="code">fred localhost = (<span style="font-weight: bold;">ALL</span>) <span style="font-weight: bold;">ALL</span>, (root) !<span style="font-weight: bold;">ALL</span></div> | ||
signifie que fred peut lancer pour le compte de n'importe qui (premier <span class="code">ALL</span>) n'importe quelle commande (second <span class="code">ALL</span>), sauf qu'il ne peut lancer aucune commande pour le compte de <span class="code">root</span> (<span class="code">!ALL</span>). Mais cela n'est qu'un exemple n'utilisant pas les groupes; réparons cet oubli : | signifie que fred peut lancer pour le compte de n'importe qui (premier <span class="code">ALL</span>) n'importe quelle commande (second <span class="code">ALL</span>), sauf qu'il ne peut lancer aucune commande pour le compte de <span class="code">root</span> (<span class="code">!ALL</span>). Mais cela n'est qu'un exemple n'utilisant pas les groupes; réparons cet oubli : | ||
<div class="code"> | <div class="code">PPPUSERS MONRESEAU = (USERPPP) <span style="font-weight: bold;">NOPASSWD</span><nowiki>: /sbin/pppd, PPPCMD</nowiki></div> | ||
tous les utilisateurs listés dans <span class="code">PPPUSERS</span>, s'ils se connectent depuis une machine listée dans <span class="code">MONRESEAU</span>, peuvent se faire passer pour un utilisateur listé dans <span class="code">USERPPP</span> pour exécuter <span class="code">/sbin/ppp</span> ou une commande listée dans <span class="code">PPPCMD</span>. | tous les utilisateurs listés dans <span class="code">PPPUSERS</span>, s'ils se connectent depuis une machine listée dans <span class="code">MONRESEAU</span>, peuvent se faire passer pour un utilisateur listé dans <span class="code">USERPPP</span> pour exécuter <span class="code">/sbin/ppp</span> ou une commande listée dans <span class="code">PPPCMD</span>. | ||
<div class="code"> | <div class="code">john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*</div> | ||
L'utilisateur john peut lancer la commande <span class="code">su</span> depuis une machine listée dans <span class="code">ALPHA</span> mais pas <span class="code">su</span> tout seul, ni <span class="code">su root</span> ni <span class="code">su</span> suivi d'un quelconque flag (<span class="code"> [!-]* </span>). | L'utilisateur john peut lancer la commande <span class="code">su</span> depuis une machine listée dans <span class="code">ALPHA</span> mais pas <span class="code">su</span> tout seul, ni <span class="code">su root</span> ni <span class="code">su</span> suivi d'un quelconque flag (<span class="code"> [!-]* </span>). | ||
<div class="code">+ | <div class="code">+secretaires LOCALE = PRINTING_CMDS, /usr/sbin/adduser [A-z]*</div> | ||
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 <span class="code">/etc/group</span>), ici les personnes appartenant au groupe 'secretaires' (dans <span class="code">/etc/group</span>, il y a une ligne : <span class="code">secretaire:xxxx:user1, user2,... ,usern</span> : ce sont les utilisateurs <span class="code">user1</span> à <span class="code">usern</span> qui sont considérés) ont droit de lancer les commandes du groupe <span class="code">PRINTINGCMDS</span> ainsi que la commande <span class="code">/usr/sbin/adduser</span> pourvu que celui-ci soit suivi d'un nom d'utilisateur. | 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 <span class="code">/etc/group</span>), ici les personnes appartenant au groupe 'secretaires' (dans <span class="code">/etc/group</span>, il y a une ligne : <span class="code">secretaire:xxxx:user1, user2,... ,usern</span> : ce sont les utilisateurs <span class="code">user1</span> à <span class="code">usern</span> qui sont considérés) ont droit de lancer les commandes du groupe <span class="code">PRINTINGCMDS</span> ainsi que la commande <span class="code">/usr/sbin/adduser</span> pourvu que celui-ci soit suivi d'un nom d'utilisateur. | ||
Ligne 115 : | Ligne 115 : | ||
Vous trouverez plus d'exemples dans <span class="code">man sudoers</span>. | Vous trouverez plus d'exemples dans <span class="code">man sudoers</span>. | ||
=== Mon < | === Mon <tt>/etc/sudoers</tt> === | ||
Voilà mon /etc/sudoers : | Voilà mon /etc/sudoers : | ||
<div class="code"><nowiki># sudoers file. </nowiki><br /> # <br /> # Host alias specification <br /> Host_Alias ICI = localhost <br /> Host_Alias LOCALNET = 192.168.1.* <br /><br /> # User alias specification <br /> User_Alias ROOT_FRIENDS = fred, bibi <br /><br /> # Cmnd alias specification <br /> Cmnd_Alias SOUND = /usr/bin/xmms <br /> Cmnd_Alias SHUTDOWN = /sbin/shutdown, \ <br /> | <div class="code"><nowiki># sudoers file. </nowiki><br /> # <br /> # Host alias specification <br /> Host_Alias ICI = localhost <br /> Host_Alias LOCALNET = 192.168.1.* <br /><br /> # User alias specification <br /> User_Alias ROOT_FRIENDS = fred, bibi <br /><br /> # Cmnd alias specification <br /> Cmnd_Alias SOUND = /usr/bin/xmms <br /> Cmnd_Alias SHUTDOWN = /sbin/shutdown, \ <br /> /sbin/halt, \ <br /> /sbin/reboot <br /> Cmnd_Alias PPPCMD = /etc/ppp/scripts/pppconnect, \ <br /> /etc/ppp/scripts/pppdisconnect <br /> Cmnd_Alias PRINTINGCMDS = /usr/bin/lpq, \ <br /> /usr/bin/lprm <br /> # Runas alias specification <br /> # User privilege specification <br /> # root peut tout ! <br /> root ALL=(ALL) ALL <br /> # Les amis de root peuvent lancer les commandes <br /> # du groupe SHUTDOWN <br /> ROOT_FRIENDS ICI = NOPASSWD: SHUTDOWN <br /> # ils peuvent aussi administrer l'imprimante (mais sous <br /> # le compte de lpadmin, avec un mot de passe) : <br /> ROOT_FRIENDS ICI = PRINTINGCMDS <br /> # tout le monde peux lancer xmms avec les droit de root (pour le <br /> # mode 'temps réel') en local <br /> ALL ICI = NOPASSWD: SOUND <br /> # tout le monde sur le réseau local peut demander l'établisement <br /> # de la liaison internet <br /> ALL LOCALNET = NOPASSWD: PPPCMD <br /> </div> | ||
Il n'est pas très complexe, mais permet d'éviter de mettre des programmes suid (c'est toujours dangereux) ! | Il n'est pas très complexe, mais permet d'éviter de mettre des programmes suid (c'est toujours dangereux) ! |
Version du 21 mai 2012 à 21:14
Lancer des commandes avec les droits de root
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, Contexte non commercial 2.0 : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ |