2012-06-17 2 views
2

Я пытаюсь запустить скрипт python как другой пользователь (не root), который также является системным пользователем без оболочки. Я понимаю, что я не могу установить 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 

Наконец, чтобы попробовать его у меня есть питон скрипт

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

Ну, это очередь, которая запускает исполняемые файлы, которые исходят из безопасного источника с точки зрения того, что в коде нет ничего вредного, но не безопасно с точки зрения того, что они в основном написаны не профессиональными разработчиками, поэтому могут быть ошибки, позволяющие повысить разрешения (там будет нестационарным текстовым вводом для этих приложений). Вот почему я хочу, чтобы он был как можно более изолированным. В конце концов, я буду помещать его в cron, принадлежащий этой же системе (uid <500), но время от времени мне нужно будет запустить его сам, из веб-интерфейса. –

ответ

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); 
} 

Он устанавливает реальные и эффективные идентификаторы пользователей/групп к эффективному идентификатору группы, прежде чем execing сценарий питона.

Смежные вопросы