我以非root用户身份运行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上运行,我该怎么做才能允许某个非root用户(limited_user
)通过very_limited_user
切换到某个其他用户(process.setuid
) ?
使用的Node.js版本是6.10.2。
答案 0 :(得分:1)
您不仅可以使用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源文件名为&#34; my_dangerous_part.c&#34;):
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");