Является ли `sudo pip install` все еще сломанной практикой?

38

Я новичок в Ubuntu, поэтому, пожалуйста, потерпите меня. Я установил с pipпомощью этой команды: sudo apt-get -y install python-pip. Затем я установил NLTK используя команду на своем веб - сайте, который был: sudo pip install -U nltk. Но потом я наткнулся на этот вопрос, который говорит, что все, что я делал, было «нарушенной практикой». Больше всего меня поразило, что использование sudo pipпо своей сути неправильно и что pipслишком большое усилие может повредить файлы операционной системы. Кто-нибудь может подтвердить это утверждение?

Примечание - я использовал только sudoпотому, что когда я попробовал команду, apt-get -y install python-pipэто дало мне 2 ошибки:

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?
что что что
источник
3
Указывающие инструкции sudo pip installпо своей сути неверны. - от stackoverflow.com/a/33004920/95735
Петр Доброгост
"... по своей сути ...." Пшоу
Майкл
Извините, sudo pip installэто так же плохо, как curl "some-url" | sudo bashустанавливает. Точно так же у нас было несколько раз, когда какой-то разработчик sudo pip installустанавливал некоторую зависимость на свою рабочую станцию, а затем проверял в репозитории неработающий код, потому что в файле requirements.txtor setup.pyотсутствовало то, что они установили, и все остальные должны были выяснить, какая зависимость нужна пока парень был в отпуске.
Майк ДеСимоне

Ответы:

52

Как sudo pip installи его другой общий вариант sudo -H pip installследует не поощрять , потому что это риск для безопасности использования привилегий суперпользователя использовать pipдля установки пакетов Python из PyPI (Python Index Package).

С https://stackoverflow.com/a/21056000/486919 (выделено мое):

Когда вы бежите pipс sudo, вы бежите setup.pyс sudo. Другими словами, вы запускаете произвольный код Python из Интернета от имени пользователя root. Если кто-то запускает вредоносный проект в PyPI и вы устанавливаете его, вы предоставляете злоумышленнику root-доступ к своей машине. До некоторых недавних исправлений pipи PyPI злоумышленник мог также запустить человека в середине атаки, чтобы внедрить свой код при загрузке заслуживающего доверия проекта.

Как упоминалось на https://security.stackexchange.com/a/79327/8761 , важно отметить, что любой может загрузить пакеты Python, в том числе вредоносные, в PyPI.

Короче говоря, в соответствии с принципом наименьших привилегий , не используйте sudowith pipдля установки пакетов Python из PyPI, если в этом нет крайней необходимости. Вместо этого рассмотрите возможность использования pip install --user(обратите внимание, что в настоящее время в Ubuntu pip installнет sudoни дополнительных, ни дополнительных флагов / параметров по умолчанию pip install --user) или виртуальных сред (например, virtualenv). Если вы видите, что люди рекомендуют sudo pipили sudo -H pip, пожалуйста, скажите им не делать этого.

edwinksl
источник
2
Если я использовал его в прошлом, как мне очистить то, что он сделал?
эндолит
1
Значит, эти инструкции неверны? tensorflow.org/install/install_linux
эндолиты
5
@endolith, вы можете отменить удаление пункта. Кроме того, однако, если пакет от надежного сопровождающего, такого как тензорный поток, NumPy и т. Д., "Да! Безопасности!" аргумент не имеет смысла. (Кроме того, если вы устанавливаете какой-либо вредоносный пакет, даже как «--user», вы все равно в основном испорчены. Реальное правило должно быть следующим: не устанавливать код от неизвестных / ненадежных людей ... кроме как в контейнере - но даже тогда, не рекомендуется.)
Майкл
2
@endolith В этих инструкциях не сказано использовать sudo. Может быть, они привыкли, и они видели ошибку своих путей? :)
Дэвид Гарднер
1
sudo pip installможет удалить «старые» установленные Python пакеты, установленные системой, что может затруднить обновление или удаление этих пакетов ОС. sudo pip uninstallздесь не помогает, потому что он удаляет новый пакет, но не восстанавливает файлы из старого. (Мой коллега Р. Загар более подробно описывает другой ответ.)
Майк ДеСимоне
19

Вы должны использовать sudoдля установки pip с помощью apt ( sudo apt install python-pip), но, как указано в ответе edwinksl, вы не должны использовать его sudoдля установки пакетов с помощью pip , вы должны использовать его pip install --user <package>для установки только для своего пользователя или использовать virtualenv для еще большего ограничения области действия пакета. ,

Apt устанавливает пакеты из репозиториев Ubuntu, тогда как pip устанавливает загруженные пользователем пакеты из PyPi, которые могут быть вредоносными.

pizzapants184
источник
7

И для более сдержанного ответа:

  1. Вы действительно всегда должны это делать sudo apt-get install ..., так как инструмент был разработан для работы.
  2. Использование sudo [-H]с pip installвозможно и необязательно, в зависимости от того, что именно вы хотите сделать (и, следовательно, «противоречие»).

