¿Cómo / por qué npm recomienda no ejecutar como root?

En breve…

En primer lugar, ¿por qué npm sugiere que solo se ejecute como no raíz? Desconozco mucho que cualquier otro administrador de paquetes ( apt , yum , gem , pacman ) esté equivocado al requerir sudo.

En segundo lugar, cuando sigo su sugerencia (y ejecuto npm install como no root), no funcionará (porque no root no tiene permiso para / usr / local / lib). ¿Cómo sigo su sugerencia? No voy a chown -R $USER /usr/local/lib , porque me parece una muy mala idea.

Descripción completa…

Instalé npm a través de curl http://npmjs.org/install.sh | sudo sh curl http://npmjs.org/install.sh | sudo sh (la instrucción en su README).

Cuando ejecuto sudo npm install mongoose , npm me dice que no lo ejecute como root:

 npm ERR! sudon't! npm ERR! sudon't! Running npm as root is not recommended! npm ERR! sudon't! Seriously, don't do this! npm ERR! sudon't! 

Pero cuando ejecuto npm install mongoose sin sudo, obtengo lo siguiente:

 npm info it worked if it ends with ok npm info using npm@0.2.17 npm info using node@v0.4.0-pre npm info fetch http://registry.npmjs.org/mongoose/-/mongoose-1.0.7.tgz npm info calculating sha1 /tmp/npm-1297199132405/1297199132406-0.7044695958029479/tmp.tgz npm info shasum b3573930a22066fbf3ab745a79329d5eae75b8ae npm ERR! Could not create /usr/local/lib/node/.npm/.cache/mongoose/1.0.7/package.tgz npm ERR! Failed creating the tarball. npm ERR! This is very rare. Perhaps the 'gzip' or 'tar' configs npm ERR! are set improperly? npm ERR! npm ERR! couldn't pack /tmp/npm-1297199132405/1297199132406-0.7044695958029479/contents/package to /usr/local/lib/node/.npm/.cache/mongoose/1.0.7/package.tgz npm ERR! Error installing mongoose@1.0.7 npm ERR! Error: EACCES, Permission denied '/usr/local/lib/node/.npm/.cache/mongoose' npm ERR! There appear to be some permission problems npm ERR! See the section on 'Permission Errors' at npm ERR! http://github.com/isaacs/npm#readme npm ERR! This will get better in the future, I promise. npm not ok 

Entonces me dice que no debería usar sudo, y luego no funciona si sigo su sugerencia.

Lo que lleva a mis preguntas iniciales anteriores.

En realidad, npm no recomienda no ejecutar como root. Bueno, no más.

Ha cambiado al mismo tiempo que usted hizo su pregunta. Así es como se veía el README el 7 de febrero de 2011: “Usar sudo con npm es Muy No Recomendable. Cualquiera puede publicar cualquier cosa, y las instalaciones de paquetes pueden ejecutar scripts arbitrarios”. Se explicó más adelante con más detalle como “Opción 4: SANTA VACA NO RECOMENDADA. Puedes usar sudo todo el tiempo para todo e ignorar las advertencias increíblemente detestables que te dicen que estás loco por hacer esto”.

Ver: https://github.com/isaacs/npm/tree/7288a137f3ea7fafc9d4e7d0001a8cd044d3a22e#readme

Ahora en realidad se considera una técnica recomendada para instalar npm:

Instalación simple: para instalar npm con un comando, haga esto:

curl http: / / npmjs.org/install.sh | sudo sh

Ver: https://github.com/isaacs/npm/tree/99f804f43327c49ce045ae2c105995636c847145#readme

