我怎样才能沙箱文件系统的活动,尤其是写?

Gentoo在portage中有一个function ,可以防止和logging在构build和打包目录之外的写入。

Checkinstall能够监视写入,并在完成后打包所有生成的文件。

自动工具具有DESTDIRmacros,使您可以将大部分文件系统活动引导到其他位置。

  • 我怎样才能在Gentoo沙盒方法的安全性上做到这一点?
  • 我可以使用SELinux,rlimit或其他资源限制API吗?
  • C,Python可以使用哪些API?

Update0

  • 使用的机制将不需要root权限或任何涉及/持续的系统修改。 这排除了创build用户和使用chroot()
  • 请链接到您提到的API的文档,由于某些原因,他们特别难以find。

UPDATE1

  • 这是为了防止事故 。 我不担心恶意代码,只是写的很差。

Debian处理这种问题的方式是不要以root身份运行安装代码。 软件包构建脚本以普通用户身份运行,安装脚本使用fakeroot运行 – 该LD_PRELOAD库重定向权限检查调用,使其看起来像安装程序实际上以root身份运行,因此生成的文件所有权和权限是正确的,如果从fakeroot环境中运行/usr/bin/install ,则环境内的其他stat将显示正确的所有权),但实际上安装程序是以普通用户身份运行的。

在某些情况下(主要是为了开发),构建也使用例如pbuilder在chroots中完成 – 然而,这对二进制发行版来说可能更容易,因为每个使用pbuilder的构建都会重新安装超出基本系统的所有依赖关系,指定了依赖关系(这是使用chroot的主要原因;不是为了防止意外安装)

一种方法是虚拟化一个流程,就像wine一样,重新解释文件路径。 虽然这实施起来相当繁重。

更优雅的方法是使用chroot()系统调用,它将文件系统的子树设置为进程的根目录。 创建一个虚拟子树,包括/ bin,/ tmp,/ usr,/ etc,以便进程查看它们,用虚拟树调用chroot,然后执行目标可执行文件。 我不记得是否可以在树形参考文件中有符号链接,但我不这么认为。 但是,当然,所有需要的东西都可以复制到沙箱中,然后在完成时检查对原始文件的更改。

也许用普通的用户权限来获得沙盒的安全性? 所以运行show的过程有特定的目录访问权限。

chroot将是一个选项,但我不知道如何跟踪这些尝试写在根外。

另一个想法是沿着拦截系统调用的路线。 我不太了解这个,但strace是一个开始,尝试运行一个程序,并检查你是否看到你喜欢的东西。

编辑:

使用内核模块的一个选项? 因为你可以用你自己的方式替换写系统调用,所以你可以防止任何你需要的,并记录下来。

这听起来有点像你所描述的是容器 。 一旦建立了容器基础设施,创建容器便宜很多,而且相当安全。

有两种方法可以做到这一点。 一种是使用LD_PRELOAD来挂钩导致系统调用的库调用,比如libc中的调用,然后调用dlsym / dlopen 。 这不会让你直接挂钩系统调用。

第二种允许挂接系统调用的方法是在ptrace下运行你的可执行文件,它提供了在发生系统调用时停止和检查系统调用的选项。 这可以以编程方式设置为沙箱对文件系统的受限区域的调用等等。

  • LD_PRELOAD不能拦截系统调用,但只有libcalls?
  • 动态链接器技巧:使用LD_PRELOAD作弊,注入功能和调查程序
  • 在70行代码中写一个Strace