2012-06-17 151 views
2

我試圖運行一個python腳本作爲其他用戶(不是root),這也是沒有shell的系統用戶。我知道我不能直接在腳本上設置suid標誌,所以我寫了一個C++包裝器。運行具有不同權限的Python

wrapper.cpp

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <iostream> 

int main(void) 
{ 
    std::cout << geteuid() << std::endl; 

    setgid(getgid()); 
    setuid(getuid()); 

    execl("/usr/bin/python2.6", "/usr/bin/python2.6", "test.py", NULL); 
} 

並設置以下權限

sudo chown NoShellUser:NoShellGroup /path/to/wrapper 
sudo chmod 7755 /path/to/wrapper 

最後,嘗試一下我有一個python腳本

import sys 
import getpass 
import os 
import pwd 
print "VERSION:", sys.version 
print "USER:", getpass.getuser(), pwd.getpwuid(os.getuid()) 
print "EUSER:", pwd.getpwuid(os.geteuid()) 

有了下面的權限,如果該事項在全部

sudo chown NoShellUser:NoShellGroup /path/to/test.py 
sudo chmod 7755 /path/to/test.py 

現在,當我跑這件事爲用戶「測試」我看到這一點:

255             # UID of NoShellUser 
VERSION: 2.6.8 (unknown, Apr 12 2012, 20:59:36)  # Don't know where that comes from 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)]    # Don't know where that comes from 
USER: test pwd.struct_passwd(pw_name='test', pw_passwd='hash', pw_uid=20804, pw_gid=604, pw_gecos='Name Surname', pw_dir='/home/test', pw_shell='/bin/bash') 
EUSER: pwd.struct_passwd(pw_name='test', pw_passwd='hash', pw_uid=20804, pw_gid=604, pw_gecos='Name Surname', pw_dir='/home/test', pw_shell='/bin/bash') 

正如你所看到的有效用戶仍然是「測試」。有人可以指點我,我做錯了什麼,因爲我已經看了幾個例子,他們似乎都或多或少地顯示完全相同的東西?

+0

你爲什麼不使用'sudo'? – hop

+0

你能解釋一下這個程序的用途,以及爲什麼它需要在自己的賬戶下運行?根據情況,可能有更好的方法可供您使用。 –

+0

這是一個隊列,它運行來自安全源的可執行文件,因爲代碼中沒有任何有害內容,但在大多數情況下不是由專業開發人員編寫的安全文件,因此可能存在允許升級權限的錯誤(那裏將是未經過測試的文本輸入到這個應用程序)。這就是爲什麼我希望它儘可能地孤立。最後,我將把它放到同一個系統(uid <500)用戶所擁有的cron中,但有時我需要從web界面自己啓動它。 –

回答

1

你的包裝物上稍有不當 - 試試這個,而不是

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <iostream> 

int main(void) 
{ 
    std::cout << "Real user " << getuid() << std::endl; 
    std::cout << "Effective user " << geteuid() << std::endl; 

    setregid(getegid(), getegid()); 
    setreuid(geteuid(), geteuid()); 

    std::cout << "Real user " << getuid() << std::endl; 
    std::cout << "Effective user " << geteuid() << std::endl; 

    execl("/usr/bin/python2.6", "/usr/bin/python2.6", "test.py", NULL); 
} 

它設置了真實有效的用戶/組ID的有效組ID execing的python腳本之前。

相關問題