为啥在端口 80 上运行 node.js 可能不安全?

Posted

技术标签:

【中文标题】为啥在端口 80 上运行 node.js 可能不安全?【英文标题】:Why is running node.js on port 80 might not be safe?为什么在端口 80 上运行 node.js 可能不安全? 【发布时间】:2013-10-24 22:35:28 【问题描述】:

我知道 nodejs 可以在 80 端口上运行:

使用 apache/nginx 设置代理 使用 iptables 规则设置端口重定向 在应用内的端口 80 上进行快速侦听

第一个选项不是最简单的,并且需要比我需要的更多的依赖项。第二个可以工作,但在我的 OpenVZ VPS 上它不会(而且我无法编译自定义的 linux 内核)。

我也需要处理一些子域,在阅读了*** answer 之后,我尝试了第三种解决方案。 它运行良好且非常容易执行。

我想知道直接在 80 端口上运行 nodejs 时是否可能存在一些安全问题?我该如何修复/找到这些?

我想使用 pm2 来处理进程,它可能会运行 not as root (Goodbye node-forever hello pm2)。

【问题讨论】:

为什么会比其他端口安全? @dystroy:它可能不如通过 nginx 代理安全,以防有人发现 Node 的 HTTP 解析器中的漏洞。 @dystroy 好问题,所以使用代理、iptable 或直接在端口 80 上运行它会导致相同的安全问题? 如果您的防火墙没有屏蔽原始端口,那是肯定的。如果确实如此并且您使用了代理并且 Node 的 http 解析器中存在被代理掩盖的漏洞,那么此解决方案可能会更快。但我对此表示严重怀疑,在考虑这样的解决方案之前,我需要一个指向该漏洞的链接。 【参考方案1】:

第一个选项不是最简单的,需要更多的依赖项然后我需要

请查看why should one use a http server in front of a framework web server 有很多正当理由您实际上应该这样做

使用 iptables 规则设置端口重定向

这可能比直接让你的节点进程监听端口 80 更好,尽管我还没有看到生产中使用过这种类型的配置。

在应用内的端口 80 上进行快速侦听

这在功能上是一个糟糕的选择,因为您没有获得上面链接答案中概述的好处,但是,从严格的安全角度来看,要记住的关键是 您不能以 root 身份运行您的节点进程,这将是一个可怕的安全问题。您必须是 root 才能绑定到端口 80,因为这是 unix 的规则,但您可以而且必须在绑定到该端口后立即更改为权限较低的用户。

【讨论】:

我正在使用pm2,我认为他们正在努力以用户身份运行它。感谢您的链接非常有趣! 在端口重定向和使用像HAProxy 这样的重定向代理之间有一个很好的界限。正如您所指出的,以root 运行几乎总是一个非常糟糕的主意。

以上是关于为啥在端口 80 上运行 node.js 可能不安全?的主要内容,如果未能解决你的问题,请参考以下文章

如何在端口 80 上运行 Node.js?

即使没有其他进程阻塞该端口,Node.js 应用程序也无法在端口 80 上运行

如何使用 Amazon Elastic Beanstalk 在端口 80 上安全地运行 Node.js 服务器?

我应该 node.js 监听哪些端口?如何以及为啥?

在端口 80 上运行节点 js,而不以 root 身份运行

如何在 openSUSE 上使用 NGINX 或 Apache2 将我的端口 80 重新路由到 localhost:3000 以便我可以运行我的 Node.js 应用程序