以root身份执行Python脚本(seteuid vs c-wrapper)

时间:2011-10-03 18:33:23

标签: python c django freebsd

我在python脚本中有一个快速的一次性任务,我想从Django(www用户)调用,这需要root权限。

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

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

这是正确的做法还是我应该看别的东西?

3 个答案:

答案 0 :(得分:14)

sudo在Python上不需要setuid位。您只能为一个命令启用sudo,不启用任何参数:

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

如果您的脚本不接受任何参数,不能被www用户覆盖,并且sudo执行“env_reset”(大多数发行版中的默认设置),这将是安全的。

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

答案 1 :(得分:3)

正确的事情称为权限分离:清楚地标识必须在提升的权限上完成的最小任务集。编写一个单独的守护进程和尽可能有限的方式来传达要执行的任务。以具有提升权限的另一个用户身份运行此守护程序。更多的工作,但也更安全。

编辑:使用setuid-able包装器也将满足权限分离的概念,虽然我建议让网络服务器chrooted并安装chrooted文件系统nosuid(这将失败)。

答案 2 :(得分:1)

sudo允许您限制传递给程序的参数。来自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可以修改脚本本身和任何父目录,并且脚本是安全的,并且只需要以root身份运行的绝对最小值。