web-dev-qa-db-fra.com

Pourquoi Sudo change-t-il le PATH?

C'est la variable PATH sans Sudo:

$ echo 'echo $PATH' | sh 
/opt/local/Ruby/bin:/usr/bin:/bin

Voici la variable PATH avec Sudo:

$ echo 'echo $PATH' | Sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Autant que je sache, Sudo est supposé laisser PATH intact. Que se passe-t-il? Comment puis-je changer cela? (Ceci est sur Ubuntu 8.04).

UPDATE: pour autant que je sache, aucun des scripts démarrés à la racine ne modifie PATH de quelque manière que ce soit.

De man Sudo:

Pour éviter toute usurpation de commande, Sudo vérifie ". Notez cependant que la variable d'environnement PATH réelle n'est pas modifiée et qu'elle est transmise inchangée au programme exécuté par Sudo.

278
Michiel de Mare

C'est une fonction agaçanteune caractéristique de Sudo sur de nombreuses distributions.

Pour contourner ce "problème" sur Ubuntu, procédez comme suit dans mon ~/.bashrc

alias Sudo='Sudo env PATH=$PATH'

Notez que ce qui précède fonctionnera pour les commandes qui ne réinitialisent pas le $ PATH elles-mêmes. Cependant `su 'réinitialise son chemin $ PATH, vous devez donc utiliser -p pour le prévenir. C'EST À DIRE.:

Sudo su -p
234
pixelbeat

Au cas où quelqu'un d'autre traverserait cela et voudrait simplement désactiver toutes les variables de chemin changeant pour tous les utilisateurs.
Accédez à votre fichier sudoers à l’aide de la commande: visudo. Vous devriez voir la ligne suivante quelque part:

Valeurs par défaut env_reset

que vous devriez ajouter ce qui suit sur la ligne suivante

Valeurs par défaut! Secure_path

chemin_sécurité est activé par défaut. Cette option spécifie quoi faire $ PATH lorsque vous vous lancez. Le point d'exclamation désactive la fonctionnalité.

118
Jacob

PATH est une variable d'environnement et est donc réinitialisée par défaut par Sudo.

Vous devez avoir des autorisations spéciales pour pouvoir le faire.

De man Sudo

 -E Le -E (préserver l’environnement) l’option remplacera l’option env_reset 
 dans sudoers (5)). Il est disponible uniquement lorsque la commande match - 
 Ing comporte la balise SETENV ou que l’option setenv est définie dans Sudo - 
 Ers (5). 
 Les variables d’environnement à définir pour la commande peuvent également être transmises sur 
 La ligne de commande sous la forme suivante: VAR= valeur, par exemple 
 LD_LIBRARY_PATH=/usr/local/pkg/lib. Les variables passées sur la ligne de commande 
 Sont soumises aux mêmes restrictions que les variables d'environnement normales - 
, À une exception près. Si l'option setenv est définie dans 
 Sudoers, si la balise SETENV est définie pour la commande à exécuter ou si la commande 
 Correspond à TOUT, l'utilisateur peut définir des variables trop grandes pour - 
 Interdit. Voir sudoers (5) pour plus d’informations. 

Un exemple d'utilisation:

cat >> test.sh
env | grep "MYEXAMPLE" ;
^D
sh test.sh 
MYEXAMPLE=1 sh test.sh
# MYEXAMPLE=1
MYEXAMPLE=1 Sudo sh test.sh 
MYEXAMPLE=1 Sudo MYEXAMPLE=2 sh test.sh 
# MYEXAMPLE=2

mise à jour

 man 5 sudoers: 
 
 env_reset Si défini, Sudo réinitialisera l'environnement pour ne contenir que 
 le nom de fichier LOGNAME, Shell, USER, USERNAME et Sudo_ * 
 ables. Toutes les variables de l'environnement de l'appelant qui correspondent aux listes env_keep et env_check sont ensuite ajoutées. 
 Le contenu par défaut des listes env_keep et env_check 
 Est affiché lorsque Sudo est exécuté par root avec l'option 
 -V. Si Sudo a été compilé avec l'option SECURE_PATH 
, Sa valeur sera utilisée pour la variable d'environnement PATH 
. Ce drapeau est activé par défaut. 

Alors peut-être besoin de vérifier que ceci est/n’est pas compilé dans.

C'est par défaut dans Gentoo

# ( From the build Script )
....
ROOTPATH=$(cleanpath /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin${ROOTPATH:+:${ROOTPATH}})
....
econf --with-secure-path="${ROOTPATH}" 
32
Kent Fredric

On dirait que ce bug existe depuis un bon moment! Voici quelques références de bogues que vous pourriez trouver utiles (et que vous voudrez peut-être vous inscrire, voter, conseil, conseil ...):


Bug Debian # 85123 ("Sudo: SECURE_PATH ne peut toujours pas être remplacé") (à partir de 2001!)

Il semble que le bogue n ° 20996 soit toujours présent dans cette version de Sudo. Le journal des modifications indique qu'il peut être remplacé au moment de l'exécution, mais je n'ai pas encore découvert comment.

Ils mentionnent de mettre quelque chose comme ceci dans votre fichier sudoers:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin"

mais quand je le fais dans Ubuntu 8.10 au moins, cela me donne cette erreur:

visudo: unknown defaults entry `secure_path' referenced near line 10

