在 Linux(Ubuntu)中使用端口 80 运行 Node.js 的最佳实践


我们知道,大多数情况下,我们希望我们的 Node 应用程序监听端口 80。虽然这是一种广泛使用的技术,并且很多时候我们不需要除了在项目配置中简单地提及端口 80 之外的任何其他操作。但实际问题在于,如今许多操作系统都需要 root 权限才能实现这一点(例如,OS X、BSD)。

一种解决方法是确保我们以超级用户身份启动应用程序。

命令

sudo node server.js

虽然这实际上可以在很大程度上解决问题,但这种方法也存在其漏洞。此步骤涉及许多潜在风险。一个简单的例子是,如果有人控制了我们的应用程序,然后开始对其进行恶意操作。

因此,通常不建议在整个会话期间以 root 身份运行应用程序。

另一种更好的方法是将当前运行我们进程的用户帐户降级到安全性较低的用户帐户,例如我们的普通帐户。

为了做到这一点,我们需要全局进程上的两种方法来处理从安全用户到安全性较低用户的进程转移。

这两个全局进程是:

  • setgid()

  • setuid()

我们可以创建一个简单的函数来调用上述两个函数,这将确保端口 80 保持受保护,同时仍防止我们以 root 用户身份提供请求。

请考虑以下所示的函数:

function drop_root_priviliges(){
   process.setgid(‘unknown’)
   process.setuid(‘unknown’)
}

下面显示了上述函数的完整工作示例。

const process = require('process');
const http = require('http');
var server = http.createServer(function(req, res) {
   res.write("Success!");
   res.end();
});

server.listen(80, null, null, function() {
   console.log('User ID is:',process.getuid()+', Group ID:',process.getgid());
   drop_root_priviliges();
   console.log('User ID is:',process.getuid()+', Group ID:',process.getgid());
});

更新于:2021年7月29日

620 次查看

开启你的 职业生涯

通过完成课程获得认证

开始
广告