繁体   English   中英

不是root用户通过python执行iptables shell

[英]NOT root user execute iptables shell by python

我写一些代码来通过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执行。 有人可以给些建议吗? 非常感谢!

不要这样 您的服务器现已开放接受攻击。

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

相反,使用您的Web应用程序触发或安排任务,并以不同的非root用户身份运行另一个进程 ,并从此队列中读取任务并执行它们。

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

某些命令仅限于root用户是有原因的:)

您可以使用sudo命令,该命令允许任何用户执行一些root命令,请在此处查看如何配置sudo以供您使用。

如果您对root执行有其他疑问,我建议您尝试https://unix.stackexchange.com/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM