如何为Linux进程禁用套接字创建,用于沙盒?

pts*_*pts 9 sockets linux sandbox

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

一般来说,我对许多沙盒方法感兴趣(即Linux内核提供的方法和强制执行的方法ptrace()),但在这个问题中,我只对沙盒方法的套接字创建方面感兴趣(所以如果你建议使用沙盒)方法,请解释如何防止使用它创建套接字),我对需要内核修补或涉及加载内核模块的方法不感兴趣,内核模块不是Ubuntu Lucid默认二进制内核包的一部分,或者会影响系统上的每个进程.

eph*_*ent 8

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

util-linux [-ng]有一个命令unshare,它使用内核的clone/ unshareinterfaces.如果通过unshare -n(或clone(CLONE_NEWNET))运行新进程,则它创建的任何网络套接字都位于不同的名称空间中.这并不能解决内核资源问题,但它会对进程进行沙盒处理.

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

您可以定义不允许socket/ bind/ etc 的SELinux域.调用,并执行到该类型的动态转换.这(显然)要求系统具有主动执行SELinux策略.(AppArmor和TOMOYO可能有类似的东西,但我对它们中的任何一个都不太熟悉.)