最简单的安全沙箱(需要有限的资源)


15

我正在执行一个实现分布式模拟的项目:在多个节点上执行任意代码,然后收集并汇总结果。

每个节点都是Ubuntu Linux虚拟机的一个实例,并运行一个主进程,该进程负责将要执行的代码转发给多个工作进程(每个内核1个)。

这个问题是关于如何确保每个工作程序在沙盒环境中运行,而又不对每个工作程序使用虚拟机实例。对工人的确切要求是:

  • fs:没有写权限,只读权限仅限于一个目录(和子文件夹)
  • net:仅允许本地通信(IPC,TCP等)
  • mem:限制内存使用量(无交换内存),如果超过mem限制则终止
  • cpu:仅允许1个内核,如果超过时间限制则终止

不应施加其他限制:工作者应该能够加载动态库(从只读文件夹),生成新线程或进程,调用系统函数,ecc ecc,但限制必须由生成/加载的实体继承,并且应该以总和的方式应用(例如,我们不能让一个工作器产生两个各自使用800MB的线程,则该工作器的内存限制为1GB)。

毋庸置疑,工人没有权利提高自己的权利。

我花了相当多的时间来审查可用的替代方案(SELinux,AppArmor,cgroups,ulimit,Linux名称空间,LXC,Docker等),以找到满足我的要求的最简单的解决方案,但是我在该领域的经验有限。

当前的理解:在我的用例中,LXC和Docker有点沉重,并不完全安全1。由于易于配置,AppArmor优于SELinux,可将其用于fs和网络限制;cgroups比ulimit(在单个进程上运行)更可取,将其用于mem和cpu限制。

这是实现我的目标的最简单方法吗?我可以单独使用AppArmor还是cgroup?我的模型中是否存在明显的安全漏洞?指导方针应该是“允许工人放下自己,但别无其他”


2
如果您的目标是限制资源,那么您可以比Ubuntu来宾(或任何真正的Debian派生产品)做得更好。在任何情况下,你可能想用户模式Linux和/或(与最新的内核)用户命名空间
mikeserv

2
LXC听起来完全符合您的需求。您为什么认为它过于沉重和不安全?(当然,它有bug,但是您可能会用到的东西也都有。)
Gilles'

链接的演示文稿(从2011年开始允许)和Ubuntu LXC文档的“安全性”部分谈论“命名空间泄漏”不是很令人放心。似乎主要基于名称空间和cgroups的LXC可能是目前最好的选择。我还发现Linux-Sandboxing有趣的阅​​读
StephQ 2014年

它可能需要一些重新设计,但是您是否考虑过在BSD监狱上运行?
莱德(Ryder)

尽管LXC就像一堆VM一样“繁重”,但制作它们确实很简单。其中一些解决方案虽然“较轻”,可能需要大量配置。使用LXC,您可能不需要配置诸如编写之类的东西,因为一个应用程序将拥有整个容器。
MikeP

Answers:


1

是的,您可以单独使用cgroups和SELinux / AppArmor来监视和控制将要执行的任意代码。

使用cgroup,可以执行以下操作:

  1. 通过cpuset子系统将CPU内核使用限制为1个CPU
  2. 通过memory子系统设置内存使用限制,甚至跟踪派生。有关示例,请参见https://github.com/gsauthof/cgmemtime
  3. 防止网络访问任何不是在lonet_prio子系统。

借助SELinux / AppArmor,您可以限制进程的读/写访问权限。

注意:我不熟悉AppArmor,但这是一个强制性的访问控制(MAC)系统,这意味着保护写和读是工作。

使用这些系统只需编写适当的配置即可。当然,这一切说起来容易做起来难。因此,这里有一些参考链接可帮助您入门:

祝好运!


1

仅当我使用Ubuntu时,我才会放弃SELinux for AppArmor。(真的很困难)

LXC本身并不安全如果需要安全性,则必须通过libvirt(基于SELinux MLS)使用它们。

您的问题是无限的,因此不要无限制地尝试任何可行的解决方案,请记住,即使是kernel.org也受到了追捧,最近FBI宣布有人使用他们的系统已有多年,直到现在仍未被发现。

我将使用LXC / libvirt以获得相当不错的安全性,或者尝试使用“新的” intel透明容器,该容器为您的容器使用了非常轻便的VM,并清晰地使用了DAX / KSM(我没有对其进行测试,但是它们看起来非常确实很有希望)。

如果您担心内核利用,则grsecurity是您的解决方案,但您必须将其与容器解决方案集成(肯定会产生头痛)。

所以可以肯定,这不是一件容易的事,LXC / libvirt确实很整洁,但是也许要使用透明的容器。

码头工人?当没有无业游民的盒子可用时,我没有/不会将docker用于本地测试,他们需要更多的工作和更好的社区。

当然,系统容器也是不错的选择,但我想您不喜欢/想要它们,因为您甚至没有提到它们,而且它们也不是供应商不可知的解决方案。

如果您想要一些“更轻松”的东西和更业余的东西,可以查看firejail,我已经在一些桌面“应用程序”中使用过它,并且可以完成工作(为您的自定义应用程序创建模板非常容易,请使用“私有”安装在您的目录顶部并限制网络仅在本地使用,生成的进程将为父级继承并继续...)。

欢呼,开心,不生气。;)


0

seccomp-bpf是另一个选项,适用于OpenSSH,vsftpd和Chromium,它仅具有exit(),sigreturn(),read(),它也使用write(),尽管它允许使用可配置的Berkeley数据包过滤器规则过滤系统调用。它也可以与cgroups一起用于内存,cpu等。

https://wiki.mozilla.org/Security/Sandbox/Seccomp


0

您可能需要研究网格计算系统。特别是,BOINC(http://boinc.berkeley.edu)检查几乎所有盒子。

我相信它会像这样对您的参数进行操作:

fs:可以读/写到自己的目录,在其他任何地方

net:可以配置为仅允许网络访问BOINC服务器,但默认情况下不是IIRC

内存:是的,分别为空闲和非空闲计算机分配内存限制

cpu:是的,甚至可以说“如果计算机不空闲则不要运行”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.