¿`Sudo pip install` sigue siendo una práctica rota?

38

Soy nuevo en Ubuntu, así que tengan paciencia conmigo. He instalado pipusando este comando: sudo apt-get -y install python-pip. Luego instalado NLTK usando el comando en su página web, que era: sudo pip install -U nltk. Pero luego me topé con esta pregunta que dice que todo lo que hice fue una "práctica rota". La línea que más me llamó la atención fue que usar sudo pipes inherentemente incorrecto y que dar pipdemasiada fuerza podría dañar los archivos del sistema operativo. ¿Alguien puede validar este reclamo?

Nota: solo lo usé sudoporque cuando probé el comando apt-get -y install python-pipme dio 2 errores:

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?
que que que
fuente
3
Las instrucciones que dicen sudo pip installson inherentemente incorrectas. - de stackoverflow.com/a/33004920/95735
Piotr Dobrogost
"... inherentemente ..." pshaw
michael
Lo siento, sudo pip installes tan malo como las curl "some-url" | sudo bashinstalaciones. Del mismo modo, hemos tenido algunas ocasiones en las que algunos desarrolladores solían sudo pip installinstalar alguna dependencia en su estación de trabajo, luego registraban un código roto en el repositorio porque el archivo requirements.txto setup.pyfaltaba lo que instalaban, y todos los demás tenían que averiguar qué dependencia era necesaria mientras el chico estaba de vacaciones.
Mike DeSimone

Respuestas:

52

Ambos sudo pip instally su otra variante común nosudo -H pip install deberían fomentarse porque es un riesgo de seguridad usar privilegios de root para instalar paquetes de Python desde PyPI (Python Package Index).pip

Desde https://stackoverflow.com/a/21056000/486919 (el énfasis es mío):

Cuando corres pipcon sudo, corres setup.pycon sudo. En otras palabras, ejecuta código arbitrario de Python desde Internet como root. Si alguien coloca un proyecto malicioso en PyPI y usted lo instala, le da acceso de atacante a su máquina. Antes de algunas correcciones recientes pipy PyPI, un atacante también podría ejecutar un ataque de hombre en el medio para inyectar su código cuando descargue un proyecto confiable.

Como se menciona en https://security.stackexchange.com/a/79327/8761 , es importante tener en cuenta que cualquiera puede cargar paquetes de Python, incluidos los maliciosos, a PyPI.

En resumen, de acuerdo con el principio de mínimo privilegio , no utilice sudocon pipinstalar los paquetes de Python desde PyPI menos que sea absolutamente necesario. En lugar de eso, considere usar pip install --user(tenga en cuenta que pip installsin sudoopciones / indicadores adicionales ni predeterminados pip install --useren Ubuntu actualmente) o entornos virtuales (como virtualenv). Si ve a personas recomendando sudo pipo sudo -H pip, por favor dígales que no lo hagan.

edwinksl
fuente
2
Si lo he usado en el pasado, ¿cómo limpio lo que hizo?
endolito
1
Entonces, ¿estas instrucciones son incorrectas? tensorflow.org/install/install_linux
endolith
55
@endolith puede sudo la desinstalación de pip para deshacer. Además, si el paquete es de un mantenedor de confianza, como tensorflow, numpy, etc., "aye! Security!" argumento realmente no tiene sentido. (Además, si instala algún paquete malicioso, incluso como "--user", básicamente está jodido de todos modos. La regla real debería ser: No instale código de personas desconocidas / no confiables ... excepto en un contenedor, pero incluso entonces, no recomendado.)
michael
2
@endolith Esas instrucciones no dicen que use sudo. ¿Tal vez solían hacerlo y han visto el error de sus formas? :)
David Gardner
1
sudo pip installpuede desinstalar paquetes Python "antiguos" instalados en el sistema, lo que puede dificultar la actualización o desinstalación de esos paquetes del sistema operativo. sudo pip uninstallno ayuda aquí, porque elimina el nuevo paquete pero no restaura los archivos del anterior. (Mi colega R. Zagar entra en más detalles en otra respuesta.)
Mike DeSimone
19

Debe usar sudopara instalar pip con apt ( sudo apt install python-pip), pero como se indica en la respuesta de edwinksl, no debe usar sudopara instalar paquetes con pip , debe usar pip install --user <package>para instalar solo para su usuario, o usar un virtualenv para restringir aún más el alcance del paquete .

Apt instala paquetes de los repositorios de Ubuntu, mientras que pip instala paquetes cargados por el usuario desde PyPi que podrían ser maliciosos.

pizzapants184
fuente
7

Y para una respuesta más moderada:

  1. De hecho, siempre tiene que hacerlo sudo apt-get install ..., así es como la herramienta fue diseñada para funcionar.
  2. Usar sudo [-H]con pip installes posible y opcional, dependiendo de qué es exactamente lo que quiere hacer (y por lo tanto, "controversia").

