系列文章目录
文章目录
前言
bubblewrap 是一个构建沙箱环境的工具。bubblewrap 不是一个完整的、具有特定安全策略的现成沙箱。
一、bubblewrap 是什么?
bubblewrap 的一些用例需要沙箱和真实系统之间的安全边界;其他用例希望能够更改沙箱内进程的文件系统布局,但不旨在成为安全边界。因此,沙盒进程和主机系统之间的保护级别完全由传递给 bubblewrap 的参数决定。
无论哪个程序为 bubblewrap 构造命令行参数(通常是较大的框架,如 Flatpak、libgnome-desktop、sandwine 或临时脚本),都负责定义自己的安全模型,并选择适当的 bubblewrap 命令行参数来实现该模型安全模型。
bubblewrap 的目标是在沙箱中运行应用程序,在沙箱中它限制对部分操作系统或用户数据(例如主目录)的访问。
bubblewrap 始终创建一个新的挂载命名空间,并且用户可以准确指定文件系统的哪些部分应在沙箱中可见。默认情况下,您指定的任何此类目录都会安装nodev,并且可以设置为只读。
和 bwrap 类似的工具还有 SELinux 和 AppArmor。它们是作用于整个系统的,Firejail 是面向应用程序的,但是配置起来也挺不容易。bwrap 更偏重于提供底层功能而不是完整的解决方案,具体用法可以让用户自由发挥。
此外,您还可以使用这些内核功能:
- **用户命名空间 ( CLONE_NEWUSER )**:这会隐藏沙箱中除当前 uid 和 gid 之外的所有内容。您还可以更改沙箱中 uid/gid 的值。
- **IPC 命名空间 ( CLONE_NEWIPC )**:沙箱将获得所有不同形式的 IPC 的自己的副本,例如 SysV 共享内存和信号量。
- **PID 命名空间 ( CLONE_NEWPID )**:沙箱不会看到沙箱之外的任何进程。此外,bubblewrap 将在容器内运行一个简单的 pid1 来处理在沙箱中收获子项的要求。这避免了现在所谓的Docker pid 1 问题。
- **网络命名空间 ( CLONE_NEWNET )**:沙箱将看不到网络。相反,它将拥有自己的网络命名空间,并且只有一个环回设备。
- **UTS 命名空间 ( CLONE_NEWUTS )**:沙箱将有自己的主机名。
- Seccomp 过滤器:您可以传入 seccomp 过滤器来限制可以在沙箱中执行哪些系统调用。有关详细信息,请参阅Seccomp。
如果您不使用 seccomp 过滤器过滤掉命令
TIOCSTI
,–new-session 则需要参数来防止沙箱外命令执行(请参阅CVE-2017-5226)。
二、使用步骤
2.1 安装
bubblewrap 在大多数 Linux 发行版的软件包存储库中都可用,并且可以从那里安装。
如果您需要从源代码构建 bubblewrap,您可以使用 meson 或 autogen 来完成此操作。
meson:
meson _builddir
meson compile -C _builddir
meson test-C _builddir
meson install-C _builddir
autogen:
./autogen.sh
makesudomakeinstall
2.2 bwrap 使用
bubblewrap 的工作原理是创建一个新的、完全空的挂载命名空间,其中根位于主机上不可见的 tmpfs 上,并且当最后一个进程退出时将自动清理。然后,您可以使用命令行选项构建根文件系统和进程环境以及在命名空间中运行的命令。
源代码中有一个更大的演示脚本,但这里有一个精简版本,它运行一个重用主机的
/usr
。
bwrap \
--ro-bind /usr /usr \--symlink usr/lib64 /lib64 \--proc /proc \--dev /dev \
--unshare-pid \
--new-session \bash
这是一个不完整的示例,但对于说明目的很有用。更常见的是,您不想使用主机的文件系统树创建容器,而是希望以 chroot 为目标。在那里,您可能已经在目标 rootfs 中创建了符号链接,而不是lib64 -> usr/lib64在 tmpfs 中创建符号链接。
总结
本文介绍了 bwrap 命令的基本概念和使用场景。
版权归原作者 yusq77 所有, 如有侵权,请联系我们删除。