Jak sprawić, by sudo zachowało moje zmienne środowiskowe?

47

Używanie sudo 1.7.4p4 na Solarisie 5.10 i sudo 1.6.7p5 na RHEL4 u6 Nie widzę, jak zachować moje zmienne środowiskowe, na przykład $ PYTHONPATH. Dodałem tę linię do sudoers, ale to nie robi żadnej różnicy:

Defaults !env_reset

Czy robię coś źle, czy też instalacja sudo po prostu nie przestrzega flagi env_reset?

Edycja: Przynajmniej w systemie Solaris odkryliśmy, że ten problem zależy od powłoki! Standardową powłoką root jest Bourne, jeśli uruchomimy bash w sudo ( sudo bash), z drugiej strony!! Env_preset zachowa środowisko (w tym PATH i LD_LIBRARY_PATH). Jest to dość mylące zachowanie, które muszę powiedzieć.

aknuds1
źródło
stackoverflow.com/questions/8633461/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

44

Używaj ostrożnie, występują problemy z bezpieczeństwem sudo i zmiennych.

Od man sudoersznalazłem, że powinieneś użyć

Domyślnie env_reset
Domyślne env_keep + = "PYTHONPATH OTHERVARIABLE YETANOTHER"

W Ubuntu sudozachowuje niektóre zmienne. sudo -iprzypomina bardziej logowanie się jako root, a następnie uruchomienie polecenia. Oba mogą być niewygodne, pierwszy z nich sudo nano myfilepozostawia pliki root w twoim domu, a drugi sudo -i nano myfilepróbuje spróbować otworzyć / root / myfile.


Biegać

sudo printenv PATH

i zobacz co daje. Tutaj daje

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

na przykład. Teraz uruchom sudo visudoi dodaj linię

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

zastępując to, co znalazłeś przed chwilą. W razie potrzeby dodaj do niego nową ścieżkę.

O bibliotekach:

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

Dystrybucje Linuksa zachowują dużą ostrożność PATHi naprawdę powinieneś być ostrożny przed rozpoczęciem gry. Zachowaj szczególną ostrożność, dodając ścieżki takie jak „ .” lub /home/username, ponieważ nie jest to bezpieczne.

Jednym z niebezpieczeństw dodawania ścieżek jest to, że otwiera się możliwość wykonania plików na tych ścieżkach root, otwierając okna w systemie bezpieczeństwa, które mogą być wykorzystane przez złośliwe oprogramowanie. Mogą istnieć inne niebezpieczeństwa. Upewnij się tylko, że wiesz, co robisz. Ominięcie sudośrodków bezpieczeństwa może uczynić system Solaris tak bezpiecznym, jak system Windows XP.

użytkownik39559
źródło
Dzieki za sugestie. Przynajmniej w Solarisie wydaje się, że env_keep działa tylko częściowo, ponieważ ignoruje PATH i LD_LIBRARY_PATH. Może sudo ma wbudowane ustawienia, które uniemożliwiają zachowanie „niebezpiecznych” zmiennych?
aknuds1
Czy działało z innym vairable, jak AKNUDS? Możesz także uruchomić sudo sudo -V (tak, dwa razy sudo!) I zobaczyć, co mówi. Tutaj powyższe rozwiązanie działa dobrze z PYTHONPATH, ale PATH naprawdę wydaje się wyjątkowy. Prawdziwy problem dotyczy PATH. W Ubuntu budują sudo celowo resetując ŚCIEŻKĘ.
user39559
env_keep zachował dla mnie PYTHONPATH i HOME, więc najwyraźniej trwa filtrowanie.
aknuds1
W swoim zmienionym rozwiązaniu sugerujesz, żebym na stałe wprowadził ścieżkę sudo PATH poprzez zmodyfikowanie ścieżki bezpiecznej, prawda? Nie sądzę, żebym chciał to zrobić. Prawdopodobnie jesteśmy jednak blisko odpowiedzi na moje pytanie; Myślę, że sudo jest zbudowane tak, aby ignorować reset_env i ignorować zmienne takie jak PATH i LD_LIBRARY_PATH, jeśli podano to z env_keep. Myślę, że mogę to zrobić bez zachowania PATH / LD_LIBRARY_PATH w sudo, to nie jest biggie, ale nadal ciekawie jest wiedzieć, dlaczego to nie zadziała :)
aknuds1
To nie zadziała, ponieważ sudopisarze starali się ci to uniemożliwić. Nie chcesz, aby złośliwa biblioteka była ładowana, ponieważ zostały znalezione na ścieżce używanej przez sudo. Dlatego jest resetowany. Jeśli kodujesz rzeczy, które mają być uruchamiane przez root, skopiuj je do odpowiedniego katalogu systemowego.
user39559,
8

