从服务器上的用户运行不受信任的可执行文件的最佳方法

时间:2019-06-06 22:01:58

标签: linux docker go filesystems

我正在尝试创建一个服务器,该服务器编译并运行用户提交的代码。如何在服务器端运行可执行文件输出(从代码编译,不可靠),而又不影响我的代码库(二进制可执行文件本身)?

泊坞窗在某种程度上会有用吗?如果是,怎么办?

仅供参考,我正在使用微服务架构。然后转到该服务的服务器端开发(代码运行器)。

2 个答案:

答案 0 :(得分:1)

运行不可靠代码的最好方法是隔离它,当对恶意软件进行逆向工程时,我们会做很多事情。由于使用的是Docker,因此需要采取一些预防措施,而使用虚拟机则不需要这些预防措施。

最安全的方法是使用另一个Docker容器,仅用于编译,执行和执行所需的任何其他操作。

让我们以一个应用程序为例,该应用程序由用户发送代码,然后我们将其与期望的输出进行比较,如Codeforces这样的编程竞赛。

  1. 主应用程序接收到代码
  2. 主应用程序创建一个特殊的Docker容器
  3. 主应用程序将代码发送到特殊容器,其中包含代表预期输出的文件
  4. 特殊容器编译,执行并将代码输出打印到文件中,并使用diff output expected_output
  5. 特殊容器将diff结果(基本上是true或false)发送到主应用程序

这样,与用户发送的代码相关的所有内容都被隔离了,因此更加安全。

一些注意事项:

  • 为了安全起见,运行用户代码的容器应使用低特权用户运行它
  • 如果您需要从代码中获取输出,而不仅仅是从差异中获取真假,则需要确保他的代码不会生成恶意软件作为输出,而是将其保存在文件中并放在主应用服务器
  • 通过用户代码阻止线程库,网络连接,文件系统访问等,有助于使其更安全

答案 1 :(得分:1)

  

[什么是从服务器上的用户运行不受信任的可执行文件的最佳方法?

一点也不。

沙盒格斗困难。尝试使用完全满足您需求的游乐场。

或者:根据您的需要重新启用游乐场。 https://blog.golang.org/playground可能会帮助您入门。

请记住,禁止使用危险的软件包,例如不安全的,运行时,os / exec以及来自网络的所有内容。