允许非 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 给某些其他用户的主要内容,如果未能解决你的问题,请参考以下文章