【问题标题】:Restrict python script access to os functions限制python脚本访问os函数
【发布时间】:2016-12-14 19:56:24
【问题描述】:

我需要你的新想法,感谢任何帮助。

我正在实现一个系统,用户可以上传他自己的 Python 脚本并在其中一个服务器中执行它们。

我确实提防安全问题。我想限制从此脚本对操作系统的任何访问。

首先使用ast 解析器验证脚本,以禁止访问许多最明显的关键字,例如execimportopen 等。

不过,用户可以声明使用某些库。其中一个重要的是pandas 库(我还必须提供matplotlibnumpy 等)。我已经实现了“代理”对象,模仿模块,但提供对有限属性集的访问。例如我可以提供一个代理对象json,但不允许访问loadsdumps函数。

也不允许通过名称ossys 等从任何对象获取属性的最明显尝试。这样,当用户尝试使用 json.os 或类似的方式访问 os 模块时,我试图关闭一个漏洞。

这可以工作,但它是一个简单的盾牌。我可以查看所有模块并禁止访问大多数危险功能,但即使错过一个也可能导致潜在的损坏。此外,某些模块可能会以一种棘手的方式访问,例如 pandas.tools.util.pd 将引用原始的 pandas 模块。我会用一年的时间来关闭一切。

我曾考虑在文件系统级别限制访问,但脚本在主进程(基于celery)中使用eval 函数运行,并且与主进程具有相同的权限(和相同的用户)。理论上它可以读取所有源并将它们传递给用户。

我的一个想法是使用最少的源和权限集在单独的进程中运行脚本,并通过管道将数据传入/传出它。但这需要重构大量代码,并且无法保证稳定性 - 我仍然需要大量代码才能使其正常工作。

【问题讨论】:

  • 您是如何设法从代码中获取输出的?
  • 还有你是如何限制内存和cpu使用的?
  • @john-balvin-arias 没办法,我没有。这是通过脚本获得 OOM 和高 CPU 使用率的可能性。整个想法是错误的。如果我现在做这个项目 - 我会开始使用容器。
  • 至于输出 - 这很简单 - 你要么允许使用预定义的记录器对象,要么简单地将 sys.stdout 重定向到可管理的东西。
  • "我会开始使用容器。" cpu使用不会有同样的麻烦吗?因为当将代码部署到容器时,它无法调节每个单独部署应该使用多少内存和 CPU,我需要为每个代码创建特定的节点,这不是无用的吗?,你也会吗?使用 RestrictedPython 吗?我需要使用 panda、numpy 等

标签: python security permissions exec eval


【解决方案1】:

RestrictedPython 是您所需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多