2017-09-05 153 views
1

我运行Node.js进程作为非root用户权限非常有限(limited_user)。允许非root用户process.setuid某些其他用户

但是,在这个应用程序中,有一个潜在的可攻击的部分,我(除其他安全防范措施外)希望以更低权限的用户身份运行。我想这样做是通过将这部分程序放到一个不同的文件中并用childProc.execSync("node my_dangerous_subprocess.js"); 来执行它。在该文件中,process.setuid('very_limited_user');用于切换到不同的用户。

这很有效,只要我以root/sudo身份运行主进程即可。但是,我不想那样。如果可能的话,该流程应该由limited_user运行 - 没有sudo权限。

因此,在Ubuntu 16.04 LS上运行,我能做些什么来允许某个非root用户(limited_user)通过process.setuid切换到某个其他用户(very_limited_user)?

Node.js使用的版本是6.10.2。

回答

1

您不仅可以使用sudo命令以管理员身份运行某个程序,还可以使用sudo命令以某个用户的身份运行某个程序。

我不知道是否有可能以某种方式配置sudo,使某个命令可以作为特定用户执行而不需要输入密码。

所以,你会做的是:

childProc.execSync("sudo -u very_limited_user node my_dangerous_subprocess.js"); 

,因为我不知道sudo配置文件我自己不会做这(和我怕毁灭的方式,sudo这些文件不再工作),但我可以编程C足够好。

我会写下面的程序:(注意,"node"两次出现的execlp()参数)

#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; 
} 

我编译程序和改变用户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 

然后,我可以运行该PR像这样:

childProc.execSync("/directory_containing_the_file/my_dangerous_part.bin"); 
相关问题