node.js - 允许非 root 用户 process.setuid 给某些其他用户

标签 node.js linux ubuntu

我以非根用户身份运行 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/

相关文章:

node.js - 如何查询电子邮件与 example@gmail.com 匹配的嵌套文档的嵌套文档

c - 使用 setlocale() 和 gettext() 在 Ubuntu 上测试语言环境

c++ - 非法参数 Execv() Unix C++

linux - 自从安装了 Docker/Discourse 之后,GitLab 就不再工作了

bash - 我想使用终端中的转换命令删除白色背景,并且图像不在彩色像素之外

python - gRPC Node Js 客户端 : "Method not found"

javascript - Node.js 将函数导出为文件之间的变量或对象

Linux 发行版 info/man/doc/etc 来源

php - 在 Ubuntu 中使用 Foreman 在本地运行 Heroku PHP 项目时权限不正确

node.js - 在异步插件中正确使用 HandleScope