使用 Exec 或 Eval 在 AWS-LAMBDA 中运行不受信任的 Python 代码

hip*_*ano 6 python architecture amazon-web-services aws-lambda aws-api-gateway

一直在做大量的研究。我只是一个学徒,但是,我有一个项目,我必须从网站运行用户不受信任的 Python3 代码。

如果这个问题有一些变化,我也提前道歉。

  • 我正在寻找一种尽可能安全的方法。这不需要 100% 完美,除非存在泄露极其敏感数据的巨大风险

主要问题

  • 我的AWS-lambda计划是否存在泄露敏感数据的极大风险
  • 我还应该采取其他简单的预防措施来使AWS-lambda中的工作更安全吗?
  • 如果我连接到的只是用于 REST 调用的单个AWS-api-gateway,那么exec()是否有办法突破AWS-lambda容器并建立任何其他网络连接?
  • 我是否需要限制__builtins__本地变量,或者 AWS-lambda 容器是否足够安全?

背景

似乎大多数公司都使用KubernetesDocker 容器来执行不受信任的 python 代码(例如LeetcodeProgramizhackerRank)。

请参阅这些有用的链接:

我的计划

我想我可以将我的任意 Python 代码作为微服务发布到 AWS Lambda 函数,使用它们的 容器化/扩展,而不是构建我自己的。在 Lambda 容器中,我可以通过简单的execeval函数来运行代码,也许有一些限制,如下所示:

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 )
Run Code Online (Sandbox Code Playgroud)

特别提示:

  • 我不太担心无限循环或崩溃,因为我只会超时并告诉用户重试。
  • 我需要做的就是运行非常简单的python 代码(通常少于几行)并返回异常、stdout、打印,并对结果运行检查。需要运行:
    • 数学运算符、列表、循环、lambda 函数、映射、过滤器、声明方法、声明具有属性的类、打印。
  • 对于数十万用户来说,这不需要是一个完美的项目。我只是想有一个在线网站来增强简历,也许还可以在广告上赚点钱来帮助降低成本。
  • 如果存在严重的限制,我最终可以在 Kubernetes 中实现它(如上面的链接所示),但希望这个解决方案能够很好地工作。
  • 我只是希望它能够相对良好地工作,并且不会花费太长时间来构建或花费太多钱。
  • 我不想泄露任何敏感信息。

我已经计划做的安全事情:

  • AWS lambda:将超时限制在1-2 秒左右
  • AWS lambda:将内存使用限制为128mb
  • 我自己的代码:使用正则表达式确保没有人传递双下划线 badstuff
  • 尽可能减少此微服务(仅连接单个 AWS-API 网关)。

其他注意事项:

  • 我认为我无法在AWS Lambda中使用restrictedPythonPyPy 的沙箱功能,因为我无权访问这些依赖项OOB。我希望这些对于这个用例来说不是必需的。
  • 如果无法使用exec()执行此操作,那么 GitHub 上或其他地方是否有安全的 python 解释器,我可以将其复制粘贴到 AWS-lambda 中的文件中并直接调用它们?
  • 我计划允许用户从 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)
Run Code Online (Sandbox Code Playgroud)

如果您有任何问题或建议,请告诉我。

___ 编辑 ** 添加架构图 ___

我认为现在的架构差不多就是这样了

the*_*man 0

有趣的帖子,我还在考虑使用现有的 AWS 基础设施来运行不受信任的 python 代码,而不是使用 docker 容器,后者可能很快就会变得昂贵。我才刚刚开始研究这个问题,但我更喜欢使用restrictedPython来添加一些安全防护措施。

我对 python dev 和 lambda 都很陌生,但你提到restrictedPython 不能开箱即用,当然你需要做的就是将它作为依赖项包含在 zip 中并将其上传到 lambda 吗?除非我错过了什么?

也不确定你是否看过这个,但我发现这个视频非常有帮助:https://www.youtube.com/watch?v =sL_syMmRkoU