Bug Ubuntu n ° 50797 ("Sudo construit avec --with-secure-path est problématique")

Pire encore, autant que je sache, il est impossible de spécifier le secure_path dans le fichier sudoers. Ainsi, si, par exemple, vous souhaitez offrir à vos utilisateurs un accès facile à quelque chose sous/opt, vous devez recompiler Sudo.


Oui. Il doit être un moyen de remplacer cette "fonctionnalité" sans avoir à recompiler. Rien de pire, alors que les gros problèmes de sécurité vous disent ce qu'il y a de mieux pour votre environnement et ne vous donnent pas le moyen de le désactiver.


C'est vraiment énervant. Il peut être judicieux de conserver le comportement actuel par défaut pour des raisons de sécurité, mais il devrait exister un moyen de le remplacer, autre que la recompilation à partir du code source! Beaucoup de gens ont besoin de l'héritage PATH. Je me demande pourquoi aucun responsable n’y a jeté un œil, alors qu’il semble facile de trouver une solution acceptable.


J'ai travaillé autour de ça comme ça:

mv /usr/bin/Sudo /usr/bin/Sudo.orig

puis créez un fichier/usr/bin/Sudo contenant les éléments suivants:

#!/bin/bash
/usr/bin/Sudo.orig env PATH=$PATH "$@"

alors votre Sudo habituel fonctionne comme le Sudo non sécurisé


bogue Ubuntu n ° 192651 ("le chemin Sudo est toujours réinitialisé")

Étant donné qu'un duplicata de ce bogue a été initialement enregistré en juillet 2006, je ne sais pas combien de temps un env_keep inefficace a été utilisé. Quels que soient les avantages de forcer les utilisateurs à utiliser des astuces telles que celles énumérées ci-dessus, les pages de manuel de Sudo et de Sudoers doivent refléter le fait que les options permettant de modifier PATH sont effectivement redondantes.

Modifier la documentation pour refléter l'exécution réelle n'est pas déstabilisant et très utile.


Bug Ubuntu # 226595 ("impossible de conserver/spécifier PATH")

Je dois pouvoir exécuter Sudo avec des dossiers binaires non std supplémentaires dans PATH. Ayant déjà ajouté mes exigences à/etc/environment, j’ai eu la surprise de recevoir des erreurs concernant des commandes manquantes lors de leur exécution sous Sudo .....

J'ai essayé ce qui suit pour résoudre ce problème sans succès:

  1. L'utilisation de l'option "Sudo -E" ne fonctionne pas. Mon PATH existant était toujours réinitialisé par Sudo

  2. Remplacer "Defaults env_reset" par "Defaults !env_reset" dans/etc/sudoers - également ne fonctionnait pas (même en combinaison avec Sudo -E)

  3. Décommenter env_reset (par exemple "#Defaults env_reset") dans/etc/sudoers - n'a également pas fonctionné.

  4. Ajouter 'Defaults env_keep += "PATH"' à ​​/ etc/sudoers - ne fonctionnait pas non plus.

Clairement - malgré la documentation de l'homme - Sudo est complètement codé en dur en ce qui concerne PATH et ne permet aucune flexibilité en ce qui concerne la conservation du nom de l'utilisateur PATH. Très ennuyeux car je ne peux pas utiliser de logiciel autre que celui par défaut avec les autorisations root avec Sudo.

