如何运行需要root权限的python脚本,以便在openbsd中使用mod_python在apache中执行

时间:2013-04-09 07:56:11

标签: apache python-2.7 mod-python openbsd

我正在尝试使用mod_python在Apache 2.x中运行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

我正在尝试使用需要root权限的python脚本在防火墙中添加规则。它要求root权限?请有人帮忙。

    #!/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?")

这是我想通过openBSD的apache执行的python脚本。它使用mod_python。

2 个答案:

答案 0 :(得分:1)

请将你的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,它是私有的和审计的。在chroot中运行Web服务器。当来自网络时,切勿将防火墙的控制权暴露给用户输入。我相信如果你详细说明你想做什么,我们可以找到一个更加高效和安全的设置。

答案 1 :(得分:1)

您无法以root用户身份在mod_python下运行Python脚本。这是因为Apache总是会将权限下放给不受信任的用户。解决它的唯一方法是从源代码重新编译Apache并定义一个魔术预处理器宏,它启用安全漏洞,允许Apache工作进程以root身份运行。

总之,不要这样做,这很危险。

另外请注意,不再维护或开发mod_python,并且首先是否应该使用它是值得怀疑的。