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

Ste*_*phQ 17 apparmor cgroups sandbox

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

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

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

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

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

不言而喻,工人应该没有办法提高自己的权利。

我花了大量时间审查可用的替代方案(SELinux、AppArmor、cgroups、ulimit、Linux 命名空间、LXC、Docker 等)以获得满足我的要求的最简单的解决方案,但我在该领域的经验有限。

目前的理解:LXC 和 Docker 对我的用例来说有点偏重,并不完全安全1。AppArmor 由于更容易配置而优于 SELinux,将其用于 fs 和 net 限制;cgroups 优于 ulimit(在单个进程上运行),将其用于 mem 和 cpu 限制。

这是实现我的目标的最简单方法吗?我可以只使用 AppArmor 或 cgroups 吗?我的模型中是否存在明显的安全漏洞?指导方针应该是“允许工人自己倒下,但不能做其他事情”

小智 1

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

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

  1. cpuset通过子系统将 CPU 核心使用限制为 1 个 CPU
  2. 使用子系统设置内存使用限制memory,甚至跟踪分叉。有关示例,请参阅https://github.com/gsauthof/cgmemtime 。
  3. 防止网络访问任何未lonet_prio子系统连接的内容。

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

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

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

祝你好运!