【问题标题】:How/why does npm recommend not running as root?npm 如何/为什么建议不要以 root 身份运行?
【发布时间】:2011-02-08 21:21:10
【问题描述】:

总之...

首先,为什么npm 建议它只能以非root 身份运行?我非常不相信所有其他包管理器(aptyumgempacman)都要求 sudo 是错误的。

其次,当我按照他们的建议(并以非 root 身份运行 npm install)时,它不起作用(因为非 root 没有权限访问 /usr/local/lib)。我该如何听从他们的建议?我不会去chown -R $USER /usr/local/lib,因为这对我来说是个非常糟糕的主意。

完整描述...

我通过curl http://npmjs.org/install.sh | sudo sh(他们的自述文件中的说明)安装了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,然后如果我遵循他们的建议就不起作用。

这导致了我上面最初的问题。

【问题讨论】:

  • 这是我的理解。 apt 等其他包管理器应该以 root (help.ubuntu.com/community/AptGet/Howto) 身份运行,因为它们是正确构建的。 npm 还没有完全完成他们的产品,所以 npm 应该 可以作为 root 运行,但是他们还没有完成这个功能 (github.com/isaacs/npm/issues/294)。在他们这样做之前,以 sudo 运行实际上是不安全的。
  • 因为写这篇文章的人真的很烦人,我只能弄清楚。

标签: node.js npm


【解决方案1】:

实际上,npm 确实建议不要以 root 身份运行。好吧,不再是了。

它在您提出问题的同时发生了变化。这是 2011 年 2 月 7 日 README 的样子:“非常不推荐将 sudo 与 npm 一起使用。任何人都可以发布任何内容,并且软件包安装可以运行任意脚本。”详细信息为 “选项 4:不推荐神圣的牛!你可以一直使用 sudo 来处理所有事情,而忽略那些令人难以置信的令人讨厌的警告,告诉你这样做太疯狂了。” p>

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

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

简单安装 - 要使用一个命令安装 npm,请执行以下操作:

curl http://npmjs.org/install.sh |须藤sh

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

我的建议是永远不要这样做,因为这基本上意味着:

  1. 找出本地 DNS(或任何其他欺骗 DNS 响应或毒化 DNS 缓存的人)所说的是 npmjs.org 的 IP 地址
  2. 在端口 80 上使用该 IP(或与谁说这是他的 IP)连接不安全的 TCP
  3. 相信您认为应该与之通信的路由器(或任何给您 DHCP 响应的人说您应该与之通信)将数据包传送到正确的主机
  4. 可能会经过另一层透明缓存代理
  5. 信任您与 TCP 连接另一端之间的所有其他网络
  6. 不确定与谁有联系
  7. 交叉手指
  8. 通过不安全的 HTTP 请求 install.sh 脚本,无需任何验证
  9. 然后在您的计算机上以最大权限运行您正在与之交谈的任何人返回的任何内容,甚至无需检查它是什么。

正如您所看到的,在通过不安全的连接从 Internet 请求脚本后,毫不夸张地将 root shell 提供给 无论你得到什么 没有任何验证。这里至少有 5 种不同的事情可能出错,其中任何一种都可能导致攻击者完全控制您的机器:

  1. DHCP 欺骗
  2. ARP 欺骗
  3. DNS 缓存中毒
  4. DNS 响应欺骗
  5. TCP 会话劫持

另请注意,使用“sh”而不是“sudo sh”通常不会降低风险,除非您以无权访问您的私人数据的其他用户身份运行它,通常情况并非如此。

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

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

希望对您有所帮助。祝你好运!

【讨论】:

  • 非常感谢您深思熟虑的回复!这有助于我安装 npm 而不会出现此类安全问题。但是,一旦我安装了 npm,我的问题的另一部分仍然没有得到回答。换句话说,我现在可以安装 npm,但我该如何使用 npm?我是否以 root 身份运行 npm
  • @Zed 不错的想法,但它们并不能真正帮助您。一旦你克隆一个 git repo 并运行它的 makefile,你就可能被感染。只要你只安装了一个恶意 npm 包,你就可能被感染。此外,只要您的帐户能够sudo 并且您有时会为此使用它,那么在被感染时不成为 root 对攻击者做坏事的能力的影响为零。
  • @thejh 如果软件本身按照作者的意图是恶意的,我的建议对您没有帮助。但它有助于更​​可能的情况,即软件很好,但您确实不是在与作者交谈,而是与想要为您提供该软件的特洛伊木马版本的人交谈。如果您从 GitHub 获得官方版本,那么在我看来,它不太可能是恶意的。但是,当然,是否是 root 几乎是无关紧要的,因为您在 $HOME 中的私人文件通常是我所说的最重要的,另外还有 sudo 正如您所说的那样。 100% 同意这一点。
  • npmjs 现在使用带有 DigiCert 的 https 连接作为授权,因此您可以非常确定自己在与谁交谈。
【解决方案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 自带)安装为非 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

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

npm install -g someModule

注意 - 您在任何时候都不会以 root / sudo 执行任何与 npm 或节点相关的内容。

【讨论】:

  • 感谢 Scott,在完全卸载后对我有很大帮助
【解决方案3】:

在根目录下安装 NPM 包的另一个原因是,它会导致您面临使用 node-gyp(例如:node-sass)的包的文件访问问题,因为它构建 C++ 库而那些不在本地node_modules 文件夹中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2019-04-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多