4
最简单的安全沙箱(需要有限的资源)
我正在执行一个实现分布式模拟的项目:在多个节点上执行任意代码,然后收集并汇总结果。 每个节点都是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?我的模型中是否存在明显的安全漏洞?指导方针应该是“允许工人放下自己,但别无其他”。