Est-ce que `sudo pip install` est encore une pratique défaillante?

38

Je suis nouveau sur Ubuntu, alors je vous en prie, supportez-moi. Je l' ai installé en piputilisant cette commande: sudo apt-get -y install python-pip. Ensuite , j'ai installé NLTK en utilisant la commande sur leur site web, ce qui était la suivante : sudo pip install -U nltk. Mais ensuite je suis tombé sur cette question qui dit que tout ce que j'ai fait était une "pratique rompue". La ligne qui m'a le plus frappé est que l'utilisation sudo pipest fondamentalement fausse et que donner piptrop de force pourrait endommager les fichiers du système d'exploitation. Quelqu'un peut-il valider cette affirmation?

Note - J'ai seulement utilisé sudoparce que quand j'ai essayé la commande, apt-get -y install python-pipça m'a donné 2 erreurs:

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?
quoi quoi quoi
la source
3
Les instructions sudo pip installsont fondamentalement fausses. - de stackoverflow.com/a/33004920/95735
Piotr Dobrogost
"... intrinsèquement ..." pshaw
michael
Désolé, sudo pip installc'est aussi mauvais que des curl "some-url" | sudo bashinstallations. De même, nous avons eu à quelques reprises des développeurs sudo pip installqui installaient des dépendances sur leur poste de travail, puis enregistraient un code erroné dans le référentiel car le fichier requirements.txtou setup.pymanquait ce qu'ils avaient installé, et tout le monde devait déterminer la dépendance nécessaire. pendant que le gars était en vacances.
Mike DeSimone

Réponses:

52

Les deux sudo pip installvariantes, ainsi que leur autre variante commune, nesudo -H pip install doivent pas être encouragées, car l’utilisation des privilèges root pippour installer les packages Python à partir de PyPI (Index de package Python) constitue un risque pour la sécurité .

De https://stackoverflow.com/a/21056000/486919 (emphase sur moi):

Quand tu cours pipavec sudo, tu cours setup.pyavec sudo. En d'autres termes, vous exécutez du code Python arbitraire à partir d'Internet en tant que root. Si quelqu'un installe un projet malveillant sur PyPI et que vous l'installez, vous donnez à un attaquant un accès root à votre ordinateur. Avant l’adoption de correctifs récents pour pipPyPI, un attaquant pourrait également provoquer une attaque de type homme du milieu pour injecter son code lorsque vous téléchargiez un projet fiable.

Comme indiqué à l' adresse https://security.stackexchange.com/a/79327/8761 , il est important de noter que tout le monde peut télécharger des packages Python, y compris malveillants, vers PyPI.

En bref, conformément au principe des moindres privilèges , n'utilisez pas sudoavec pippour installer les packages Python à partir de PyPI sauf si vous en avez la nécessité absolue. Pensez plutôt à utiliser pip install --user(notez que, pip installavec Ubuntu actuellement, aucun sudoindicateur / option supplémentaire ni par défaut pip install --user) ou des environnements virtuels (tels que virtualenv). Si vous voyez des gens recommander sudo pipou sudo -H pip, veuillez leur dire de ne pas le faire.