Mi consejo es que nunca lo hagas porque básicamente significa esto:

  1. averigüe cuál es el DNS local (o cualquier otra persona que suplanta la respuesta del DNS o envenena el caché del DNS) y dice que es la dirección IP de npmjs.org
  2. conectarse con TCP inseguro con esa IP (o con quien diga que es su IP) en el puerto 80
  3. confíe en el enrutador con el que cree que debe hablar (o en cualquiera que le haya dado la respuesta DHCP, dijo que debe hablar) para entregar paquetes al host correcto
  4. posiblemente pasar por otra capa de proxy de almacenamiento en caché transparente
  5. confíe en todas las demás redes entre usted y el otro extremo de la conexión TCP
  6. no sé con certeza con quién estás conectado
  7. cruza tus dedos
  8. solicita script install.sh sobre HTTP inseguro sin verificación alguna
  9. y luego ejecute lo que sea devuelto por quien sea que esté hablando con privilegios máximos en su máquina sin siquiera comprobar qué es.

Como puede ver, esto es realmente, literalmente, sin exagerar, dar shell de raíz a lo que sea que obtenga después de pedir un script desde Internet a través de una conexión insegura sin verificación alguna . Hay al menos 5 cosas diferentes que pueden salir mal aquí, cualquiera de las cuales puede llevar a un atacante a tomar el control total de su máquina:

  1. Suplantación de DHCP
  2. ARP spoofing
  3. Envenenamiento de caché de DNS
  4. Suplantación de respuesta DNS
  5. Secuestro de sesión TCP

También tenga en cuenta que usar ‘sh’ en lugar de ‘sudo sh’ generalmente no es menos arriesgado a menos que lo ejecute como un usuario diferente que no tiene acceso a sus datos privados, que generalmente no es el caso.

Debe usar conexiones HTTPS si están disponibles para descargar dichos scripts, de modo que al menos pueda verificar con quién está hablando, y aun así no lo ejecutaría sin leer primero. Desafortunadamente npmjs.org tiene un certificado autofirmado, por lo que realmente no ayuda en este caso.

Afortunadamente, npm está disponible en GitHub que tiene un certificado SSL válido y desde donde puede descargarlo mediante una conexión segura. Ver: github.com/isaacs/npm para más detalles. Pero asegúrese de que la npm en sí misma no utilice conexiones inseguras para descargar los archivos que descarga: debería haber una opción en la configuración de npm.

Espero eso ayude. ¡Buena suerte!

La respuesta simple es que los servidores web nunca deben ejecutarse como root por razones de seguridad bien conocidas, por lo que esto también se aplica a los comandos npm.

Para comenzar de nuevo, elimine las instalaciones anteriores de Node.js y npm, así como estos archivos / directorios:

 mv ~/.npmrc ~/.npmrc~prior mv ~/.npm ~/.npm~prior mv ~/tmp ~/tmp.~prior mv ~/.npm-init.js ~/.npm-init.js~prior 

Solución: Instale Node.js (que viene con npm) como NON root (no sudo)

Descargue el Código fuente directamente desde https://nodejs.org/en/download/

Ejecute el siguiente como usted mismo (Linux / OS X)

 cd node-v8.1.2 # into expanded source dir export NODE_PARENT=${HOME}/node-v8.1.2 # put this into your ~/.bashrc 

Siéntase libre de cambiar la exportación anterior a cualquier ubicación que sea apropiada

 ./configure --prefix=${NODE_PARENT} make -j4 # for dual core ... use -j8 for quad core CPU make install 

que coloca los binarios para Node.js y npm así como su repository de módulos en $ NODE_PARENT, un directorio propiedad de $ USER que luego le permite emitir los siguientes comandos npm install xxx como usted.

Para llegar a los binarios para node y npm, modifique las variables de entorno PATH en su ~ / .bashrc:

 export PATH=${NODE_PARENT}/bin:${PATH} export NODE_PATH=${NODE_PARENT}/lib/node_modules 

Luego, para instalar paquetes en ese directorio (global), a diferencia del directorio actual (local), siempre pase en el indicador -g (global):

 npm install -g someModule 

NOTA: en ningún momento está ejecutando nada npm o relacionado con un nodo como root / sudo.

Otra razón para no instalar paquetes NPM en la raíz es que le hará enfrentar el problema de acceso a archivos con paquetes que están usando node-gyp (por ejemplo: node-sass) porque construye bibliotecas de C ++ y esas no están en la carpeta local node_modules .