« Sudo » : différence entre les versions

De Lea Linux
Aller à la navigation Aller à la recherche
m (→‎Introduction : lien, <code>, remplacement des listes numérotées)
(licence ; cf page de discussion)
(3 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
[[Category:Environnement système]]
[[Catégorie:Administration système]]
 
= Lancer des commandes avec les droits de root =
= Lancer des commandes avec les droits de root =


<div class="leatitre">Lancer des commandes avec les droits de root</div><div class="leapar">par Fred</div><div class="leadesc">Comment exécuter une commande avec les droits de root sans utiliser le suid-bit.</div>
par [[Utilisateur:Fred|Fred]]
----
 
Comment exécuter une commande avec les droits de root sans utiliser le suid-bit.


== Introduction ==
== Introduction ==


Supposons que vous souhaitiez lancer la commande <code>/sbin/halt</code>, dans ce cas vous avez plusieurs possibilités :
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 :
<code>su -c /sbin/halt
<tt>su -c /sbin/halt
</code>
</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 :
<code>su -c /sbin/halt &lt; root.pw
<tt>su -c /sbin/halt < root.pw
</code>
</tt>
où <code>root.pw</code> 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)
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]]):
<code>chmod +s /sbin/halt
<tt>chmod +s /sbin/halt
</code>
</tt>
(il faut être root pour pouvoir faire cela) <br /> et ensuite, n'importe quelle personne ayant les droits d'exécutions sur <code>/sbin/halt</code> 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).
(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 <code>sudo</code> est presque toujours fournie avec votre distribution, mais n'est parfois pas installée automatiquement. Le paquetage doit s'appeler <code>sudo-xxxxxx</code>.
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 56 : Ligne 58 :
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>    NOM_DU_GROUP = user1, user2, ... , usern</div>
<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>    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>
<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>    NOM_DU_GROUP = host1, host2, ... , hostn</div>
<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>    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>
<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 74 : Ligne 76 :
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>    NOM_DU_GROUP = user1, ... , usern</div>
<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>    USERPPP = pppuser, serialuser</div>
<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>    NOM_DU_GROUP = cmd1, ... , cmdn</div>
<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>    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>
<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 92 : Ligne 94 :
Maintenant, donnons des droits par :
Maintenant, donnons des droits par :


<div class="code">GROUPE_DE_USER    GROUPE_D_HOST = <span style="text-decoration: underline;">(GROUPE_DE_RUNAS)NOPASSWD:</span> GROUPE_DE_COMMANDES</div>
<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">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>
<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">PPPUSERS    MONRESEAU = (USERPPP) <span style="font-weight: bold;">NOPASSWD</span><nowiki>: /sbin/pppd, PPPCMD</nowiki></div>
<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">john           ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*</div>
<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">+secretaires    LOCALE = PRINTING_CMDS, /usr/sbin/adduser [A-z]*</div>
<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 114 : Ligne 116 :
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 <code>/etc/sudoers</code> ===
=== 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 />                       /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>
<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) !
Ligne 133 : Ligne 135 :


Voilà, vous savez tout, enfin presque. ;-)
Voilà, vous savez tout, enfin presque. ;-)
<br/>
<br/>
'''<b>[[Admin-index|@ Retour à la rubrique Administration système]]</b>'''
<br/>


<div class="merci">Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Frédércic Bonnaud le 16/05/2001.</div>
<div class="merci">Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Frédércic Bonnaud le 16/05/2001.</div>




{{Copy|Frédéric Bonnaud|16/05/2001|CC-BY-NC-SA}}
{{Copy|[[Utilisateur:Fred|Frédéric Bonnaud]]|16/05/2001|CC-BY-SA}}

Version du 26 juin 2013 à 15:42


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 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)

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 :

sudo /sbin/halt

qui lance la commande /sbin/halt en tant que root (si l'utilisateur qui tape cette commande est autorisé à la lancer par sudo).

sudo -u fred /etc/ppp/scripts/pppconnect

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 :

sudo su fred

peut être autorisée, alors que :

sudo su root
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 :

EDITOR="/usr/bin/monediteur" visudo

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 :

User_Alias NOM_DU_GROUP = user1, user2, ... , usern

Exemples :

User_Alias PPPUSERS = fred, bibi, jice, serge
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 :

Host_Alias NOM_DU_GROUP = host1, host2, ... , hostn

Exemples :

Host_Alias ICI = localhost, 192.168.1.1, ma.machine.fr
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 :

Runas_Alias NOM_DU_GROUP = user1, ... , usern

Exemple :

Runsas_Alias USERPPP = pppuser, serialuser

Enfin, on peut grouper les commandes que l'on va autoriser à exécuter pour le compte de quelqu'un d'autre :

Cmnd_Alias NOM_DU_GROUP = cmd1, ... , cmdn

Exemples :

Cmnd_Alias STOPPC = /sbin/halt, /sbin/reboot,  !/sbin/shutdown -*, /sbin/shutdown -r, /sbin/shutdown -h
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 :

GROUPE_DE_USER GROUPE_D_HOST = (GROUPE_DE_RUNAS)NOPASSWD: GROUPE_DE_COMMANDES

(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 :

fred localhost = (ALL) ALL, (root) !ALL

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 :

PPPUSERS MONRESEAU = (USERPPP) NOPASSWD: /sbin/pppd, PPPCMD

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.

john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

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 ( [!-]* ).

+secretaires LOCALE = PRINTING_CMDS, /usr/sbin/adduser [A-z]*

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 :

# sudoers file.
#
# 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 :

sudo -v

Si rien ne s'affiche : il est correcte, sinon vous obtiendrez quelque chose comme :

>>> sudoers file: syntax error, line 18 <<<
sudo: parse error in /etc/sudoers near line 18

Voilà, vous savez tout, enfin presque. ;-)



@ Retour à la rubrique Administration système

Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Frédércic Bonnaud le 16/05/2001.


Copyright

© Frédéric Bonnaud 16/05/2001

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike icon
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique 4.0 :
https://creativecommons.org/licenses/by-sa/4.0/