edwinksl
la source
2
Si je l'ai utilisé dans le passé, comment puis-je nettoyer ce qu'il a fait?
endolith
1
Donc, ces instructions sont fausses? tensorflow.org/install/install_linux
endolith
5
@endolith vous pouvez désinstaller le pip pour annuler. De plus, cependant, si le paquet provient d’un responsable de confiance, tel que tensorflow, numpy, etc., le "aye! Security!" l'argument n'a pas vraiment de sens. (De plus, si vous installez un paquet malveillant, même en tant que "--user", vous êtes fondamentalement foutu. La vraie règle devrait être: N'installez pas le code de personnes inconnues / non fiables ... sauf dans un conteneur - mais même alors, pas recommandé.)
michael
2
@endolith Ces instructions ne disent pas qu'il faut utiliser sudo. Peut-être qu'ils avaient l'habitude de et qu'ils ont vu l'erreur de leurs manières? :)
David Gardner
1
sudo pip installpeut désinstaller les "anciens" packages Python installés sur le système, ce qui peut compliquer la mise à niveau ou la désinstallation de ces packages. sudo pip uninstalln'aide pas ici, car il supprime le nouveau paquet mais ne restaure pas les fichiers de l'ancien. (Mon collègue R. Zagar va plus en détail dans une autre réponse.)
Mike DeSimone
19

Vous devez utiliser sudopour installer pip avec apt ( sudo apt install python-pip), mais comme indiqué dans la réponse de edwinksl, vous ne devriez pas utiliser sudopour installer des paquets avec pip , vous devez utiliser pip install --user <package>pour installer uniquement pour votre utilisateur, ou utiliser virtualenv pour limiter encore plus la portée du paquet. .

Apt installe les paquets à partir des dépôts d'Ubuntu, tandis que pip installe les paquets téléchargés par l'utilisateur à partir de PyPi, qui pourraient être malveillants.

pizzapants184
la source
7

Et pour une réponse plus tempérée:

  1. Vous devez en effet toujours le faire sudo apt-get install ..., c’est exactement comme cela que l’outil a été conçu.
  2. Utiliser sudo [-H]avec pip installest à la fois possible et facultatif, en fonction de ce que vous voulez faire exactement (et donc de "controverse").

Une des devises de Python est "Il devrait y avoir un - et de préférence un seul moyen - évident de le faire." Et comme la plupart des slogans, elle semble rompre avec une joie sardonique à chaque occasion. (C’est pourquoi les devises existent, je suppose.) Malheureusement, à mon humble avis, l’écosystème Python est constitué de nombreuses règles contradictoires "hard & fast", qui ne doivent jamais être enfreintes ... sauf pour "yada yada yada" (diable, détails, etc.). Dans presque tous les cas, cela est dû à l'évolution historique de la langue et des outils (et aux personnes qui veulent / ont besoin d'une leçon d'histoire lorsqu'elles veulent juste continuer leur travail) - mais cela peut aussi être dû aux différences entre Mac / Win / * Les plates-formes Nix (par exemple, Unix / Linux a une mentalité similaire,prenez toutes ces "pratiques brisées" et "fondamentalement fausses" pour les spécialistes de la cargaison avec une énorme pincée de sel. Certains veulent vraiment bien dire. (Les autres ne sont que méchants.)

Tout d'abord, plutôt que des "installations par utilisateur" de base, vous préférerez presque toujours une virtualenv, car en réalité, c'est probablement ce dont vous aurez besoin. Donc, vous pourriez aussi bien commencer par cela maintenant. Comment cela est fait, exactement "dépend" (voir la devise Python, ci-dessus). Si vous utilisez Conda (principalement pour Mac et Windows), il sera configuré à l' aide de Conda . Si vous utilisez "pur" Python [sic] , cela dépend de la version et des utilitaires python que vous avez, mais virtualenvwrapper est très pratique.

Deuxièmement, juste comme un exemple de la règle "Never Sudo", vous préférerez peut-être sudo -H pip install -U numpy, ce qui est parfaitement correct, voire avantageux, en ce sens que cela peut permettre d’éviter le téléchargement / la réinstallation / la maintenance de grandes bibliothèques, où vous ne voulez / besoin d'une version, dans chaque virtualenv séparément. De grands frameworks populaires tels que scikit-learn, NumPy, matplotlib, SciPy, pandas, etc., peuvent être installés une fois pour toutes et réutilisés dans plusieurs environnements . De plus, votre administrateur système local sympathique pourrait peut-être les installer pour tous les utilisateurs d’un système - et ils le feraient bien évidemment sudoaussi, par exemple pour des installations plus complexes, telles que TensorFlow.

Enfin, si vous installez une bibliothèque aléatoire tierce qui fait telle ou telle chose (API Twitter, conversion de texte, formatage de code, etc.), je suis tout à fait d’accord - ne l’installez pas en tant que root via Sudo. Bien sûr, installez-le en tant qu'utilisateur actuel. Mais rappelez-vous que votre compte utilisateur contient toutes vos informations essentielles .

Michael
la source
2
Where "tempered" = "une confusion contre-productive qui invite à la confusion pour ne pas blesser les sentiments de qui que ce soit". Soyez juste clair et explicite pour éviter toute confusion: il n’est jamais nécessaire de le faire comme base, y compris vos exemples. Unix est en effet "lancez votre propre configuration et vos propres risques", il s'agit littéralement d'un état d'esprit en C, mais comme dans ce cas, n'utilisez pas les éléments inutiles malloc. Le --userdrapeau fait ce que le PO demandait et ne nécessite aucune autorisation spéciale. Vous remettez en cause vos points positifs sur la virtualité dans le processus… rien d’autre que «le sectariste du fret».
Benjamin R
J'ai déjà inclus cette perspective dans mon enquête sur les réponses et opinions communes (si on lit de près).
michael
1

L'utilisation de "sudo pip install" peut écraser le contenu python fourni par votre fournisseur de système d'exploitation. Lorsque cela se produit, les packages des fournisseurs concernés ne passeront pas un "rpm --verify" et vos packages apparaîtront corrompus.

Souhaitez-vous utiliser les outils d'administration système testés par votre fournisseur de système d'exploitation ou convient-il d'utiliser des composants non testés que vous avez téléchargés depuis Internet?

Quand, et pas si, un paquet malveillant est téléchargé sur PyPI ... les personnes qui utilisent "sudo pip install" finiront par exécuter cette charge malveillante avec des privilèges système complets. Veux-tu çà? (#principleofleastprivilege)

S'il ne s'agit que de votre ordinateur portable et que vous ne risquez que quelques photos de chat, le risque est probablement faible ... mais s'il s'agit d'un système multi-utilisateur, le risque est maintenant multiplié par N. Si vous disposez de données de système ayant de la valeur, ou la disponibilité ou la fiabilité du système ayant de la valeur, les risques augmentent également.

N'hésitez pas à choisir votre propre aventure, mais veuillez vous procurer le consentement éclairé des autres utilisateurs susceptibles d'être affectés par votre choix. Ils peuvent ne pas être à l'aise avec le même niveau de risque que vous.

Randy Zagar
la source
0

Pour ajouter à ces réponses: je ne connais pas Ubuntu, mais sur Fedora, je peux utiliser le sudo dnf install python3-numpyformat pour installer BEAUCOUP paquets utiles pour moi. Cela n'a pas l'inconvénient d'être peu sûr (le responsable de distro repo a validé des paquets), mais vous permet également de l'installer à l'échelle du système. Le seul inconvénient est que les versions de distro repo peuvent être légèrement en retard sur les paquets dans PyPI.

Milind R
la source
-1

Non, c'est correct Je ne peux pas valider cette demande. Je l'utilise toujours sudo -Havec pip. pippeut uniquement endommager les fichiers du système d’exploitation apt. Seulement, ne pas utiliser sudoavec piplorsque vous voulez installer uniquement pour cet utilisateur.

Fosslinux
la source
1
Quand devez-vous installer l’ensemble du pipsystème sur votre ordinateur personnel ? Si vous êtes administrateur système, c'est peut-être une autre histoire.
Benjamin R