2011-10-03 91 views
13

我想要从Django(www用户)调用的python脚本中快速创建一个任务,这将需要root权限。以root身份执行Python脚本(seteuid vs c-wrapper)

起初我以为我会使用Python的os.seteuid()并在脚本上设置setuid位,但后来我意识到我将不得不在Python本身上设置setuid位,我认为它是大的没有。从我所知道的情况来看,如果使用sudo,也是如此,我真的很想避免这种情况。

在这一点上,我正在考虑编写一个C封装使用seteuid并以root身份调用我的python脚本,并将必要的参数传递给它。

这是正确的事情还是应该看看别的东西?

+2

为什么你不执行它使用'subprocess'和'sudo'外部进程,即使这个一切闻起来臭。 – Anders

+0

因为这将需要给WWW许可跑这里来Python作为根:( – kwl34

+1

的主要问题是,当他们将一个二进制setuid和共同须藤操作并不适用于个人的Python脚本,而是Python解释器本身。 – kwl34

回答

14

sudo不需要Python上的setuid位。您可以启用sudo的一个命令而已,没有参数:

www   ALL=(ALL)  NOPASSWD: /root/bin/reload-stuff.py "" 

这将是安全的,如果你的脚本不带任何参数,无法通过WWW用户覆盖,须藤做“env_reset”(默认的最发行版)。

您可以接受参数,但要非常小心 - 不要输出文件名,请确保您验证所有输入。在这种情况下,从sudo行末尾删除“”。

+0

有趣!那我马上要去测试一下。但是,我的脚本确实需要参数,虽然简单。只要我的Python脚本在这些参数上进行严格匹配,你认为我会好吗? – kwl34

+0

是的。只要你对他们小心,你可以采取积极的措施。 – theamk

+0

'ALL =(root)'可能是首选将脚本限制在只运行root的用户,而不是任何其他用户。最好只限于你需要的东西。 – CivFan

1

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身份运行。

+0

我可能是错的,但是这仍然需要给Python解释器本身的WWW用户sudo的根访问,和你基本上使用sudo的说法解析器只允许运行脚本。这是正确的吗?如果是的话,它很容易也占到参数传递给脚本(键/值)? – kwl34

+0

是的,这是正确的。是的,它应该很容易,但我会建议通过标准输入/输出通信。不幸的是,这是一个安全问题,有真是无可奈何阅读'男人sudoers'。 –

3

正确的事情被称为特权分离:清楚地标识必须在提升的特权上完成的最小任务集。编写一个单独的守护进程和尽可能有限的沟通任务的方式。以提升的权限运行该守护程序作为另一个用户。多一点工作,但也更安全。编辑:使用setuid能够包装也将满足特权分离的概念,虽然我建议有Web服务器chrooted和挂载chrooted文件系统nosuid(这将打败)。

+0

这是我使用的是C包装二进制提出,它提供了有限的界面给SP用户需要通过seteuid()提升特权来访问特殊功能。 – kwl34

+0

是的,你说得对,那样做。我没有考虑它,因为我建议使用chrooting Web服务器并将其安装到Web服务器可访问的文件系统nosuid。 – knitti

+0

我想推荐sudo over C包装。忘记清除PYTHONSTARTUP或其他一些env变量是很容易的,但是使用env_reset的sudo会为你做。 – theamk

相关问题