2017-09-05 117 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"); 
相關問題