【发布时间】:2020-10-30 16:57:39
【问题描述】:
一直在做大量的研究。我只是一个学徒,但是,我有一个项目,我必须从网站上运行用户不受信任的 Python3 代码。
如果这个问题有一些移动部分,我也提前道歉。
- 我正在寻找一种尽可能安全的方法。这不需要 100% 完美,除非存在泄露极其敏感数据的巨大风险。
主要问题:
- 我的 AWS-lambda 计划是否存在泄露敏感数据的极端风险?
- 我是否应该采取任何其他简单的预防措施来使这项工作在 AWS-lambda 中更安全?
- exec() 是否有办法脱离 AWS-lambda 容器并建立任何其他网络连接(如果我连接的只是单个 AWS-lambda 容器) strong>AWS-api-gateway 用于 REST 调用?
- 我什至需要限制
__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 代码作为 微服务 发布到 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 代码(通常少于几行) 并返回异常、stdout、打印,然后运行检查结果。需要运行:
- 数学运算符、列表、循环、lambda 函数、映射、过滤器、声明方法、声明具有属性的类、打印。
- 对于成千上万的用户来说,这不需要是一个完美的项目。我只是想有一个现场网站来增加简历,也许可以在广告上赚点钱来帮助降低成本。
- 如果有严重的限制,我最终可以在 Kubernetes 中实现它(如上面的链接中所示),但希望这个解决方案能够运行良好。
- 我只是希望它能够相对较好地工作,并且不会花费太长时间来构建或花费太多钱。
- 我不想泄露任何敏感信息。
我已经计划做的安全事情:
- AWS lambda:将 超时 限制在 1-2 秒
- AWS lambda:将 内存使用量 限制为 128mb
- 我自己的代码:使用 regex 确保没有人传入 双下划线 badstuff
- 尽量减少此微服务(仅连接单个 AWS-API 网关)。
其他说明:
- 我认为我无法在 AWS Lambda 中使用 restrictedPython 或 PyPy 的沙盒 功能,因为我无法访问这些依赖项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)
如果您有任何问题或建议,请告诉我。
___编辑**添加架构图___
【问题讨论】:
-
你最终选择了那条路吗,@hippomano?
-
还没有。自从我得到一份新工作后就搁置了这个项目,但我认为 LAMBDA 功能的容器化目前还不错。需要对此进行大量试验。
标签: python amazon-web-services aws-lambda architecture aws-api-gateway