使用 su -(用户)打开特权端口不起作用

使用 su -(用户)打开特权端口不起作用

所以我想在端口 80 上运行一个 Node 服务器,但我不想以 root 权限运行整个过程,为了安全起见,我认为这是最好的。

因此我认为一个好的解决方案是以 root 身份使用:

su - (myuser)-c'要运行的节点永久脚本'

但是我得到了 EACCESS 错误,但直接以 root 身份运行脚本却没问题。我听说其他人也做了同样的事情,而且他们也成功了,那么是不是我做了不同的事情?

有没有更好的策略来做到这一点,以 root 权限打开端口,然后在应用程序运行后放弃 root 权限?

答案1

是的,可以做到这一点。请参阅这篇博客文章,它比我的解释更好。

https://thomashunter.name/blog/drop-root-privileges-in-node-js/

我在这里复制相关代码,以防博客不可用

app.listen(80, 'localhost', null, function() {
  // Listening
  try {
    console.log('Old User ID: ' + process.getuid() + ', Old Group ID: ' + process.getgid());
    process.setgid('users');
    process.setuid('tlhunter');
    console.log('New User ID: ' + process.getuid() + ', New Group ID: ' + process.getgid());
  } catch (err) {
    console.log('Cowardly refusing to keep the process alive as root.');
    process.exit(1);
  }
});

答案2

su - <user>在执行任何其他操作之前切换到<user>,因此 NodeJS 服务器将以您的用户身份启动,并且对 root 运行命令没有任何线索su,并且由于用户不允许使用特权端口,所以这永远不会起作用。

我能想到的解决这个问题的方法有两种:

  1. 用一个文件能力这将允许非特权用户打开特权端口。虽然它们通常不适用于脚本,但在这种情况下它们应该可以工作,因为据我所知,您使用 启动服务器node <filename>。(如果我错了,请纠正我。)

  2. 使用反向代理NGINX它位于应用服务器前面,以 root 身份运行。在这种情况下,用户直接连接到 NGINX,然后 NGINX 代理与应用服务器的连接,但更轻松地让您运行多个服务器/实例并让 NGINX 缓存资源。在部署应用服务器时,这往往是普遍首选的方法。

答案3

如果使用 Gnu/Linux,那么您可以使用功能赋予应用程序打开特权端口的能力,而不赋予其他能力(root 赋予所有能力)。

请参阅此处了解非常基本的介绍https://unix.stackexchange.com/questions/101263/what-are-the-different-ways-to-set-file-permissions-etc-on-gnu-linux

[编辑:] 您正在寻找的 GNU/Linux 功能是 cap_net_bind_service。在 Solaris 上,使用 PRIV_NET_PRIVADDR。有关更多详细信息,请参阅 man capabilities(7) (Linux) 或 man privacy(5) (Solaris)。

相关内容