我正在做一个实现分布式模拟的项目:在多个节点上执行任意代码,然后收集和聚合结果。
每个节点都是 Ubuntu Linux 虚拟机的一个实例,并运行一个主进程,负责将要执行的代码转发到多个工作进程(每个内核 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 吗?我的模型中是否存在明显的安全漏洞?指导方针应该是“允许工人自己倒下,但不能做其他事情”。