Comment faire que sudo préserve mes variables d'environnement?

47

Utilisation de sudo 1.7.4p4 sous Solaris 5.10 et de sudo 1.6.7p5 sous RHEL4 u6 Je ne vois pas comment préserver mes variables d'environnement, par exemple $ PYTHONPATH. J'ai ajouté cette ligne à sudoers, mais cela ne fait aucune différence:

Defaults !env_reset

Est-ce que je fais quelque chose de mal ou l'installation sudo ne respecte-t-elle tout simplement pas le drapeau env_reset?

Edit: au moins sur Solaris, nous avons constaté que ce problème dépendait du shell! Le shell root standard est Bourne, mais si nous exécutons bash sous sudo ( sudo bash),! Env_preset préservera l'environnement (y compris PATH et LD_LIBRARY_PATH). C'est un comportement plutôt déroutant, je dois le dire.

aknuds1
la source
stackoverflow.com/questions/8633461/…
Ciro Santilli a commencé à jouer

Réponses:

44

Utilisez avec précaution, il y a des problèmes de sécurité avec sudo et les variables.

De man sudoersj'ai trouvé que vous devriez utiliser

Valeurs par défaut env_reset
Valeurs par défaut env_keep + = "PYTHONPATH OTHERVARIABLE YETANOTHER"

Dans Ubuntu, sudoconserve certaines variables. sudo -iest plus comme se connecter en tant que root et ensuite exécuter la commande. Les deux peuvent être gênants, le premier pour sudo nano myfilelaisser des fichiers appartenant à la racine à l'intérieur de votre maison et le second pour sudo -i nano myfileessayer d'ouvrir / root / monfichier.


Courir

sudo printenv PATH

et voir ce que ça donne. Ici ça donne

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

par exemple. Maintenant, lancez sudo visudoet ajoutez la ligne

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

en remplaçant par ce que vous avez trouvé juste avant. Ajoutez-y un nouveau chemin si vous en avez besoin.

A propos des bibliothèques:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Les distributions Linux prennent beaucoup de soin PATH, et vous devriez vraiment faire attention avant de jouer avec. Faites particulièrement attention en ajoutant des chemins comme " ." ou /home/username, cela n’est pas sécurisé.

L'un des dangers de l'ajout de chemins d'accès réside dans le fait que des fichiers se trouvant sur ces chemins rootpeuvent être exécutés , ouvrant ainsi une fenêtre dans le système de sécurité pouvant être exploitée par des logiciels malveillants. Il peut y avoir d'autres dangers. Assurez-vous simplement de savoir ce que vous faites. Ignorer sudoles mesures de sécurité peut rendre votre Solaris aussi sûr que Windows XP.

utilisateur39559
la source
Merci pour la suggestion. Sous Solaris au moins, il semble que env_keep ne fonctionne que partiellement, car il ignore PATH et LD_LIBRARY_PATH. Peut-être que sudo est construit avec des paramètres qui le font refuser de conserver des variables "dangereuses"?
aknuds1
Est-ce que cela a fonctionné avec un autre vairable, comme AKNUDS? Vous pouvez aussi lancer sudo sudo -V (oui, deux fois sudo!) Et voir ce qui est écrit. Ici, la solution ci-dessus fonctionne bien avec PYTHONPATH, mais PATH semble vraiment spécial. Le vrai problème est avec PATH. Dans Ubuntu, ils construisent sudo en rétablissant délibérément PATH.
user39559
env_keep a préservé PYTHONPATH et HOME pour moi, donc il y a clairement un filtrage en cours.
aknuds1
Dans votre solution révisée, vous proposez que je câble le chemin sudo en modifiant Secure_path, n'est-ce pas? Je ne pense pas que je veuille faire ça. Nous sommes probablement sur le point de répondre à ma question cependant; Je pense que sudo est conçu pour ignorer reset_env et pour ignorer des variables telles que PATH et LD_LIBRARY_PATH, lorsqu'elles sont spécifiées avec env_keep. Je pense que je peux faire sans conserver PATH / LD_LIBRARY_PATH sous sudo, ce n'est pas grave, mais il est toujours intéressant de savoir pourquoi cela ne fonctionnera pas :)
aknuds1
Cela ne fonctionnera pas parce que les sudoécrivains ont fait attention à vous empêcher de le faire. Vous ne voulez pas que des bibliothèques malveillantes soient chargées car elles ont été trouvées dans le chemin utilisé par sudo. Donc, c'est pourquoi il est réinitialisé. Si vous codez des éléments destinés à être exécutés par root, copiez-les dans le répertoire système approprié.
user39559
8

