如何为沙箱禁用Linux进程的套接字创建?

积分:

我正在考虑将Linux进程沙盒化的几种方法。使用clone()具有CLONE_NEWNET(等)的选择之一。CLONE_NEWNET确保沙盒进程无法建立或接受真实的网络连接。但我想完全禁用该进程的套接字,甚至连接bind()到上的任何端口0.0.0.0,并绑定到Unix doman套接字(甚至匿名)。我想这样做是为了通过绑定到数千个端口来防止进程使用过多的内核资源。我怎么做?

通常,我对许多沙箱方法(即Linux内核提供的方法和由强制执行的方法ptrace())感兴趣,但是在这个问题上,我只对沙箱方法的套接字创建方面感兴趣(因此,如果您建议使用沙箱,方法,还请说明如何防止使用该方法创建套接字),并且我对需要内核修补的方法或涉及加载不属于Ubuntu Lucid默认二进制内核软件包的内核模块的方法不感兴趣,否则会影响系统上的每个进程。

短暂的

ptrace 似乎是最明显的工具,但除此之外……

util-linux [-ng]有一个命令unshare,该命令使用内核的clone/ unshare接口。如果通过unshare -n(或clone(CLONE_NEWNET)运行新进程,则它创建的任何网络套接字都在不同的名称空间中。那不能解决内核资源问题,但是可以对过程进行沙箱处理。

Linux内核还支持的Seccomp,用输入模式prctl(PR_SET_SECCOMP, 1),防止过程(当然,螺纹,真的)从调用任何系统调用以外readwriteexit,和sigreturn这是一个非常有效的沙箱,但是很难与未修改的代码一起使用。

您可以定义一个SELinux的域,其不允许socket/ bind的/ etc。调用,并动态转换为该类型。(显然)这需要具有积极实施SELinux策略的系统。(AppArmor和TOMOYO可能有相似的事情,但是我对它们都不是很熟悉。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章