我正在考虑将Linux进程沙盒化的几种方法。使用clone()具有CLONE_NEWNET(等)的选择之一。CLONE_NEWNET确保沙盒进程无法建立或接受真实的网络连接。但是我想完全禁用该进程的套接字,甚至连接bind()到上的任何端口0.0.0.0,并绑定到Unix doman套接字(甚至匿名)。我想这样做是为了通过绑定到数千个端口来防止进程使用过多的内核资源。我怎么做?
clone()
CLONE_NEWNET
bind()
0.0.0.0
通常,我对许多沙箱方法(即Linux内核提供的方法和由强制执行的方法ptrace())感兴趣,但在这个问题上,我仅对沙箱方法的套接字创建方面感兴趣(因此,如果您建议使用沙箱,方法,还请说明如何防止使用该方法创建套接字),并且我对需要内核修补的方法或涉及加载不属于Ubuntu Lucid默认二进制内核程序包的内核模块的方法不感兴趣,否则会影响系统上的每个进程。
ptrace()
ptrace 似乎是最明显的工具,但除此之外……
ptrace
util-linux [-ng]有一个命令unshare,该命令使用内核的clone/ unshare接口。如果通过unshare -n(或clone(CLONE_NEWNET))运行新进程,则它创建的任何网络套接字都在不同的名称空间中。那不能解决内核资源的问题,但是可以对进程进行沙箱处理。
unshare
clone
unshare -n
clone(CLONE_NEWNET)
Linux内核还支持的Seccomp,用输入模式prctl(PR_SET_SECCOMP, 1),防止过程(当然,螺纹,真的)从调用任何系统调用以外read,write,exit,和sigreturn。这是一个非常有效的沙箱,但是很难与未修改的代码一起使用。
prctl(PR_SET_SECCOMP, 1)
read
write
exit
sigreturn
您可以定义一个SELinux的域,其不允许socket/ bind的/ etc。调用,并动态转换为该类型。(显然)这需要具有积极实施SELinux策略的系统。(AppArmor和TOMOYO可能有相似的事情,但是我对它们都不是很熟悉。)
socket
bind