我以非根用户身份运行 Node.js 进程,权限非常有限 (limited_user
)。
但是,在这个应用程序中,有一个潜在的可攻击部分,我(在其他安全预防措施中)希望以权限更低的用户身份运行。我想通过将程序的这一部分放入不同的文件并使用 childProc.execSync("node my_dangerous_subprocess.js");
来执行它
在该文件中,process.setuid('very_limited_user');
用于切换到不同的用户。
这行得通,只要我以 root/sudo 身份运行主进程。但是,我不想要那样。该过程应由 limited_user
运行 - 如果可能,没有 sudo 权限。
那么,在 Ubuntu 16.04 LS 上运行,我该怎么做才能让某个非根用户(limited_user
)切换到某个其他用户(very_limited_user
)通过 process.setuid
?
使用的 Node.js 版本是 6.10.2。
最佳答案
你不仅可以使用sudo
命令以管理员身份运行某些程序,sudo
命令还可以用于以特定用户身份运行某些程序。
我不知道是否可以配置 sudo
使得特定命令可以作为特定用户执行而无需输入密码。
那么你要做的是:
childProc.execSync("sudo -u very_limited_user node my_dangerous_subprocess.js");
我自己不会这样做,因为我不知道 sudo
配置文件(而且我害怕以 sudo
的方式破坏这些文件不再工作了)但我可以很好地编写 C 语言。
我会编写以下程序:
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
i=geteuid();
setreuid(i,i);
i=getegid();
setregid(i,i);
execlp("node","node","my_dangerous_subprocess.js",NULL);
fprintf(stderr,"Could not execute node!\n");
return 1;
}
(注意 "node"
作为 execlp()
的参数出现了两次。)
我将编译程序并更改用户 ID、组 ID 和生成的可执行文件的标志(在此示例中,C 源文件名为“my_dangerous_part.c”):
gcc -o my_dangerous_part.bin my_dangerous_part.c
sudo chown less_privileged_user:less_privileged_group my_dangerous_part.bin
sudo chmod 6755 my_dangerous_part.bin
然后我可以像这样运行程序:
childProc.execSync("/directory_containing_the_file/my_dangerous_part.bin");
关于node.js - 允许非 root 用户 process.setuid 给某些其他用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46047205/