Léa-Linux & amis :   LinuxFR   GCU-Squad   Zarb.Org   GNU
Admin-admin env-sudo


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 3.0 :
http://creativecommons.org/licenses/by-sa/3.0/
Affichages

Serveur hébergé par ST-Hebergement et Lost-Oasis / IRC hébergé par FreeNode / NS secondaire hébergé par XName
Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons CC-BY-SA