Passer PATH via sudo

13

En bref : comment faire sudo pour ne pas vider PATH à chaque fois?

J'ai des sites Web déployés sur mon serveur (test Debian) écrits avec Ruby on Rails. J'utilise Mongrel + Nginx pour les héberger, mais il y a un problème qui survient lorsque j'ai besoin de redémarrer Mongrel (par exemple après avoir apporté quelques modifications).

Tous les sites sont vérifiés dans VCS (git, mais ce n'est pas important) et le propriétaire et le groupe sont définis sur mon utilisateur, tandis que Mongrel s'exécute sous l'utilisateur, hein, bâtard qui est sévèrement restreint dans ses droits. Mongrel doit donc être démarré sous root (il peut changer automatiquement d'UID) ou mongrel.

Pour gérer mongrel, j'utilise mongrel_cluster gem car il permet de démarrer ou d'arrêter n'importe quelle quantité de serveurs Mongrel avec une seule commande. Mais il faut que le répertoire /var/lib/gems/1.8/bin soit dans PATH: cela ne suffit pas pour le démarrer avec un chemin absolu .

La modification de PATH dans root .bashrc n'a rien changé, les réglages env_reset et env_keep de sudo non plus.

Donc la question: comment ajouter un répertoire à PATH ou conserver le PATH de l'utilisateur dans sudo?

Mise à jour: quelques exemples

$ env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ sudo cat /etc/sudoers | egrep -v '^$|^#'
Defaults    env_keep = "PATH"
root    ALL=(ALL) ALL
%sudo ALL=NOPASSWD: ALL
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Je peux aussi dire que cela fonctionne exactement de cette façon dans Debian stable (lenny) aussi.

whitequark
la source

Réponses:

12

Aux prises avec le même problème pendant quelques heures. Dans debian lenny, vous pouvez le corriger en ajoutant

Defaults        exempt_group=<your group> 

dans le fichier sudoers.

C'est le seul moyen de contourner l'option --secure-path compilée (pour autant que je sache).

Notamment, cela permettra également aux utilisateurs de ne pas avoir à saisir leur mot de passe lors de leur sudo.

Rob
la source
3

Si vous vous êtes secure_pathinstallé /etc/sudoers, vous pouvez jouer avec env_reset/ env_keeptout ce que vous aimez et cela ne fera aucune différence sur le chemin. Si vous voyez quelque chose comme ça, commentez-le.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Draemon
la source
Non, bien sûr, ce n'était pas réglé.
whitequark
0

Je dirais que regardez dans les options env_reset et env_keep dans man sudo . Mais il semble que vous l'ayez déjà fait (vous appelez juste par erreur env_keep "keepenv"). Si vous désactivez l'option env_reset (la valeur par défaut est activée), je pense que ce n'est pas censé effacer les variables env. Mais c'est moins sûr.

Il y a aussi une option secure_path pour sudo; Je pense que cela est activé par défaut. Vous pouvez essayer de le désactiver.

Les options précédentes sont définies dans votre fichier / etc / sudoers. Il y a aussi l' -ioption de ligne de commande pour sudo. Cela entraînera sudo à exécuter /root/.profile ou /root/.login. Vous pouvez y définir le chemin souhaité.

dubiousjim
la source
1
Non, lorsque env_reset est désactivé, il change (et n'efface pas) le CHEMIN. Cela est probablement fait pour ajouter des répertoires / * / sbin. Non, l'option -i ne convient pas car elle démarre un shell interactif et je n'ai besoin que d'exécuter une commande.
whitequark
D'accord, le problème a disparu après la réinstallation de Debian (à cause de la migration vers LVM) et aussi de RubyGems; votre réponse a été la plus utile de toutes, elle peut donc être acceptée maintenant.
whitequark
-1

Eh bien, vous faites quelque chose de mal. De plus, vous n'avez pas spécifié ce que vous avez fait avec votre fichier / etc / sudoers. Voici ce que vous auriez dû faire - c'est un système CentOS, BTW:

Tout d'abord, c'est avec le bon paramètre env_keep (notez que PATH est là):

sudo grep -5 PATH / etc / sudoers par défaut env_keep = "AFFICHAGE DES COULEURS HOSTNAME HISTSIZE INPUTRC KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \ LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY lc_name LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUE LINGUAS \ _XKB_CHARSET XAUTHORITY PATH"

Defaults   timestamp_timeout = 15 

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple

-> export PATH=$PATH:hithere
-> sudo sh -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:hithere

Cela semble bon. Supprimons maintenant le paramètre env_keep et réessayons:

-> sudo visudo
-> sudo grep -5 PATH /etc/sudoers
                    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                    LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                    LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                    _XKB_CHARSET XAUTHORITY"
 #_XKB_CHARSET XAUTHORITY PATH"

Quel triste CHEMIN:

 -> sudo sh -c 'echo $PATH'
 /usr/bin:/bin
Emmel
la source
1
J'ai vérifié cela PLUS de deux fois! Vérifiez la mise à jour en post.
whitequark
J'ai le même problème, j'ai définitivement les bons paramètres que vous mentionnez
Draemon