允许非root用户process.setuid给某个其他用户

时间:2017-09-05 04:51:32

标签: node.js linux ubuntu

我以非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。

1 个答案:

答案 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");