【问题标题】:Execute Python Script as Root (seteuid vs c-wrapper)以 root 身份执行 Python 脚本(seteuid vs c-wrapper)
【发布时间】:2011-10-03 18:33:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么不直接使用subprocesssudo 作为外部进程执行它,尽管这一切都闻起来很烂。
  • 因为这需要授予 www 权限才能以 root 身份运行 Python :(
  • 这里的主要问题是 setuid 和常见的 sudo 操作不适用于单个 python 脚本,因为它们适用于二进制文件,而是适用于 Python 解释器本身。

标签: python c django freebsd


【解决方案1】:

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

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

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

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

【讨论】:

  • 有趣!那我马上就测试一下。但是,我的脚本确实需要参数,尽管是简单的参数。只要我的 python 脚本对这些参数进行严格匹配,你认为我会好吗?
  • 是的。只要你小心,你就可以接受它们。
  • ALL=(root) 可能更适合将脚本运行限制为仅 root 用户,而不是任何其他用户。最好仅限于你需要的东西。
  • @theamk env_reset 是否足以防止用户加载自己的站点包,从而欺骗reload-stuff 运行恶意代码?我特别担心 virtualenv 或 PEP-370
  • env_reset 会将 HOME 设置为目标用户的家(例如 /root)并清除所有其他环境 - 所以是的,virtualenvs 将被忽略,用户站点将从 root 的家中使用,这将是安全的
【解决方案2】:

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

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

【讨论】:

  • 这就是我建议使用 C 包装二进制文件的方法。它为用户需要通过 seteuid() 以提升的权限访问的特定功能提供了一个有限的接口。
  • 是的,你是对的,那就行了。我没有考虑过,因为我建议对 web 服务器进行 chroot,并将其挂载到 web 服务器可访问的文件系统 nosuid。
  • 我想推荐 sudo 而不是 C 包装器。很容易忘记清除 PYTHONSTARTUP 或其他一些 env 变量——但是带有 env_reset 的 sudo 会为您完成。
【解决方案3】:

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 身份运行的绝对最小值。

【讨论】:

  • 我可能错了,但这仍然需要给 www 用户 sudo root 访问 Python 解释器本身的权限,并且您实际上是在使用 sudo 的参数解析器来只允许运行您的脚本。它是否正确?如果是这样,是否也容易考虑传递给脚本的参数(键/值)?
  • 是的,没错。是的,这应该很容易,但我建议通过标准输入/标准输出进行通信。不幸的是,这是一个安全问题,除了阅读man sudoers,别无选择。
猜你喜欢
  • 2022-01-17
  • 2014-04-29
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2010-10-08
相关资源
最近更新 更多