Il sudoersfaut jouer avec beaucoup de prudence, comme d’autres l’ont dit.

Une approche plus simple pour les cas plus simples lorsque vous souhaitez préserver des variables d'environnement particulières consiste à simplement transmettre la variable d'environnement souhaitée directement à l'aide de sudo (comme indiqué [VAR=value]dans l'aide de la commande sudo cmdline).

Voir ce petit exemple où je l'ai également démontré pour plus d'une variable.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Pour l' PYTHONPATHexemple original dans la question, utilisez simplement ce qui suit:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Créer un alias pour ce genre de chose est pratique. Ainsi:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'
Russ
la source
1
pourrait être bon de faire cela - alias sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - puis utilisez-le sudopy some_script.py
Capable Mac
@AbleMac Vous avez raison. C'était une erreur ... Je vais le réparer. Merci!
Russ
3

Votre Defaults !env_resetapparence est correcte, à condition que vous n'appeliez pas également sudo avec l' -Eoption.

Vous pouvez essayer de supprimer complètement cette entrée.

Avez-vous vérifié que vous éditez le bon fichier sudoers? Je suppose que cela pourrait être /etc/sudoersou en /usr/local/etc/sudoersfonction de la façon dont il a été installé. Avez-vous édité en utilisant visudo?

Comment ça va sudo? sudo python, sudo su, sudo su -, sudo -s, Autre chose? Seulement sudo pythonet sudo supréserverait votre environnement.

Que env | grep PYTHONPATHdit-on? S'il n'y a rien, assurez-vous que PYTHONPATH est exporté en exécutant export PYTHONPATHet essayez à nouveau.

Que sudo env | grep PYTHONPATHdit-on? S'il imprime la valeur attendue, quelque chose d'autre remplace votre valeur PYTHONPATH. Peut-être que root .bashrc ou .bash_profile ou les fichiers de configuration du système.

Mikel
la source
1
Je suis à peu près sûr d’éditer les bons sudoers, avec le préfixe d’installation correspondant à sudo. Je cours sudo comme "sudo su". Je vais devoir vous revenir dans quelques jours, malheureusement, au reste de vos suggestions. Merci!
aknuds1
1
Essayez de changer un paramètre sans importance comme editorou passpromptpour voir si vous avez le bon fichier. Ou utilisez strace, dtrace, botte ou similaire et voyez quels fichiers il ouvre.
Mikel
env | grep PYTHONPATH car mon utilisateur imprime la valeur attendue. Sous sudo, rien n’est imprimé. En modifiant les sudoers, je peux m'assurer que PYTHONPATH est préservé en modifiant "env_keep". Cependant, env_keep ne conservera pas PATH ou LD_LIBRARY_PATH. Je suppose que sudo a une restriction de sécurité pour ne pas conserver des variables telles que PATH et LD_LIBRARY_PATH? Un réglage de temps de construction peut-être?
aknuds1
1
! env_reset est ignoré pour autant que je sache, mais je peux vérifier demain. Je suis à peu près sûr que env_delete n'est pas défini, mais je peux aussi le vérifier.
aknuds1
1
J'ai confirmé que! Env_reset est ignoré et env_delete n'est pas défini.
aknuds1
-1

Selon la documentation Ubuntu pour LD_LIBRARY_PATH :

Vous devez utiliser les fichiers de configuration /etc/ld.so.conf.d/*.conf.

Ensuite:

  1. Ajoutez un ld.sofichier de configuration /etc/ld.so.conf.d/avec le chemin de votreLD_LIBRARY_PATH

  2. Mettez à jour le cache avec:

    sudo ldconfig -v
    
OlPo
la source
Bien, mais la question ne concerne pas Ubuntu. Astuce: La prochaine fois, regardez les étiquettes sous la question.
DavidPostill