Czy `sudo pip install` jest nadal zepsutą praktyką?

38

Jestem nowy w Ubuntu, więc proszę o wyrozumiałość. Zainstalowałem pippoleceniem: sudo apt-get -y install python-pip. Potem zainstalowałem NLTK używając polecenia na swojej stronie internetowej, która była: sudo pip install -U nltk. Ale potem natknąłem się na to pytanie, które mówi, że wszystko, co zrobiłem, było „złamaną praktyką”. Linia, która mnie najbardziej uderzyła, była taka, że ​​używanie sudo pipjest z natury niewłaściwe i że pipzbyt duża siła może uszkodzić pliki systemu operacyjnego. Czy ktoś może potwierdzić to roszczenie?

Uwaga - użyłem tylko sudodlatego, że kiedy wypróbowałem polecenie apt-get -y install python-pip, dało mi 2 błędy:

E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
co co co
źródło
3
Instrukcje mówienia sudo pip installsą z natury błędne. - z stackoverflow.com/a/33004920/95735
Piotr Dobrogost
„... z natury ....” pshaw
Michał
Przepraszamy, sudo pip installjest tak zły, jak curl "some-url" | sudo bashinstaluje. Podobnie mieliśmy kilka razy, gdy jakiś programista sudo pip installinstalował pewną zależność na swojej stacji roboczej, a następnie sprawdzał uszkodzony kod w repozytorium, ponieważ w pliku requirements.txtlub setup.pybrakowało tego, co zainstalowano, i wszyscy inni mogli dowiedzieć się, jaka zależność była potrzebna kiedy facet był na wakacjach.
Mike DeSimone

Odpowiedzi:

52

Zarówno sudo pip installi jego wariant drugi wspólny sudo -H pip installpowinien nie należy zachęcać, ponieważ jest to zagrożenie bezpieczeństwa przywilejów użycie korzeniowych użyć pipdo zainstalowania pakietów Pythona z PyPI (Python Package Index).

Od https://stackoverflow.com/a/21056000/486919 (moje podkreślenie):

Kiedy biegniesz pipz sudo, biegniesz setup.pyz sudo. Innymi słowy, uruchamiasz dowolny kod Pythona z Internetu jako root. Jeśli ktoś umieszcza złośliwy projekt na PyPI i instalujesz go, dajesz rootowi atakującemu dostęp do twojego komputera. Przed kilkoma ostatnimi poprawkami pipi PyPI, osoba atakująca mogła również uruchomić człowieka w środku ataku, aby wstrzyknąć swój kod podczas pobierania wiarygodnego projektu.

Jak wspomniano na https://security.stackexchange.com/a/79327/8761 , należy pamiętać, że każdy może przesyłać pakiety Pythona, w tym złośliwe, do PyPI.

W skrócie, zgodnie z zasadą najmniejszych przywilejów , nie korzystaj sudoz pipinstalacji pakietów Pythona z PyPI chyba że absolutnie konieczne. Zamiast tego rozważ użycie pip install --user(zauważ, że pip installbez żadnych sudododatkowych flag / opcji domyślnie pip install --userw Ubuntu obecnie) lub środowisk wirtualnych (takich jak virtualenv). Jeśli zobaczysz osoby polecające sudo piplub sudo -H pip, powiedz im, żeby tego nie robiły.

edwinksl
źródło
2
Jeśli korzystałem z niego w przeszłości, jak mogę wyczyścić to, co zrobił?
endolith,
1
Więc te instrukcje są błędne? tensorflow.org/install/install_linux
endolit
5
@endolith możesz sudo odinstalować pip, aby cofnąć. Jednak jeśli pakiet pochodzi od zaufanego opiekuna, takiego jak tensorflow, numpy itp., „Aye! Security!” argument naprawdę nie ma sensu. (Również jeśli zainstalujesz jakiś złośliwy pakiet, nawet jako „--user”, i tak jesteś po prostu przykręcony. Prawdziwa zasada powinna brzmieć: nie instaluj kodu od nieznanych / niezaufanych osób ... z wyjątkiem kontenera - ale nawet wtedy nie jest zalecane.)
Michael
2
@endolith Te instrukcje nie mówią, aby używać sudo. Może kiedyś to robili i widzieli błąd swoich zachowań? :)
David Gardner
1
sudo pip installmoże odinstalować „stare” zainstalowane przez system pakiety Pythona, co może utrudnić aktualizację lub odinstalowanie tych pakietów OS. sudo pip uninstallnie pomaga tutaj, ponieważ usuwa nowy pakiet, ale nie przywraca plików ze starego. (Mój kolega R. Zagar szczegółowo omawia inną odpowiedź.)
Mike DeSimone
19

