【问题标题】:How to run python script which require root privilage for execution in apache with mod_python at openbsd如何在openbsd上使用mod_python在apache中运行需要root权限才能执行的python脚本
【发布时间】:2013-04-09 07:56:11
【问题描述】:

我正在尝试使用 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。

【问题讨论】:

  • 拜托,伙计!你的问题很难理解。另外,您所描述的这件事对我来说似乎很错误。仅通过 pfctl(8) 更改固件状态。向我们发布您的脚本的链接,以便我们提供帮助。 httpd 以用户 www 身份运行,因为它是特权分离的,因此不允许它使用 sudo 是正确的行为。所以:更多信息,更清晰。
  • 我现在注意到您从端口使用 apache2(为什么?)所以默认情况下这不是 chrooted。你作为哪个用户运行 httpd?
  • @ramrunner mod_python 3.x 版仅支持 apache 2.x。我正在尝试使用 GUI 在 pf 中添加规则。单击按钮时,将执行 python 脚本并添加规则。我在 apache2 中嵌入了 mod_python 并尝试执行 python 脚本。但它要求root权限。我如何配置东西来执行这样的脚本。
  • 好吧,从来没有见过这个 pypf 的东西,(而且还看不到它的目的)。但正如我所见,(和格雷厄姆邓普顿所说)如果这个东西使用 ioctl 使其工作的唯一方法就是以 root 身份运行整个 apache。这与以 root 身份运行 mod_python 一起是一个非常糟糕的坏主意。所以有两种方法可以工作:(a)转储这个pypf东西并在pfctl之上编写你自己的包装器。 (b) 不要直接使用这个 pypf 程序,而是让它在一个单独的 python 程序中以 root 身份运行,并且只与它将作为 www 运行的实际 mod_py 程序进行通信(也许通过 unix 套接字?)。

标签: apache python-2.7 mod-python openbsd


【解决方案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,它是 privseped 和审计的。在 chroot 中运行网络服务器。永远不要将防火墙的控制权暴露给用户输入,特别是当它通过 Web 时。我相信,如果您详细说明您想要做什么,我们可以找到更有效和更安全的设置。

【讨论】:

  • 先生,我编辑了这个问题,请看一下。它没有使用 pfctl。它在 python 中使用 py-pf 库来维护 pf。
【解决方案2】:

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

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

还要注意 mod_python 不再维护或开发,您是否应该首先使用它是有问题的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    相关资源
    最近更新 更多