覆盖根上的 Jail/Sandbox 进程并跟踪更改

覆盖根上的 Jail/Sandbox 进程并跟踪更改

我想要实现的目标

我想以非特权用户身份运行一个进程,但该进程更改的所有文件都应该只在影子文件夹中更改。此外,如果需要,我想禁用网络功能。

我已经尝试过的

  • 使用lowerdir/和 upperdir安装覆盖层/temp/fakeroot,,unshare -rnchroot /temp/overlay
    • 问题:需要 root 才能挂载,覆盖层忽略嵌套挂载(我的主目录)
  • unshare -rmn, 使用 lowerdir/和 upperdir安装覆盖层/temp/fakeroot
    • 问题:尝试安装时出错,因为/tmp它是以下文件夹的子文件夹/
  • fuse-overlayfs, unshare -rn,chroot
    • 问题:仅适用于 > 5.16 的内核,可以读取嵌套安装,但无法写入
    • 注意:我可以接受内核限制,但嵌套安装使其无法使用

我知道存在替代方案,但似乎前景不佳

  • Overlayroot:需要在启动时挂载,不存储更改增量
  • overlayroot-chroot: 根据以上。
  • mergefs 用于将所有文件系统合并为一个:看不出这是如何完成的
  • 使用 Docker:需要 root,不存储更改增量

有谁知道如何做到这一点?

答案1

我找到了结合多个上述命令的解决方案。

  1. mkdir -p /tmp/overlay-test/{upper,workdir,mount}
  2. unshare -- map-root-user --net --mount或短unshare -rnm
  3. mount.mergerfs / /tmp/overlay-test/view -o use_ino,posix_acl=true(选项为可选)
  4. mount -t overlay overlay -o lowerdir=/tmp/overlay-test/view,upperdir=/tmp/overlay-test/upper,workdir=/tmp/overlay-test/workdir /tmp/overlay-test/mount
  5. mount --rbind /dev /tmp/overlay-test/mount/devmount --rbind /proc /tmp/overlay-test/mount/proc
  6. chroot /tmp/overlay-test/mount /bin/bash

总体思路是unshare创建一个用户(而不是root)可以挂载文件系统的环境。之后,使用 mergefs 将所有子安装(如许多发行版中的 home)合并到一个文件夹中。该单个文件夹可以用作覆盖层的较低目录。为了执行命令,dev需要proc映射到overlay文件夹中。这没关系,因为用户无论如何都无法写入这些文件夹。最后但并非最不重要的一点是,chroot可以执行切换到overlayed-merged-rootfs。在那里所做的所有更改仅在一个目录中完成upper。完成后,不要忘记卸载所有安装以进行清理。

相关内容