2016-04-30 62 views
2

我正在开发一个平台,用户可以在其中创建自己的“小部件”,小部件基本上是js片段(将来也会有html和css) 。沙盒由在服务器上运行的用户编写的node.js脚本

问题是,即使用户不在网站上,他们也必须运行,所以基本上我的服务将不得不安排那些用户脚本随时运行。

我想弄清楚哪个是“沙箱”脚本的最佳方式,我首先想到的是在Docker内部自己的进程上运行的想法之一,所以让我们说用户管理以某种方式进入外壳它将是一个虚拟机,并希望他会被锁定在里面。

我不是一个Docker专家,所以我甚至不确定这是否合理,反正会产生另一个问题,即纺织数百个码头运行一个简单的JavaScript代码段。

是否有任何“安全”的方式来做到这一点?也许在空范围上运行脚本,并以某种方式删除对“require”方法的访问?

另一个要求是在脚本超时后终止它。

编辑: - 发现他们在其中的脚本,并运行它创建的脚本在运行容器的图像此相关stackexchange link

回答

1

这可以通过码头工人来完成,您将创建一个码头工人的形象。

你甚至可以很容易地创建一个基于官方node.js docker镜像的通用镜像,并在运行时传递用户自定义文件,运行它们,保存输出,然后完成。这种方法很好,因为只有一个图像需要维护,而且它使设置变得简单。

传入数据的最佳方式是在容器上创建卷装入,并且每次将用户目录装入容器中的相同位置。

例如,假设您的主机具有这样的目录结构。

/users/ 
    aaron/ 
    bob/ 
    chris/ 

然后,当您运行容器时,您只需更改卷装入。

docker run -v /users/aaron:/user/ myimagename/myimage 
docker run -v /users/bob:/user/ myimagename/myimage 

我不知道输出会是什么,但你可以把它写在容器内/用户/输出和输出将被存储在用户的输出目录。

就超时而言,您可以编写一个简单的脚本来查看docker ps,如果它运行的时间超过极限,docker会停止容器。

因为一切都在一个容器中运行,所以可以一次运行多个并且它们彼此隔离并与主机隔离。

+0

你会提出任何我应该真正关注的设置吗? 例如,假设用户从node.js获取shell,我怎么能确定他不会“摆脱docker”和“拥有”我的主机? – kroe

+0

没有已知的安全漏洞,用户可以用最新的内核和最新的docker版本打破容器。只要你保持码头和你的内核更新,任何已知的漏洞都可以迅速修复,因为这对很多人来说都是一个大问题。 –

+0

用户只需上传一个javascript并运行在一个节点进程上。 所以我想我可以以某种方式删除对“系统方法”的访问权限,所以他希望不会碰到文件系统或缓冲区溢出的东西? – kroe

相关问题