Как да стартирате скрипт на python, който изисква права на root за изпълнение в apache с mod_python в openbsd

Опитвам се да стартирам скрипт на python в Apache 2.x с mod_python. Редактирах httpd.conf с издател

    LoadModule python_module /usr/local/apache2/modules/mod_python.so
 <Directory /usr/local/apache2/htdocs/mod_python>

SetHandler mod_python
PythonHandler mod_python.publisher
PythonDebug On

I am trying to add a rule in firewall using python script which require root privilege. it's asking for root privilege ? Please somebody help.

    #!/usr/local/bin/python
    #from mod_python import apache
    import sys
    import errno
    import pf

    def index(req):
         filter = pf.PacketFilter()

         try:
              # Enable packet filtering
              filter.enable()
              print  "pf is enabled"
              return "pf is enabled"
         except IOError, (err, msg):
                if err == errno.EACCES:
                      #sys.exit("Permission denied: are you root?")
                       return ("Permission denied: are you root?")
                elif err == errno.ENOTTY:
                        #sys.exit("ioctl not supported by the device: is the pf device correct?")
                        return ("ioctl not supported by the device: is the pf device correct?")

това е скрипт на python, който искам да изпълня през apache в openBSD. той използва mod_python.


person Uday Pratap Singh    schedule 09.04.2013    source източник
comment
моля те, човече! въпросът ви е МНОГО труден за разбиране. Освен това това нещо, което описвате, ми се струва МНОГО грешно. променяйте само състоянието на fw чрез pfctl(8). публикувайте ни връзка към вашия скрипт, за да можем да помогнем. httpd работи като потребител www, тъй като е разделен с привилегии, така че да не му разрешавате sudo е правилното поведение. така че: повече информация, повече яснота.   -  person ramrunner    schedule 09.04.2013
comment
сега забелязах, че използвате apache2 от портове (защо?), така че това не е chroot по подразбиране. като кой потребител изпълняваш httpd?   -  person ramrunner    schedule 09.04.2013
comment
@ramrunner mod_python версия 3.x поддържа само apache 2.x. Опитвам се да добавя правило в pf с помощта на GUI. При щракване върху бутон ще се изпълни python скрипт и ще се добави правило.. Вградих mod_python в apache2 и се опитвам да изпълня python скрипт. Но иска root привилегия. Как мога да конфигурирам неща за изпълнение на такъв скрипт.   -  person Uday Pratap Singh    schedule 10.04.2013
comment
Е, никога не съм виждал това нещо pypf (и все още не виждам целта му). Но както го виждам (и каза Греъм Дъмпълтън), ако това нещо използва ioctl, единственият начин да го накара да работи е да стартира целия apache като root. това заедно със стартирането на mod_python като root е изключително лоша лоша идея. Така че два подхода могат да работят: (а) изхвърлете това нещо pypf и напишете свои собствени обвивки върху pfctl. (b) вместо да използвате тази програма pypf директно, накарайте я да стартира като root в отделна програма на python и да комуникира с нея само с действителната програма mod_py, която ще работи като www (може би чрез unix сокет?).   -  person ramrunner    schedule 15.04.2013


Отговори (2)


Моля, публикувайте някъде вашия скрипт на Python и ни дайте връзката. Как вашият python скрипт се опитва да комуникира с pf? чрез pfctl? да кажем, че се опитвате да добавите IP към таблица

pfctl -t thetable -T add x.x.x.x 

Разберете кой потребител изпълнява apache

ps aux | grep apache 

След това трябва да редактирате /etc/sudoers, за да може този потребител да изпълни командата pfctl без парола. Да кажем, че стартирате apache като www. поставете следното в sudoers:

www ALL=(ALL:ALL) NOPASSWD: /sbin/pfctl

Накрая в скрипта на Python (да кажем, че извиквате външната команда с подпроцес)

from subprocess import call
call(["sudo","pfctl","-T","theTable","-t","add", "x.x.x.x"])

Но моля, имайте предвид, че цялата схема наистина е лоша идея и не трябва да го правите по този начин. отървете се от скрипта на python, ако можете, и стартирайте пакета apache 1.3, който е privseped и одитиран. Стартирайте уеб сървъра в chroot. Никога не излагайте контрола на вашата защитна стена на информация от потребителя, особено когато това идва през мрежата. Сигурен съм, че ако уточните какво искате да направите, можем да намерим много по-ефективна и сигурна настройка.

person ramrunner    schedule 10.04.2013
comment
господине, редактирах въпроса, моля, погледнете го. не използва pfctl. използва библиотека py-pf в python за поддържане на pf. - person Uday Pratap Singh; 15.04.2013

Не можете да стартирате Python скриптове под mod_python като root потребител. Това е така, защото Apache винаги ще откаже привилегиите на ненадежден потребител. Единственият начин да го заобиколите би бил да прекомпилирате Apache от изходния код и да дефинирате магически макрос за препроцесор, който позволява дупката в сигурността, която позволява на работните процеси на Apache да се изпълняват като root.

Накратко, не го правете, опасно е.

Също така имайте предвид, че mod_python вече не се поддържа или разработва и е под въпрос дали трябва да го използвате на първо място.

person Graham Dumpleton    schedule 14.04.2013