所以我想在端口 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
,并且由于用户不允许使用特权端口,所以这永远不会起作用。
我能想到的解决这个问题的方法有两种:
答案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)。