以root身份执行Python脚本(seteuid vs c-wrapper)
我想要从Django(www用户)调用的python脚本中快速创建一个任务,这将需要root权限。以root身份执行Python脚本(seteuid vs c-wrapper)
起初我以为我会使用Python的os.seteuid()并在脚本上设置setuid位,但后来我意识到我将不得不在Python本身上设置setuid位,我认为它是大的没有。从我所知道的情况来看,如果使用sudo,也是如此,我真的很想避免这种情况。
在这一点上,我正在考虑编写一个C封装使用seteuid并以root身份调用我的python脚本,并将必要的参数传递给它。
这是正确的事情还是应该看看别的东西?
sudo不需要Python上的setuid位。您可以启用sudo的一个命令而已,没有参数:
www ALL=(ALL) NOPASSWD: /root/bin/reload-stuff.py ""
这将是安全的,如果你的脚本不带任何参数,无法通过WWW用户覆盖,须藤做“env_reset”(默认的最发行版)。
您可以接受参数,但要非常小心 - 不要输出文件名,请确保您验证所有输入。在这种情况下,从sudo行末尾删除“”。
sudo
允许您限制传递给程序的参数。 From man sudoers
:
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
On the ALPHA machines, user john may su to anyone except root but
he is not allowed to specify any options to the su(1) command.
所以使用sudo。当然,你需要对根访问格外小心 - 确保只有root可以修改脚本本身和任何父目录,并且脚本是安全的,只有绝对最小值需要以root身份运行。
我可能是错的,但是这仍然需要给Python解释器本身的WWW用户sudo的根访问,和你基本上使用sudo的说法解析器只允许运行脚本。这是正确的吗?如果是的话,它很容易也占到参数传递给脚本(键/值)? – kwl34
是的,这是正确的。是的,它应该很容易,但我会建议通过标准输入/输出通信。不幸的是,这是一个安全问题,有真是无可奈何阅读'男人sudoers'。 –
正确的事情被称为特权分离:清楚地标识必须在提升的特权上完成的最小任务集。编写一个单独的守护进程和尽可能有限的沟通任务的方式。以提升的权限运行该守护程序作为另一个用户。多一点工作,但也更安全。编辑:使用setuid能够包装也将满足特权分离的概念,虽然我建议有Web服务器chrooted和挂载chrooted文件系统nosuid(这将打败)。
为什么你不执行它使用'subprocess'和'sudo'外部进程,即使这个一切闻起来臭。 – Anders
因为这将需要给WWW许可跑这里来Python作为根:( – kwl34
的主要问题是,当他们将一个二进制setuid和共同须藤操作并不适用于个人的Python脚本,而是Python解释器本身。 – kwl34