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.
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
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é.
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
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}"
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:
L'utilisation de l'option "
Sudo -E
" ne fonctionne pas. Mon PATH existant était toujours réinitialisé par SudoRemplacer "
Defaults env_reset
" par "Defaults !env_reset
" dans/etc/sudoers - également ne fonctionnait pas (même en combinaison avec Sudo -E)Décommenter
env_reset
(par exemple "#Defaults env_reset
") dans/etc/sudoers - n'a également pas fonctionné.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.
Cela semblait fonctionner pour moi
Sudo -i
qui prend le non-Sudo PATH
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"
# 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"
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.
Mettez en commentaire "Defaults env_reset" dans/etc/sudoers
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.
Vous pouvez également déplacer votre fichier dans un répertoire sudoers used:
Sudo mv $HOME/bash/script.sh /usr/sbin/
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"
commenter "Default env_reset" et "Defaults secure_path ..." dans le fichier/etc/sudoers fonctionne pour moi
$ 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.
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.
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 #