Musisz użyć sudodo zainstalowania pip za pomocą apt ( sudo apt install python-pip), ale jak stwierdzono w odpowiedzi edwinksl, nie powinieneś używać sudodo instalowania pakietów za pomocą pip , powinieneś używać pip install --user <package>do instalowania tylko dla swojego użytkownika lub użyj virtualenv, aby jeszcze bardziej ograniczyć zakres pakietu .

Apt instaluje pakiety z repozytoriów Ubuntu, podczas gdy pip instaluje pakiety przesłane przez użytkownika z PyPi, które mogą być złośliwe.

pizzapanty184
źródło
7

I dla bardziej temperamentnej odpowiedzi:

  1. Rzeczywiście zawsze musisz sudo apt-get install ..., właśnie tak zaprojektowano narzędzie do pracy.
  2. Używanie sudo [-H]z pip installjest zarówno możliwe, jak i opcjonalne, w zależności od tego, co dokładnie chcesz zrobić (a zatem „kontrowersje”).

Jednym z motto Pythona jest: „Powinien istnieć jeden - a najlepiej tylko jeden - oczywisty sposób”. I jak większość motorów, jest rozbity sardoniczną radością pozornie przy każdej możliwej okazji. (Właśnie dlatego istnieją motta.) Niestety, w mojej najbardziej skromnej opinii, ekosystem Pythona składa się z wielu sprzecznych „twardych i szybkich” zasad, których nigdy nie należy łamać ... z wyjątkiem sytuacji, gdy „yada yada yada” (diabeł, szczegóły itp.). W prawie wszystkich przypadkach jest to spowodowane historyczną ewolucją języka i narzędzi (i kto chce / potrzebuje lekcji historii, gdy chcą po prostu zacząć swoją pracę) - ale może również wynikać z różnic w Mac / Win / * Platformy Nix (np. Unix / Linux ma podobną mentalność,weźcie tych wszystkich „zepsutych praktyk” i „z natury niewłaściwych” kultystów ładunku z ogromną szczyptą soli. Niektóre faktycznie mają dobre intencje. (Inni są po prostu, no cóż, złośliwi).

Przede wszystkim, zamiast podstawowych „instalacji na użytkownika”, prawie zawsze wolisz virtualenv, ponieważ tak naprawdę prawdopodobnie tego właśnie będziesz potrzebować. Więc równie dobrze możesz zacząć już teraz. Jak to się robi, dokładnie „zależy” (patrz motto Pythona powyżej). Jeśli używasz Conda (głównie dla komputerów Mac i Windows), zostanie ona skonfigurowana przy użyciu Conda . Jeśli używasz „czystego” Pythona [sic] , zależy to od wersji i użytego Pythona, ale virtualenvwrapper jest bardzo przydatny.

Po drugie, podobnie jak w przypadku zasady „nigdy sudo”, możesz preferować sudo -H pip install -U numpy, co jest całkowicie w porządku, a nawet korzystne, ponieważ pozwala uniknąć pobierania / ponownej instalacji / utrzymywania dużych bibliotek, gdzie tylko chcesz / potrzebuję jednej wersji na każdą wirtualną osobno. Duże, popularne frameworki, takie jak scikit-learn, NumPy, matplotlib, SciPy, pandy itp., Mogą zostać zainstalowane raz i wykonane i ponownie użyte w różnych środowiskach . Ponadto lokalny przyjazny administrator systemu może być w stanie zainstalować je dla każdego użytkownika w systemie - i oczywiście sudorobiliby to również za pośrednictwem np. Bardziej skomplikowanych instalacji, takich jak TensorFlow.

I na koniec, jeśli instalujesz jakąś losową bibliotekę innej firmy, która robi takie a takie (API Twittera, munging tekstu, formatowanie kodu itp.), To całkowicie się zgadzam - nie instaluj go jako root za pośrednictwem sudo. Jasne, zainstaluj go jako bieżącego użytkownika. Pamiętaj jednak, że na Twoim koncie użytkownika znajdują się wszystkie naprawdę ważne rzeczy .

Michał
źródło
2
Gdzie „hartowany” = „przeciwny do zamierzonego wykręcający się flądrowanie, wywołujący zamieszanie, aby nie skrzywdzić niczyich uczuć”. Po prostu bądź jasny i wyraźny, aby uniknąć nieporozumień: nigdy nie ma potrzeby robienia tego jako linii bazowej, łącznie z twoimi przykładami. Unix rzeczywiście „rzuca własną konfiguracją i ryzykuje”, to dosłownie sposób myślenia w języku C, ale podobnie jak tam, nie używaj go malloctam, gdzie nie musisz. --userFlag co robi PO prosił o i nie wymaga specjalnych uprawnień. Podważasz swoje dobre strony na temat virtualenv w tym procesie ... nic z „kultystów ładunków” o tym wszystkim.
Benjamin R
Uwzględniłem już tę perspektywę w moim badaniu powszechnych odpowiedzi i opinii (jeśli ktoś czyta uważnie).
Michael
1

Używanie „sudo pip install” może i nadpisze zawartość pythonową dostarczoną przez twojego dostawcę systemu operacyjnego. Gdy tak się stanie, wszelkie pakiety dostawców, których to dotyczy, nie przejdą „rpm --verify”, a Twoje pakiety będą wyglądać na uszkodzone.

Czy chcesz korzystać z narzędzi do administrowania systemem, które przetestował Twój sprzedawca systemu operacyjnego , czy też możesz używać nieprzetestowanych składników pobranych z Internetu?

Kiedy nie, jeśli złośliwy pakiet zostanie przesłany do PyPI ... ludzie, którzy używają „sudo pip install”, będą uruchamiać ten złośliwy ładunek z pełnymi uprawnieniami systemowymi. Chcesz tego? (#principleofleastprivilege)

Jeśli to tylko twój laptop, a ryzykujesz tylko kilka zdjęć kotów, to ryzyko jest prawdopodobnie niskie ... ale jeśli jest to system dla wielu użytkowników, ryzyko jest teraz mnożone przez N. Jeśli masz dane na system, który ma wartość, dostępność systemu lub niezawodność mają wartość, wówczas ryzyko również rośnie.

Wybierz własną przygodę, ale uzyskaj świadomą zgodę innych użytkowników, na których wybór może mieć wpływ. Mogą nie być wygodne z takim samym poziomem ryzyka jak Ty.

Randy Zagar
źródło
0

Aby dodać do tych odpowiedzi: Nie wiem o Ubuntu, ale w Fedorze mogę użyć sudo dnf install python3-numpyformatu, aby zainstalować WIELE użytecznych dla mnie pakietów. Nie ma to wady polegającej na tym, że jest niepewny (opiekun repo repo sprawdził pakiety), ale umożliwia także instalację w całym systemie. Jedyną wadą jest to, że wersje dystrybucyjne mogą nieco opóźniać pakiety w PyPI.

Milind R.
źródło
-1

Nie, to prawda. Nie mogę potwierdzić tego roszczenia. Zawsze używam sudo -Hz pip. pipmoże uszkodzić tylko pliki systemu operacyjnego w takim stopniu, jak apt. Tylko nie używać sudoze pipgdy chcesz zainstalować tylko dla tego użytkownika.

fosslinux
źródło
1
Kiedy na komputerze osobistym chcesz zainstalować pipsystem? Jeśli jesteś administratorem systemu, może to inna historia.
Benjamin R