Uno de los lemas de Python es "Debe haber una, y preferiblemente solo una, forma obvia de hacerlo". Y como la mayoría de los lemas, está roto con alegría sardónica aparentemente en cada oportunidad posible. (Por eso existen los lemas, supongo). Desafortunadamente, en mi opinión más humilde, el ecosistema de Python consta de muchas reglas conflictivas "duras y rápidas", que nunca se romperán ... excepto cuando "yada yada yada" (diablo, detalles, etc.) En casi todos los casos, esto se debe a la evolución histórica del lenguaje y las herramientas (y quién quiere / necesita una lección de historia cuando solo quieren continuar con su trabajo), pero también puede deberse a diferencias en Mac / Win / * Plataformas Nix (por ejemplo, Unix / Linux tiene una mentalidad similar,tome todas estas "prácticas rotas" y cultistas de carga "inherentemente equivocados" con una gran pizca de sal. Algunos realmente tienen buenas intenciones. (Otros son justos, bueno, malos).

En primer lugar, en lugar de las "instalaciones por usuario" básicas, casi siempre preferirá un virtualenv, porque realmente, eso es probablemente lo que terminará necesitando. Así que bien podrías comenzar con esto ahora. Cómo se hace esto, exactamente, "depende" (ver el lema de Python, arriba). Si usa Conda (principalmente para Mac y Windows), se configurará con Conda . Si usa Python "puro" [sic] , depende de qué versión y qué utilidades de Python tenga, pero virtualenvwrapper es bastante útil.

En segundo lugar, solo como un contraejemplo a la regla de "nunca sudo", puede preferirlo sudo -H pip install -U numpy, lo cual está perfectamente bien, incluso es ventajoso, ya que puede permitir que uno evite descargar / reinstalar / mantener grandes bibliotecas, donde solo desea / necesita una versión, en cada virtualenv por separado. Los marcos grandes y populares como scikit-learn, NumPy, matplotlib, SciPy, pandas, etc., pueden instalarse una vez, hacerse y reutilizarse en todos los entornos . Además, su administrador de sistemas amigable local podría instalarlos para cada usuario en un sistema, y ​​obviamente lo harían sudotambién, por ejemplo, para instalaciones más complicadas, como TensorFlow.

Y, por último, si está instalando una biblioteca aleatoria de terceros que hace tal y tal cosa (API de Twitter, mezcla de texto, formato de código, etc.), estoy totalmente de acuerdo: no la instale como root a través de sudo. Claro, instálalo como tu usuario actual. Pero solo recuerde, su cuenta de usuario tiene todas sus cosas realmente importantes .

Miguel
fuente
2
Donde "templado" = "faffing retorcido de manos contraproducente que invita a la confusión en aras de tratar de no herir los sentimientos de nadie". Solo sea claro y explícito para evitar confusiones: nunca es necesario hacer esto como referencia, incluidos sus ejemplos. Unix es "rodar su propia configuración y riesgos", es literalmente una mentalidad C, pero como allí, no lo use mallocdonde no lo necesite. La --userbandera hace lo que pedía el OP y no requiere permisos especiales. Estás socavando tus puntos positivos sobre virtualenv en el proceso ... nada de "cultista de carga" sobre nada de esto.
Benjamin R
Ya incluí esta perspectiva en mi encuesta de respuestas y opiniones comunes (si se lee detenidamente).
michael
1

El uso de "sudo pip install" puede y sobrescribirá el contenido de Python proporcionado por su proveedor de SO. Cuando eso suceda, los paquetes de proveedores afectados por esto no pasarán un "rpm --verify" y sus paquetes parecerán estar dañados.

¿Desea utilizar las herramientas de administración del sistema que el proveedor de su sistema operativo ha probado o está bien usar componentes no probados que haya descargado de Internet?

Cuando, no si, se carga un paquete malicioso en PyPI ... las personas que usan "sudo pip install" terminarán ejecutando esa carga maliciosa con todos los privilegios del sistema. ¿Quieres eso? (#principleofleastprivilege)

Si es solo su computadora portátil, y solo está arriesgando algunas fotos de gatos, entonces el riesgo es probablemente bajo ... pero si es un sistema multiusuario, entonces el riesgo ahora se multiplica por N. Si tiene datos sobre el sistema que tiene valor, o la disponibilidad o confiabilidad del sistema tienen valor, entonces los riesgos también aumentan.

No dude en elegir su propia aventura, pero obtenga el consentimiento informado de los otros usuarios que podrían verse afectados por su elección. Es posible que no se sientan cómodos con el mismo nivel de riesgo que usted.

Randy Zagar
fuente
0

Para agregar a estas respuestas: No sé acerca de Ubuntu, pero en Fedora puedo usar el sudo dnf install python3-numpyformato para instalar MUCHOS paquetes que me son útiles. Esto no tiene la desventaja de ser inseguro (el mantenedor de repositorio de distribución ha validado los paquetes), pero también le permite instalar en todo el sistema. El único inconveniente es que las versiones de repositorio de distribución pueden retrasar ligeramente los paquetes en PyPI.

Milind R
fuente
-1

No, esto es correcto. No puedo validar este reclamo. Yo siempre uso sudo -Hcon pip. pipsolo puede dañar los archivos del sistema operativo tanto como apt. Solo no use sudocon pipcuando quiera instalar solo para ese usuario.

fosslinux
fuente
1
En su computadora personal, ¿cuándo necesita instalar todo el pipsistema? Si eres un administrador de sistemas, tal vez esa sea una historia diferente.
Benjamin R