允许非 root 用户处理.setuid 给某些其他用户

Posted

技术标签:

【中文标题】允许非 root 用户处理.setuid 给某些其他用户【英文标题】:Allow non-root user to process.setuid to certain other user 【发布时间】:2017-09-05 04:51:31 【问题描述】:

我以非 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) 通过 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很好。

我会编写以下程序:

#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");

【讨论】:

以上是关于允许非 root 用户处理.setuid 给某些其他用户的主要内容,如果未能解决你的问题,请参考以下文章

运行 root 仅执行具有非 root id 的进程

CentOS7--su和sudo

赋予非 root 用户进程能力以改变其友好性

CentOS说 | 为什么我们不允许非root用户直接运行Docker命令?

记录一次setcap提权失败的经历

Ubuntu sudo:must be setuid root,失手改了usr目录的权限,在机房的血泪恢复全记录