为了实现隔离,使用传统的 Linux 容器虚拟化技术,基于 cgroup、命名空间、Seccomp 和 SELinux。 为了执行特权操作来配置容器,Bubblewrap 以 root 权限启动(带有 suid 标志的可执行文件),然后在容器初始化后重置特权。
操作不需要在命名空间系统中激活用户命名空间,这允许您在容器中使用自己的单独的标识符集,因为它在许多发行版中默认不起作用(Bubblewrap 被定位为一个有限的 suid 实现)用户命名空间功能的子集 - 从环境中排除所有用户和进程标识符(当前标识符除外,使用 CLONE_NEWUSER 和 CLONE_NEWPID 模式)。 为了提供额外的保护,在控制下可执行
Bubblewrap 程序以 PR_SET_NO_NEW_PRIVS 模式启动,该模式禁止获取新权限,例如,如果存在 setuid 标志。
文件系统级别的隔离是通过默认创建一个新的挂载命名空间来实现的,其中使用 tmpfs 创建一个空的根分区。 如有必要,外部 FS 分区会以“mount —bind”模式附加到此分区(例如,当使用“bwrap —ro-bind /usr /usr”选项启动时,/usr 分区将从主系统转发)处于只读模式)。 网络功能仅限于通过 CLONE_NEWNET 和 CLONE_NEWUTS 标志访问具有网络堆栈隔离的环回接口。
与类似项目的主要区别
新版本的值得注意之处在于实现了对加入现有用户命名空间和进程 pid 命名空间的支持。 为了控制命名空间的连接,添加了“--userns”、“--userns2”和“-pidns”标志。
该功能在setuid模式下不起作用,需要使用单独的模式,无需获取root权限即可工作,但需要激活
系统上的用户命名空间(在 Debian 和 RHEL/CentOS 上默认禁用)并且不排除这种可能性
来源: opennet.ru