Как запустить скрипт 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
пожалуйста, мужик! ваш вопрос ОЧЕНЬ трудно понять. Кроме того, то, что вы описываете, кажется мне ОЧЕНЬ неправильным. измените состояние прошивки только через 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 с помощью графического интерфейса. При нажатии кнопки будет выполнен скрипт 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? через пфктл? допустим, вы пытаетесь добавить 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, который защищен и проверен. Запустите веб-сервер в 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