如何使用subprocess.Popen以root权限打开进程

问题描述 投票:0回答:1

我正在用python脚本打开一些子过程,我需要其中之一具有root特权。

有没有一种方法,而无需以root特权运行整个脚本?

p1 = "../p1"
p2 = "../p2"
p_root = "../p_root"

proc_P1 = subprocess.Popen(p1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
proc_P2 = subprocess.Popen(p2, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
proc_ROOT = subprocess.Popen(p_root, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
python root popen
1个回答
1
投票

我可以想到两种(*)方法。

/ etc / sudoers.d

[添加一个脚本,../p_root调用是sudoers.d目录中的无密码sudo配置。此配置将允许使用无密码sudo调用only ../p_root。必须锁定脚本的写权限。至少取消其他人写chmod o-w ../p_root的权限。否则,有人可以通过编辑文件并添加自己的内容来利用此漏洞并以root的身份运行任意代码。

/etc/sudoers.d中的每个文件都包含sudo的规则。您可以在该目录中添加自己的文件,以理智地管理您的系统。 /etc/sudoers.d中的文件按顺序读取(常规命名为10-something20-else等)。必须使用visudo对其进行编辑。

visudo /etc/sudoers.d/20-special-proot

示例内容(必须使用完整的可执行文件路径)

youruser    ALL=(ALL)   NOPASSWD:   /usr/bin/bash /full/path/to/p_root

More details about sudo

SetUID

第二是设置SetUID。这是文件许可权,允许在拥有所有者许可权的情况下执行脚本。即,这意味着您将../p_root脚本拥有为root,并且可以执行该脚本的人(组/其他)将始终以root的身份运行该脚本。

chown root.yourgroup 
chmod u+s ../p_root
chmod o-w ../p_root

同样,此处也有相同的安全隐患。任何可以执行此文件的人(尤其是组或其他人都具有执行权限)将以root的身份运行内部所有内容。如果特权较低的用户(例如,其他用户)具有写权限,则他们只需编辑文件,即可将自己添加到root中,然后将PS1更改为黑底黑字。

More details

sudo(*)

根据lior.i的建议,我也添加了此选项。您可以将sudobash作为执行的命令添加到脚本路径的前缀,以实现相同的目标。

Popen(['sudo', 'bash', '/path/to/script'])

Popen是值得学习的,也是执行子流程的推荐方法,特别是从长远来看。换句话说,它可以做其余的一切。我发现,这样做的原因之一就是灵活性和调试能力。是否完全将子流程与其父流程分离的灵活性。默认情况下,如果父级被优雅地杀死(SIGINT / Ctrl + C),则也将向子级发出死亡信号。同样,它们也附加在其stdinstdoutstderr文件描述符中。也许您想利用一些新的文件描述符来解决一些魔术。

如果使用此功能,应注意的一点是不在生产中使用它。将无密码sudo留给应用用户会带来安全风险,类似于仅以root用户身份运行所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.