2012-11-06 32 views
2

我在Linux中使用apparmor,setrlimit,cap_set_rpoc创建沙箱环境,让匿名用户在科学应用程序的上下文中基本上执行我的服务器上的一些任意代码。沙盒中特别允许的一件事是通过分叉和调用可执行文件来启动新进程(尽管一个用户的进程总数受限于RLIMIT_NPROC)。安全杀死一个进程和所有后代的方法

经过一段时间后,比如说1分钟,系统将杀死主进程以及所有潜在的子进程。我目前依靠进程组ID来识别孩子。但是,从理论上讲,子进程可能会调用setpgid来更改其进程组,以便在主进程标识(正确?)上调用kill(-1 * pid)时不会再受到影响。不幸的是,没有可以设置的linux capability来阻止进程调用setpgid

什么是杀死一个进程及其所有(递归)子进程的强大方法,这会让孩子们难以“逃避”大屠杀并继续孤儿进程?

回答

1

如果使用lxc(Linux容器)隔离每个进程树,则可以使用lxc-stop来终止容器中的所有进程。请参阅lxc manual page的“启动/停止容器”部分。

+0

LXC需要某种container-vm的权利?对于实时服务,这可能有点慢并且麻烦。我希望它能够在没有太多开销的情况下每秒扩展到很多工作。我想这将不可能创建一个容器,并且在单个lxc容器内同时运行多个作业? – Jeroen

+0

LXC重量轻。与更为知名的虚拟化工具不同,使用LXC时,只有一个内核实例在运行,并且没有虚拟机。它只是做一些额外的簿记来隔离用户空间容器。我假设它的花费与fork()相同。 –

+0

太好了。这[主题](http://stackoverflow.com/questions/13484937/lxc-without-chroot)进一步说明了这一点。 – Jeroen