【发布时间】:2016-12-14 19:56:24
【问题描述】:
我需要你的新想法,感谢任何帮助。
我正在实现一个系统,用户可以上传他自己的 Python 脚本并在其中一个服务器中执行它们。
我确实提防安全问题。我想限制从此脚本对操作系统的任何访问。
首先使用ast 解析器验证脚本,以禁止访问许多最明显的关键字,例如exec、import、open 等。
不过,用户可以声明使用某些库。其中一个重要的是pandas 库(我还必须提供matplotlib、numpy 等)。我已经实现了“代理”对象,模仿模块,但提供对有限属性集的访问。例如我可以提供一个代理对象json,但不允许访问loads或dumps函数。
也不允许通过名称os、sys 等从任何对象获取属性的最明显尝试。这样,当用户尝试使用 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