最近进行了大量研究。虽然我只是一个学徒,但我有一个项目,必须从网站上运行用户不可信的Python3代码。
如果这个问题存在一些变动的部分,我也提前道歉。
- 我正在寻找尽可能安全的方法。这不需要100%完美,除非存在泄漏极度敏感数据的风险。
主要问题:
- 我的AWS-lambda计划是否存在极高泄漏敏感数据的风险?
- 是否有其他简单的预防措施可以使这项工作在AWS-lambda中更加安全?
- 如果我仅连接了单个AWS-api-gateway以进行REST调用,exec()是否有办法突破AWS-lambda容器并进行其他网络连接?
- 我是否需要限制
__builtins__
和本地变量,或者AWS-lambda容器已足够安全?
背景
似乎大多数公司使用Kubernetes和Docker容器来执行不受信任的Python代码(例如Leetcode,Programiz或hackerRank)。
请参见以下有用的链接:
- https://www.programiz.com/blog/online-python-compiler-engineering/
- https://aws.amazon.com/blogs/compute/running-executables-in-aws-lambda/
我的计划
我考虑可以将任意的Python代码作为微服务POST到AWS Lambda函数中,使用他们的容器化/扩展性而不是构建自己的。在Lambda容器中,我只需通过简单的exec或eval函数运行代码,或许可以进行如下的一些限制:
"
safe_list = ['math','acos', 'asin', 'atan', 'print','atan2', 'ceil', 'cos', 'cosh', 'de grees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
safe_dict['abs'] = abs
exec(userCode,{"**__builtins__"**:None},safe_dict )
特别注意:
- 我不太担心出现无限循环或崩溃的情况,因为我会超时并告诉用户重新尝试。
- 我只需要运行相当简单的Python代码(通常少于几行),并返回异常、标准输出、打印结果,并对结果运行检查。需要运行以下内容:
- 数学运算符、列表、循环、lambda函数、maps、filters、声明方法、声明具有属性的类、打印。
- 这不需要成为数十万用户的完美项目。我只想要一个在线网站,用作简历加分项,也许能通过广告赚点钱来帮助支付成本。
- 如果有严重的限制,我最终可以在Kubernetes中实现它(如上链接所述),但希望此解决方案足够好用。
- 我只想让这个东西相对良好地运行,并且不要花费太长时间建造或太多金钱成本。
- 我不想泄露任何敏感信息。
我已经计划采取的安全措施:
- AWS Lambda:将超时限制在1-2秒左右
- AWS Lambda:将内存使用情况限制为128mb
- 我的代码:使用正则表达式确保没有人传递双下划线坏东西
- 尽可能使这个微服务尽可能简化(仅连接单个AWS-API-Gateway)。
其他注意事项:
- 我认为我无法在AWS Lambda中使用restrictedPython或PyPy的沙箱功能,因为我没有直接使用这些依赖关系的权限。我希望在此用例中它们不是必需的。
- 如果使用 exec() 不可能实现此目标,是否有可以从GitHub或其他地方复制粘贴到AWS-lambda文件中并调用的安全Python解释器?
- 我计划允许用户通过类似以下方式从exec中打印:
"
@contextlib.contextmanager
def stdoutIO(stdout=None):
old = sys.stdout
if stdout is None:
stdout = StringIO()
sys.stdout = stdout
yield stdout
sys.stdout = old
with stdoutIO() as s:
try:
exec(userCode)
except:
print("Something wrong with the code")
print( s.getvalue())
print(i)
如果您有任何问题或建议,请告诉我。
___ 编辑 ** 添加架构图 ___