有没有非 root 用户下,能创建出一个隔离 rootfs 内的交互式 shell 的轮子

2023-10-12 19:34:20 +08:00
 guanzhangzhang

比如 test01 执行个轮子后,进入了一个隔离的 chroot 类似。

主要是 web 上点击提供一个 web shell 类似,里面的 rootfs 带了 kubectl ,目前同事用 webkubectl 项目使用,但是前不久客户让改为非 root 启动。大致看了下它的实现

  1. 特权容器内 root 用户执行 gotty 启动 start-session.sh 作为 pid 为 1 的角色
  2. 每次访问 web 就是执行 start-session.sh 的内容
    1. unshare --fork --pid --mount-proc --mount xxx.sh 启动隔离空间
    2. mkdir -p /nonexistent ,mount -t tmpfs -o size=${SESSION_STORAGE_SIZE} tmpfs /nonexistent 和一系列处理文件
    3. exec su nobody bash

然后改为非 root 启动 gotty 后,没有执行 unshare 和 mount 权限,所以来问下有没有什么轮子,非 root 用户执行,能 chroot 到一个小巧的 rootfs 内的 shell 交互(该 shell 内什么用户都行,对 chroot 之前的无影响)。目前试过 proot ,容器内 root 都无法启动

2713 次点击
所在节点    Linux
29 条回复
huahsiung
2023-10-13 11:54:03 +08:00
@guanzhangzhang proot 不要下 static 编译的版本,可以直接从 apt 源安装。static 版本不依赖 so 库,trace 注入就有毛病。

static 版本有一些 bug 。不是静态版本的 proot ,如果杀掉父进程,子进程会被一起杀掉。
huahsiung
2023-10-13 13:18:55 +08:00
没注意到这句话"容器内 root 用户执行 gotty 启动 start-session.sh 作为 pid 为 1 的角色",然后再 unshare ??

原来已经是在容器中了??

容器中是已经 chroot 的环境了,在 chroot 下,unshare 会有点问题。chroot 是这样的,可以看看 pivot_root
guanzhangzhang
2023-10-13 14:51:24 +08:00
@huahsiung d618c8435f6d:/# proot -S /nonexistent/test /bin/sh
d618c8435f6d:/# echo $?
255
执行不了。。。
guanzhangzhang
2023-10-13 14:54:32 +08:00
@codehz #20 看了下逻辑流程不行,主要是非 root 的 gotty 执行脚本创建环境,如果 entrypoint.sh 隔离 pid ,然后内部 gotty 和最终的都是同一个 pid namespace ,😘,不过我们不用一个 webkubectl 操作多个 k8s ,不隔离也行。我去折腾下 proot
codehz
2023-10-13 15:40:47 +08:00
@guanzhangzhang 哦,也不是完全不行
我就整了一个 https://github.com/codehz/nobodyexec 编译好之后,
unshare --pid --mount-proc --fork --propagation slave ./nobodyexec unshare --map-root-user bash start-session.sh
start-session.sh 现在就是 pid 1 的位置了
huahsiung
2023-10-13 15:52:06 +08:00
@guanzhangzhang 看看/nonexistent/test 是完整的 rootfs ,并且/nonexistent/test/bin/sh 的依赖存在(/nonexistent/test/etc,/nonexistent/test/usr 等等),另外你可以试试 static 版本的 bash 。

http://ftp.debian.org/debian/pool/main/b/bash/bash-static_5.2.15-2+b2_amd64.deb
62742a40
2023-10-13 15:54:01 +08:00
看看我的文章满足你的需求吗
blog.fansluck.top/non-root-container-guide.html
guanzhangzhang
2023-10-13 16:00:38 +08:00
@62742a40 不是。。。你这只适用于简单的命令和单个二进制启动
Jirajine
2023-10-13 16:20:35 +08:00
你直接起 rootless container 不就完了,不需要自己手动 unshare 。
单应用 oci 镜像就用 podman ,系统镜像自己管理 rootfs 用 lxc 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/981439

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX