我需要一个新的想法,任何帮助都表示赞赏。
我正在实现一个系统,用户可以上传自己的Python脚本并在其中一个服务器中执行它们。
我要注意安全问题。我想限制从该脚本访问操作系统。
首先,使用ast
解析器验证脚本,以禁止访问许多最明显的关键字,例如exec
,import
,open
等。
用户可以声明使用某些库。其中一个重要的是pandas
库(我还必须提供matplotlib
,numpy
等)。我已经实施了代理'对象,模仿模块,但提供对有限的属性集的访问。例如,我可以提供代理对象json
,但不允许访问函数loads
或dumps
。
不允许通过名称os
,sys
等从任何对象获取属性的最明显尝试。这样,当用户尝试使用os
或类似地访问json.os
模块时,我会尝试关闭一个漏洞。
这可行,但它是一个简单的盾牌。我可以查看所有模块并禁止访问大多数危险功能,但即使是一个错过也可能导致潜在的损坏。此外,某些模块可能会以一种棘手的方式访问,例如pandas.tools.util.pd
将引用原始的pandas
模块。我会花一年的时间来关闭一切......
我考虑过限制文件系统级别的访问,但脚本在主进程(eval
- 基于)中运行celery
函数,并且具有与main相同的权限(和相同的用户)处理。从理论上讲,它可以读取所有来源并将其传递给用户。
我的一个想法是使用最少的源和权限集在一个单独的进程中运行脚本,并使用管道将数据传递给它/从中传递数据。但是这需要重构很多代码并且不能保证稳定性 - 我仍然需要很多代码来使它工作。