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

标签 linux docker go filesystems

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

docker 在这里会有用吗?如果"is",如何?

仅供引用,我使用的是微服务架构。并进行此服务的服务器端开发(代码运行程序)。

最佳答案

运行不可靠代码的最佳方法是将其隔离,我们在对恶意软件进行逆向工程时经常这样做。由于您使用的是 Docker,因此您需要采取一些在使用虚拟机时不需要的预防措施。

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

让我们以用户发送代码的应用程序为例,我们为他运行它,并将其与预期输出进行比较,就像在 Codeforces 这样的编程竞赛中一样。 .

  1. 主应用接收代码
  2. 主应用程序创建一个特殊的 Docker 容器
  3. 主应用程序将代码和表示预期输出的文件一起发送到特殊容器
  4. 特殊容器编译、执行并将代码输出打印到文件并使用diff output expected_output
  5. 特殊容器将差异结果(基本上是真或假)发送到主应用程序

这样所有与用户发送的代码相关的东西都是隔离的,所以更安全。

一些注意事项:

  • 为了安全起见,运行用户代码的容器应该使用低权限用户运行它
  • 如果您需要从代码中获取输出,而不仅仅是从 diff 中获取 true 或 false,那么您需要确保他的代码不会生成恶意软件作为输出,您将其保存在文件中并放入主应用服务器
  • 从用户代码中屏蔽线程库、网络、文件系统访问等,有助于提高安全性

关于linux - 从服务器上的用户运行不受信任的可执行文件的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56485631/

相关文章:

database - Docker如何管理数据库?

templates - html/模板 : how to get JavaScript (JSON) escaping without <script> tag?

linux - 终端和 SSH session 之间的区别

docker - 如何在 docker 容器内禁用 mount 命令

docker - 如何使用非 root 用户权限构建 docker 以使用 pipenv 设置 python 应用程序?

go - 在 Golang 中绕过 http_proxy

Emacs:无法打开加载文件,自动完成

linux - 通过 Google Colab 进行 x11 转发

java - Linux ./configure 不会检测到 java 或 javac

linux - 如何 grep 查找文件中的特定模式