【问题标题】:How to run node.js as non-root user?如何以非 root 用户身份运行 node.js?
【发布时间】:2013-07-02 07:20:57
【问题描述】:

我正在运行一个 node.js 服务器,它将服务于端口 80 上的请求等。显然,这需要应用程序以 root 身份运行(在 Linux 上)。

以这篇文章 (http://syskall.com/dont-run-node-dot-js-as-root) 为例,很明显有一些简单的方法可以让 node 以非 root 用户身份运行,但我想知道是否有人对建议的不同方法:

  1. 代码:在 80 端口监听建立后,使用 setuid() 从 root 下拉到非特权用户。

  2. 使用某种代理服务器将请求重定向到 >1024 端口(因此不需要节点以 root 身份运行)

  3. 使用 IP 表转发到另一个端口(同上节点不会以 root 身份运行)

谢谢

【问题讨论】:

  • 我猜现代解决方案是使用 nginx 之类的东西并在内部路由流量。

标签: node.js root iptables


【解决方案1】:

选项 1 要求您以 root 身份启动节点服务器。不理想。

选项 2 会为每个处理的请求增加开销,并为您的堆栈添加另一个故障点。

选项 3 是最简单、最有效的方法。

要实现选项 3,请将以下内容添加到您的系统初始化脚本中。 (/etc/rc.d/rc.local 在基于 RedHat 的系统上,如 AWS)。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

这会将请求从端口 80 重定向到端口 3000。

【讨论】:

  • 赞成。请注意,至少在 Ubuntu 上,上面的 iptables 命令不是永久的...要确保在下次启动时保留该规则,您需要确保有一个启动脚本可以使用恢复 iptables 规则iptables-restore 命令,如下所述:rackspace.com/knowledge_center/article/ubuntu-setup
  • 选项 3 是大多数 NodeJS 开发人员部署他们完成的网站的方式吗?如果没有,它们通常如何允许客户端浏览器连接到端口 80?
  • 取决于你的情况。较大的部署使用前端负载均衡器,这与选项 2 相同。很多人使用 Heroku,它使用前端负载均衡器;再次选项 2。但是,如果您将其部署在具有 root 访问权限的服务器上,那么我推荐选项 3。这很简单,您不必担心配置反向代理。也就是说,如果您愿意的话,一定要看看 Heroku。它们使部署变得超级容易。
  • 有没有办法将此答案标记为已接受? OP显然不会这样做,这是一个巨大的耻辱。
  • 还有什么?节点进程仍然从 root 用户运行,如果有漏洞,攻击者将关闭整个系统:)
【解决方案2】:

(我没有足够的声誉来添加对马特布朗的评论,所以我写这个作为答案。随意编辑。)

有一种比 Matt Browne 的链接中描述的更简单的方法可以在重启后自动加载 iptables 规则:可以使用 apt-get 从存储库安装 iptables-persistent:

apt-get install iptables-persistent

规则仍然需要像这样手动保存:

IPv4:

iptables-save > /etc/iptables/rules.v4

IPv6:

iptables-save > /etc/iptables/rules.v6

(来源:http://www.thomas-krenn.com/de/wiki/Iptables_Firewall_Regeln_dauerhaft_speichern(德语))

【讨论】:

    【解决方案3】:

    我喜欢这种解决方法的简单性:

    sudo setcap 'cap_net_bind_service=+ep' `which node`
    

    它也适用于 nodejs 以外的程序。

    基本上,作为第二个参数,您键入程序可执行文件的路径(如 Ubuntu 上的 /usr/bin/nodejs),在上述情况下,which node 应该动态提供它,从而使其独立于 Linux 发行版工作。

    请注意,当您升级 nodejs 或可执行文件由于某些其他原因被覆盖时,您将不得不再次执行相同的命令。

    来源:

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 2017-07-08
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      相关资源
      最近更新 更多