17
Tyler Rick

Cela semblait fonctionner pour moi

Sudo -i 

qui prend le non-Sudo PATH

13
axsuul

Je pense qu’il est en fait souhaitable que Sudo réinitialise le PATH: sinon, un attaquant ayant compromis votre compte utilisateur pourrait placer des versions détournées de tous types d’outils sur le PATH de vos utilisateurs, qui seraient alors exécutés avec Sudo.

(Bien sûr, avoir Sudo réinitialisé le PATH n'est pas une solution complète à ce genre de problèmes, mais ça aide)

C’est bien ce qui se passe lorsque vous utilisez

Defaults env_reset

dans/etc/sudoers sans utiliser exempt_group ou env_keep.

Cela est également pratique car vous pouvez ajouter des répertoires qui ne sont utiles que pour root (comme /sbin et /usr/sbin) au chemin Sudo sans les ajouter aux chemins de vos utilisateurs. Pour spécifier le chemin à utiliser par Sudo:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"
11
Arnout Engelen
# cat .bash_profile | grep PATH
PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH

# cat /etc/sudoers | grep Defaults
Defaults    requiretty
Defaults    env_reset
Defaults    env_keep = "SOME_PARAM1 SOME_PARAM2 ... PATH"
4
daggerok

Il suffit de modifier env_keep dans /etc/sudoers

Cela ressemble à quelque chose comme ça:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE"

Il suffit d’ajouter PATH à la fin pour que, après le changement, cela ressemble à ceci:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE PATH"

Fermez le terminal et ouvrez-le à nouveau.

3
temp_sny

Mettez en commentaire "Defaults env_reset" dans/etc/sudoers

3
user297612

Secure_path est votre ami, mais si vous voulez vous libérer de secure_path, faites-le.

 Sudo visudo 

Et annexer

 Valeurs par défaut exempt_group = votre_groupe 

Si vous souhaitez exempter un groupe d'utilisateurs qui créent un groupe, ajoutez-y tous les utilisateurs et utilisez-le comme groupe exempt_groupe. homme 5 sudoers pour plus.

2
user378555

Vous pouvez également déplacer votre fichier dans un répertoire sudoers used:

    Sudo mv $HOME/bash/script.sh /usr/sbin/ 
1
LeGilles

la solution recommandée dans les commentaires sur la distribution OpenSUSE suggère de changer:

Defaults env_reset

à:

Defaults !env_reset

et ensuite probablement pour commenter la ligne suivante qui n'est pas nécessaire:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE    MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L    ANGUAGE LINGUAS XDG_SESSION_COOKIE"
1
inman320

commenter "Default env_reset" et "Defaults secure_path ..." dans le fichier/etc/sudoers fonctionne pour moi

1
user3622173

$ PATH est une variable d'environnement et cela signifie que la valeur de $ PATH peut différer pour un autre utilisateur.

Lorsque vous vous connectez à votre système, les paramètres de votre profil déterminent la valeur de $ PATH.

Regardons maintenant: -

User       |        Value of $PATH
--------------------------
root                /var/www
user1               /var/www/user1
user2               /var/www/html/private

Supposons que ce soient les valeurs de $ PATH pour différents utilisateurs. Désormais, lorsque vous exécutez une commande avec Sudo, le message est réellement utilisé root l'utilisateur exécute cette commande.

Vous pouvez confirmer en exécutant ces commandes sur le terminal: -

user@localhost$ whoami
username
user@localhost$ Sudo whoami
root
user@localhost$ 

C'est la raison. Je pense que c'est clair pour vous.

0
Deepak Dixit

Le PATH sera réinitialisé lors de l'utilisation de su ou de Sudo par la définition de ENV_SUPATH et de ENV_PATH définis dans /etc/login.defs.

0
Bradley Allen

Euh, ce n'est pas vraiment un test si vous n'ajoutez rien à votre chemin:

 bill @ bill-desktop: ~ $ ls -l /opt/pkg/bin[.____.terre 12, 
 - rwxr-xr-x 1 racine racine 28 2009-01-22 18 : 58 foo 
 Bill @ bill-desktop: ~ $ foo 
/Opt/pkg/bin/foo 
 Bill @ bill-desktop: ~ $ Sudo su 
 root @ bill-desktop:/home/bill # qui foo 
 root @ bill-desktop:/home/bill # 
0
BIll Broadley