Один из девизов языка Python является «Там должно быть одно-- и предпочтительно только один --obvious способ сделать это.» И, как и большинство девизов, он с сардоническим ликованием ломается, казалось бы, при любой возможности. (Вот почему, я думаю, существуют девизы.) К сожалению, по моему наиболее скромному мнению, экосистема Python состоит из множества противоречивых «жестких и быстрых» правил, которые никогда не нарушаются ... за исключением случаев, когда «yada yada yada» (дьявол, детали и т. д.). Почти во всех случаях это связано с исторической эволюцией языка и инструментов (и тем, кто хочет / нуждается в уроке истории, когда они просто хотят продолжить свою работу) - но также может быть связано с различиями в Mac / Win / * Платформы Nix (например, Unix / Linux имеет похожий менталитет,принять всю эту «сломанную практику» и «по своей сути неправильно» груз-культистов с огромной щепоткой соли. Некоторые действительно имеют в виду хорошо. (Другие просто, ну, подлые.)

Прежде всего, вместо базовых «установок для каждого пользователя», вы почти всегда предпочитаете virtualenv, потому что на самом деле это то, что вам в конечном итоге понадобится. Так что вы можете начать с этого сейчас. Как именно это делается, именно «зависит» (см. Девиз Python выше). Если вы используете Conda (в основном для Mac и Windows), он будет настроен с использованием Conda . Если вы используете «чистый» Python [sic] , это зависит от того, какая версия и какая у вас версия Python, но virtualenvwrapper довольно удобен.

Во-вторых, в качестве контрпримера к правилу «никогда не судо», вы можете предпочесть sudo -H pip install -U numpy, что совершенно нормально, даже выгодно, так как позволяет избежать загрузки / переустановки / обслуживания больших библиотек, где вы хотите только / нужна одна версия, в каждом virtualenv отдельно. Большие, популярные фреймворки, такие как scikit-learn, NumPy, matplotlib, SciPy, pandas и т. Д., Могут быть установлены один раз и готовы для повторного использования в различных средах . Кроме того, ваш местный дружественный системный администратор может установить их для каждого пользователя в системе - и, очевидно, они будут делать это sudoтакже, например, для более сложных установок, таких как TensorFlow.

И, наконец, если вы устанавливаете какую-то случайную стороннюю библиотеку, которая делает то-то и то-то (API Twitter, манипулирование текстом, форматирование кода и т. Д.), То я полностью согласен - не устанавливайте ее как root с помощью sudo. Конечно, установите его в качестве текущего пользователя. Но помните, в вашей учетной записи есть все ваши действительно важные вещи .

Майкл
источник
2
Где "закаленный" = "контрпродуктивный фейсбинг, изгибающий руки, вызывающий путаницу ради попытки не задеть чьи-либо чувства". Просто будьте ясны и недвусмысленны, чтобы избежать путаницы: никогда не нужно делать это в качестве основы, включая ваши примеры. Unix действительно «накатывает свой собственный конфиг и риски», буквально это мышление C, но, как и там, не используйте mallocтам, где вам не нужно. --userФлаг делает то , что ОП просили и не требует никаких специальных разрешений. В процессе вы подрываете свои хорошие качества в отношении virtualenv ... в этом нет ничего "грубо-культистского".
Бенджамин R
Я уже включил эту точку зрения в свой обзор общих ответов и мнений (если внимательно прочитать).
Майкл
1

Использование «sudo pip install» может и перезапишет содержимое Python, предоставленное поставщиком вашей ОС. Когда это происходит, любые пакеты поставщиков, затронутые этим, не будут проходить «rpm --verify», и ваши пакеты будут выглядеть поврежденными.

Вы хотите использовать инструменты системного администрирования, которые протестировал ваш поставщик ОС , или можно использовать непроверенные компоненты, которые вы скачали из Интернета?

Когда, если не, вредоносный пакет загружается в PyPI ... люди, использующие "sudo pip install", в конечном итоге запустят эту вредоносную нагрузку с полными системными привилегиями. Ты хочешь это? (#Principleofleastprivilege)

Если это всего лишь ваш ноутбук, и вы рискуете только несколькими изображениями кошек, тогда риск, вероятно, низкий ... но если это многопользовательская система, то риск теперь умножается на N. Если у вас есть данные на система, которая имеет ценность, или доступность или надежность системы имеют ценность, тогда риски также возрастают.

Пожалуйста, не стесняйтесь выбирать свое собственное приключение, но, пожалуйста, получите информированное согласие других пользователей, которые могут быть затронуты вашим выбором. Они могут не чувствовать себя с таким же уровнем риска, как вы.

Рэнди Загар
источник
0

Чтобы добавить к этим ответам: я не знаю об Ubuntu, но в Fedora я могу использовать sudo dnf install python3-numpyформат для установки МНОГИХ полезных для меня пакетов. Это не имеет недостатка в том, что оно небезопасно (сопровождающий дистрибутивного репозитория имеет проверенные пакеты), но также позволяет устанавливать в масштабе всей системы. Единственным недостатком является то, что версии дистрибутива репо могут немного отставать от пакетов в PyPI.

Milind R
источник
-1

Нет, это правильно. Я не могу подтвердить это утверждение. Я всегда использую sudo -Hс pip. pipможет только повредить файлы операционной системы apt. Только не используйте sudoс, pipкогда вы хотите установить только для этого пользователя.

fosslinux
источник
1
На вашем персональном компьютере, когда вам нужно установить в pipмасштабе всей системы? Если вы системный администратор, возможно, это другая история.
Бенджамин R