sudoersJak już powiedzieli inni, bawiąc się należy postępować ostrożnie.

Prostszym podejściem do prostszych przypadków, w których istnieją określone zmienne środowiskowe, które chcesz zachować, jest po prostu przekazanie żądanej zmiennej środowiskowej bezpośrednio przez sudo (jest to pokazane jak [VAR=value]w pomocy sudo cmdline).

Zobacz ten mały przykład, w którym pokazałem go również dla więcej niż jednej zmiennej.

$ 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

W oryginalnym PYTHONPATHprzykładzie w pytaniu wystarczy użyć następującego:

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

Przydatne jest utworzenie aliasu dla tego typu rzeczy. Tak jak:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'
Russ
źródło
1
warto zrobić to - alias sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - następnie użyj go sudopy some_script.py
Able Mac
@AbleMac Masz rację. To był błąd ... Naprawię to. Dzięki!
Russ
3

Twoje Defaults !env_resetwygląda OK, zakładając, że nie jesteś również wywołanie sudo z -Eopcją.

Możesz spróbować całkowicie usunąć ten wpis.

Czy sprawdziłeś, że edytujesz prawidłowy plik sudoers? Zgaduję, że może być /etc/sudoerslub w /usr/local/etc/sudoerszależności od tego, jak został zainstalowany. Czy edytowałeś go za pomocą visudo?

Jak leci sudo? sudo python, sudo su, sudo su -, sudo -s, Coś innego? Tylko sudo pythoni sudo suchroniłoby twoje środowisko.

Co env | grep PYTHONPATHmówi Jeśli nic, upewnij się, że PYTHONPATH jest eksportowany, uruchamiając export PYTHONPATHi spróbuj ponownie.

Co sudo env | grep PYTHONPATHmówi Jeśli wypisze oczekiwaną wartość, coś innego zastępuje wartość PYTHONPATH. Może root .bashrc lub .bash_profile lub systemowe pliki konfiguracyjne.

Mikel
źródło
1
Jestem prawie pewien, że edytuję odpowiednie sudoers, z prefiksem instalacji odpowiadającym sudo. Używam sudo jako „sudo su”. Wrócę do ciebie, za kilka dni niestety, napisz do reszty twoich sugestii. Dzięki!
aknuds1
1
Spróbuj zmienić nieistotne ustawienie, takie jak editorlub, passpromptaby sprawdzić, czy masz poprawny plik. Lub użyj strace, dtrace, kratownicy lub podobnego i zobacz, jakie pliki otworzy.
Mikel
env | grep PYTHONPATH, ponieważ mój użytkownik drukuje oczekiwaną wartość, jednak w sudo nic nie jest drukowane. Podczas edytowania sudoerów mogę zapewnić, że PYTHONPATH zostanie zachowany, modyfikując „env_keep”. Jednak env_keep nie zachowa PATH ani LD_LIBRARY_PATH. Myślę, że sudo ma ograniczenie bezpieczeństwa, aby nie zachowywać zmiennych takich jak PATH i LD_LIBRARY_PATH? Może ustawienie czasu kompilacji?
aknuds1
1
! env_reset jest ignorowane, o ile wiem, ale mogę ponownie sprawdzić jutro. Jestem pewien, że env_delete nie jest ustawiony, ale mogę to również sprawdzić.
aknuds1
1
Potwierdziłem, że! Env_reset jest ignorowany i env_delete nie jest ustawiony.
aknuds1
-1

Zgodnie z dokumentacją Ubuntu dla LD_LIBRARY_PATH :

Musisz użyć plików konfiguracyjnych /etc/ld.so.conf.d/*.conf

Następnie:

  1. Dodaj ld.soplik konfiguracyjny /etc/ld.so.conf.d/ze swoją ścieżkąLD_LIBRARY_PATH

  2. Zaktualizuj pamięć podręczną za pomocą:

    sudo ldconfig -v
    
OlPo
źródło
Fajnie, ale pytanie nie dotyczy Ubuntu. Wskazówka: następnym razem spójrz na tagi pod pytaniem.
DavidPostill