web-dev-qa-db-fra.com

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

Je suis nouveau sur Ubuntu, alors je vous en prie, supportez-moi. J'ai installé pip en utilisant la commande suivante: Sudo apt-get -y install python-pip. Ensuite, j'ai installé NLTK en utilisant la commande de leur site Web, qui était: 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 de Sudo pip est intrinsèquement fausse et que donner pip trop de force pourrait endommager les fichiers du système d'exploitation. Quelqu'un peut-il valider cette affirmation?

Note - J'ai seulement utilisé Sudo car quand j'ai essayé la commande apt-get -y install python-pip cela 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?
31
whatwhatwhat

Sudo pip install et son autre variante commune Sudo -H pip install devraient ne pas être encouragés, car le fait d'utiliser les privilèges root pour utiliser pippour installer Python packages de PyPI (Python Package Index).

De https://stackoverflow.com/a/21056000/486919 (l'emphase est la mienne):

Lorsque vous exécutez pipavec Sudoname__, vous exécutez setup.py avec Sudoname__. 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 accordez à un attaquant un accès root à votre ordinateur. . Avant l’adoption de correctifs récents pour pipet PyPI, un attaquant pourrait également faire passer une attaque de type homme au milieu pour injecter son code lorsque vous téléchargiez un projet fiable.

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

En bref, conformément au principe du plus petit privilège , n'utilisez pas Sudoavec pippour installer les paquets Python à partir de PyPI, sauf obligation absolue. Au lieu de cela, envisagez d'utiliser pip install --user (notez que pip install sans Sudoni d'autres indicateurs/options par défaut à pip install --user sous Ubuntu actuellement) ou des environnements virtuels (tels que virtualenvname__). Si vous voyez des gens recommander Sudo pip ou Sudo -H pip, veuillez leur dire de ne pas le faire.

45
edwinksl

Vous devez utiliser Sudo pour installer pip avec apt (Sudo apt install python-pip), mais comme indiqué dans Réponse de edwinksl vous ne devriez pas utiliser Sudo pour installer des paquets avec pip , vous devriez utiliser pip install --user <package> à installer uniquement pour votre utilisateur, ou utilisez un virtualenv pour restreindre encore davantage la portée du paquet.

Apt installe les paquets à partir des référentiels Ubuntu, tandis que pip installe les paquets téléchargés par l'utilisateur depuis PyPi, qui pourraient être malveillants.

19
pizzapants184

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

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

L'un des devises de Python est "Il devrait y en 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 se compose de nombreux conflits " règles strictes et rapides ", ne jamais être enfreint ... 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 ont une mentalité similaire, mais ont l'avantage d'une maturité plus longue de plusieurs décennies.) Donc s'il vous plaît prenez toutes ces choses "pratique brisée" & "intrinsèquement erroné" cultiste le cargo avec une énorme pincement 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é avec Conda . Si vous utilisez "pure" Python [sic] , cela dépend de la version et de ce que python vous utils ont, mais virtualenvwrapper est très pratique.

Deuxièmement, juste comme contre-exemple à la règle "jamais de Sudo", vous préférerez peut-être Sudo -H pip install -U numpy, ce qui est parfaitement correct, voire avantageux, en ce sens qu’il permet d’éviter le téléchargement/la réinstallation/la maintenance de grandes bibliothèques, là où vous voulez seulement./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 via Sudo, ainsi, 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 souvenez-vous simplement que votre compte utilisateur contient toutes vos données importantes .

5
michael

L’utilisation de "Sudo pip install" peut écraser le contenu de 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 sembleront corrompus.

Souhaitez-vous utiliser les outils d'administration système que votre fournisseur de système d'exploitation a testés, ou puis-je utiliser des composants non testés que vous avez téléchargés à partir d'Internet?

Quand, et pas si, un paquet malveillant sera 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.

0
Randy Zagar

Pour ajouter à ces réponses: je ne connais pas Ubuntu, mais sur Fedora, je peux utiliser le format Sudo dnf install python3-numpy 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.

0
Milind R