我正在寻找这样一个概念来产生一个过程 :
这个概念被称为沙箱或监狱。
每个主要操作系统(Windows,MacOSX和Linux)都需要这样做,问题是概念性的(比如在做什么, 使用哪些API以及观察什么 ),而不是语言特定的。
我真的想接受一个答案,并给你20分。 我不能接受我自己的答案,反正我也没有答案。 所以,如果你真的希望你的答案被接受,请注意:
Mac OS X有一个代号为Seatbelt的沙箱设施。 公共API在沙盒(7),sandbox_init(3)和相关的手册页中进行了介绍。 公共API是有限的,但设施本身是非常强大的。 虽然公共API只允许您从某些预定义的沙箱中进行选择(例如“禁止所有基于套接字的网络连接”),但您也可以使用功能更强大的底层实现,以便您可以准确指定哪些操作系统资源可用类似计划的语言。 例如,以下是用于portmap的沙箱摘录:
(allow process-exec (regex #"^/usr/sbin/portmap$")) (allow file-read-data file-read-metadata (regex #"^/etc" #"^/usr/lib/.*\.dylib$" #"^/var" #"^/private/var/db/dyld/" #"^/dev/urandom$")) (allow file-write-data (regex #"^/dev/dtracehelper$"))
您可以在/ usr / share / sandbox中看到系统使用的许多沙箱。 使用sandbox-exec(1)命令可以很容易地尝试使用沙盒。
对于Windows,您可能需要查看David LeBlanc在Black Hat USA 2007上的“Practical Sandboxing”演讲 。 Windows本身没有内置的沙盒技术,因此所描述的技术利用了Windows 2000中引入的称为SAFER的不完整机制。 通过使用受限令牌,可以创建对操作系统资源的访问权限有限的进程。
对于Linux,您可以调查复杂的SELinux机制: SELinux home , 一个HOWTO 。 例如,Red Hat使用它来加强某些产品中的一些系统服务。
对于Windows,Google Chrome中有一个沙箱。 你可能想要调查它。 它使用自由的BSD类许可证。
对于Linux来说,会有很好的旧chroot或更复杂的http://plash.beasts.org/wiki/ 。
因为Leopard有一些类似SELinux的保护。
该网站codepad.prg有一个很好的“关于”页面,他们如何安全地允许任何代码片段的执行..
代码执行由基于geordi的主管处理。 策略是在ptrace下运行一切,许多系统调用不允许或忽略。 编译器和最终的可执行文件都在一个chroot监狱里执行,并且有严格的资源限制。 主管是用Haskell编写的。
当您的应用程序是远程执行代码时,您必须预料到安全问题。 我不是只依赖chroot和ptrace主管,而是采取了一些额外的预防措施:
主管进程在虚拟机上运行,这些虚拟机受到防火墙限制,从而无法建立传出连接。
运行虚拟机的机器也是防火墙,并定期从源图像中恢复。
如果你真的想要一种可以在所有这些平台上工作的技术,而不是为每个平台单独的解决方案,那么我认为你唯一的答案就是为每个测试环境设置一个虚拟机。 您可以随时恢复到快照。
使用虚拟化的另一大优势是,您可以将所有测试环境与其客户操作系统全部放在同一个盒子中。
FreeBSD具有特定的jail概念,Solaris有容器 。 根据你在找什么,这可能会有所帮助。
chroot监狱可以帮助限制应用程序可以做什么(尽管任何具有root特权的应用程序都可以逃脱监禁),并且它们在大多数UNIX上都可用,包括OS X.
至于Windows,我不确定。 如果有一个简单的方法来沙盒的Windows应用程序,现在,我相信大部分将更安全。
对于Linux,有AppArmor 。 不幸的是,这个项目有些中断。
另一种沙箱选择是使用虚拟化的Vserver 。
在Windows(2000和更高版本)上,您可以使用Job对象来限制进程。
我不是这方面的专家,但我认为linux的标准答案是定义一个SeLinux策略,具有正确的过程能力。
一般来说,任何虚拟专用服务器都将执
Linux Vserver http://linux-vserver.org/Welcome_to_Linux-Vserver.org
Parallels Virtuozzo Containers http://www.parallels.com/products/pvc/
正如所提到的,FreeBSD和Solaris有自己的实现。
哦。 其实我注意到你要求它在任何操作系统上工作。 那么,这可能会有点复杂,因为我认为更少的努力只是重用一些虚拟机,可以支持一定程度的沙盒,如: