首页 文章

npm如何/为什么建议不以root身份运行?

提问于
浏览
53

简而言之......

首先,为什么npm建议它应该只作为非root运行?我非常不相信所有其他包经理( aptyumgempacman )都不适合要求sudo .

其次,当我按照他们的建议(并以非root用户身份运行 npm install )时,它获得了对/ usr / local / lib的许可 . 我如何遵循他们的建议?我不打算 chown -R $USER /usr/local/lib ,因为这对我来说似乎是一个非常糟糕的主意 .

完整描述......

我通过 curl http://npmjs.org/install.sh | sudo sh (README中的指令)安装了npm .

当我运行 sudo npm install mongoose 时,npm告诉我不要以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!

但是当我在没有sudo的情况下运行 npm install mongoose 时,我得到以下内容:

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

所以它告诉我不应该使用sudo,如果我按照他们的建议则不行 .

这导致我上面的初步问题 .

3 回答

  • 20

    实际上,npm确实 not 建议不要以root身份运行 . 好了,不再了 .

    它在您提出问题的同时发生了变化 . 这就是自述文件在2011年2月7日的样子:"Using sudo with npm is Very Not Recommended. Anyone can publish anything, and package installations can run arbitrary scripts."后面有更详细的解释,如"Option 4: HOLY COW NOT RECOMMENDED!! You can just use sudo all the time for everything, and ignore the incredibly obnoxious warnings telling you that you're insane for doing this."

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

    现在它实际上被认为是安装npm的推荐技术:

    简单安装 - 要使用一个命令安装npm,请执行以下操作:curl http:/ / npmjs.org/install.sh | sudo sh

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

    我的建议是 never do it 因为它基本上意味着:

    • 找出本地DNS(或任何欺骗DNS响应或中毒DNS缓存的人)说的是npmjs.org的IP地址

    • 在端口80上使用不安全的TCP连接该IP(或与谁说是他的IP)

    • 信任您认为应该与之交谈的路由器(或任何给您DHCP响应的人说你应该与之交谈)将数据包传送到正确的主机

    • 可能会通过另一层透明缓存代理

    • 信任您与TCP连接另一端之间的所有其他网络

    • 不确定您与谁有联系

    • 交叉你的手指

    • 请求不安全的HTTP上的install.sh脚本,无需任何验证

    • 然后运行您正在与之交谈的任何人返回的任何内容,并且无需检查它是什么 .

    正如你可以看到的那样,从字面上看,毫不夸张地说,无论你在没有任何验证的情况下通过不安全的连接从互联网上索取脚本,你得到的任何东西都会得到 root shell . 这里至少有5种不同的东西可能出错,其中任何一种都可能导致攻击者完全控制你的机器:

    • DHCP欺骗

    • ARP欺骗

    • DNS缓存中毒

    • DNS响应欺骗

    • TCP会话劫持

    另请注意,使用“sh”代替“sudo sh”通常风险不小,除非您将其作为无法访问您的私人数据的其他用户运行,通常情况并非如此 .

    您应该使用HTTPS连接(如果可用)下载此类脚本,这样您至少可以验证您正在与谁通话,即使这样我也不会在没有先阅读的情况下运行它 . 不幸的是,npmjs.org有一个自签名证书,所以在这种情况下它并没有真正的帮助 .

    幸运的是,npm在GitHub上可用,它具有有效的SSL证书,您可以从中使用安全连接下载它 . 有关详细信息,请参阅:github.com/isaacs/npm . 但要确保npm本身不使用不安全的连接来下载它下载的文件 - 在npm config中应该有一个选项 .

    希望能帮助到你 . 祝好运!

  • 2

    简单的答案是,出于众所周知的安全原因,Web服务器永远不应该以root身份运行,因此这也适用于npm命令 .

    要重新开始,请删除之前的Node.js和npm安装以及这些文件/目录:

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

    解决方案:将Node.js(随npm一起提供)安装为NON root(无sudo)

    直接从https://nodejs.org/en/download/下载源代码

    自己执行以下操作(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
    

    随意改变以上出口到任何适当的位置

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

    它将Node.js和npm的二进制文件以及它的模块存储库放入$ NODE_PARENT,这是一个$ USER拥有的目录,然后允许你自己发出后续的npm install xxx命令 .

    要获取node和npm的二进制文件,请更改〜/ .bashrc中的PATH环境变量:

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

    然后将包安装到该目录(全局),与当前目录(local)相反,始终传入-g标志(全局):

    npm install -g someModule
    

    注意 - 在任何时候你都不执行任何npm或与root / sudo相关的节点 .

  • 50

    not 在root下安装NPM软件包的另一个原因是,它会导致您使用node-gyp(例如:node-sass)的软件包遇到文件访问问题,因为它构建了C libs,而且它们不在本地 node_modules 文件夹中 .

相关问题