chroot核心是文件系统路径隔离,非安全沙箱;需构建最小根目录、复制程序及依赖库、挂载/proc/dev/sys、降权运行并验证逃逸防护。

配置服务器 Chroot 环境来隔离不信任程序,核心目标是让程序只能访问你明确放入的文件和目录,无法读写宿主系统关键路径。它不是安全沙箱,但对限制低权限误操作、测试可疑二进制或运行老旧依赖服务仍有效。关键在“最小化准备”和“防逃逸基础设置”。
准备最小可用根目录结构
选一个专用路径,比如 /srv/chroot/untrusted,避免放在用户主目录或临时挂载点:
- 创建标准子目录:
sudo mkdir -p /srv/chroot/untrusted/{bin,lib64,usr,etc,dev,proc,sys,tmp} - 仅复制目标程序及其直接依赖——不要整套复制
/bin或/lib;例如要跑curl,先查依赖:ldd $(which curl),再只复制列出的 .so 文件到/srv/chroot/untrusted/lib64/ - 手动创建必要设备节点:
sudo mknod -m 666 /srv/chroot/untrusted/dev/null c 1 3,同理加zero、urandom、tty
挂载运行时必需的虚拟文件系统
没有这些,ps、ls /proc、甚至部分网络调用都会失败:
sudo mount -t proc proc /srv/chroot/untrusted/procsudo mount --bind /sys /srv/chroot/untrusted/sys-
sudo mount --bind /dev /srv/chroot/untrusted/dev(注意:若只做计算任务,可改用--bind /dev/null替代整个/dev) - 复制网络配置:
sudo cp /etc/resolv.conf /srv/chroot/untrusted/etc/,并确保/etc/nsswitch.conf存在且含hosts: files dns
以非 root 身份启动并限制能力
chroot 内拥有 root 权限等于白给逃逸入口。必须降权运行:
- 创建专用用户:
sudo useradd -r -s /bin/bash -d /untrusted untrusted - 在 chroot 内建好该用户的 home 和 shell 配置(如
/srv/chroot/untrusted/home/untrusted),并设属主:sudo chown -R untrusted:untrusted /srv/chroot/untrusted/home/untrusted - 用
--userspec直接切换 UID/GID:sudo chroot --userspec=untrusted:untrusted /srv/chroot/untrusted /bin/bash - 额外加固:进入后立即执行
ulimit -u 32 -n 64 -v 524288000(限制进程数、文件描述符、虚拟内存 512MB)
验证与退出规范
别信“能进 bash 就算成功”。真正可用需通过三项检查:
- 运行
id—— UID 应为 untrusted 对应数值,不是 0 - 运行
cat /proc/1/ns/pid和宿主机对比 —— 值不同说明未共享 PID 命名空间(但 chroot 本身不提供此隔离,此项仅作参考;真需隔离请上unshare --pid) - 尝试
ls /etc/shadow或cat /proc/sys/kernel/osrelease—— 应报 “No such file or directory”,而非权限拒绝 - 退出前卸载:
sudo umount /srv/chroot/untrusted/{proc,sys,dev},防止残留挂载影响后续操作
chroot 不防提权、不隔离网络、不控资源,仅裁剪文件路径视图。它适合快速隔离无网络依赖的计算型程序。若程序需联网、持久化或高可信度防护,请直接使用 podman run --cap-drop=ALL --cgroup-conf=memory.max=512M 或 systemd-run --scope --property=MemoryMax=512M 替代。

















