2012-06-17 152 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脚本之前。

相关问题