非root用户通过python执行iptables shell

时间:2014-06-12 10:44:17

标签: python unix root

我编写了一些代码来通过python执行iptables command。这是代码:

import subprocess

def check_output(*popenargs, **kwargs):
    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')
    process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        raise subprocess.CalledProcessError(retcode, cmd)
    return output


def accept_port(port):
    try:
        cmd = r"iptables -A INPUT -p tcp --dport {0} -j ACCEPT && iptables -A OUTPUT -p tcp --sport {0} -j ACCEPT".format(port)
        output = check_output(cmd, shell=True)
        return True
    except Exception:
        return False

if __name__ == "__main__":
    accept_port(1234)

当我以root用户运行代码时,一切顺利。但是当我使用用户apache执行上述代码时,它失败了。如果我想要由用户apache执行代码而不是root,我该怎么办?我认为iptables command必须由root user执行。有人可以提一些建议吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

不要这样做。您的服务器现在可以利用。

apache用户不是一般用途,它的设计和限制由Apache进程使用。

相反,使用您的Web应用程序触发器或计划任务,并使不同的进程作为不同的非root用户从此队列中读取任务并执行它们。

使用sudo,您只能允许这个单独的用户执行某些命令。这样,您的apache用户无权运行命令,并且您正在利用操作系统的安全角色来隔离操作。

为某些命令仅限root用户有一个原因:)

答案 1 :(得分:0)

您可以使用允许任何用户执行某些sudo命令的root命令,查看here以了解如何配置sudo供您使用。

如果您对root处决有进一步的问题,我建议您尝试https://unix.stackexchange.com/