chroot仅重映射根目录实现文件系统隔离,需叠加挂载/proc/dev/sys、复制依赖库、降权运行及资源限制才可约束不信任程序。

chroot 本身不隔离进程、网络或用户权限,它只做一件事:把进程看到的 / 换成你指定的目录。所以“隔离不信任进程”不是靠 chroot 单独完成的,而是以它为起点,叠加挂载、降权、资源限制等关键动作,形成一套轻量但有效的约束链。
构建最小根目录:只放必需,不拼凑整套系统
选一个专用路径,例如 /srv/chroot/untrusted,避免用 /tmp 或用户家目录。执行:
sudo mkdir -p /srv/chroot/untrusted/{bin,lib64,usr,etc,dev,proc,sys,tmp}- 只复制目标程序及其直接依赖——比如要跑
curl,先查:ldd $(which curl),再仅复制输出中列出的.so文件到/srv/chroot/untrusted/lib64/ - 手动创建基础设备节点:
sudo mknod -m 666 /srv/chroot/untrusted/dev/null c 1 3;同理加zero、urandom、tty
挂载虚拟文件系统:没它们,shell 都算半残
chroot 环境里没有 /proc、/sys、/dev,多数命令会报错或行为异常。必须显式挂载:
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/;确认/srv/chroot/untrusted/etc/nsswitch.conf存在且含hosts: files dns
强制降权运行:root 在 jail 里等于开门揖盗
只要进程在 chroot 内是 root,就极大概率能逃逸。必须切换为非特权用户启动:
- 创建专用用户:
sudo useradd -r -s /bin/bash -d /untrusted untrusted - 在 chroot 内建好该用户的 home 目录和 shell 配置,并设属主:
sudo chown -R untrusted:untrusted /srv/chroot/untrusted/home/untrusted - 用
--userspec启动:sudo chroot --userspec=untrusted:untrusted /srv/chroot/untrusted /bin/bash - 进入后立即加固:
ulimit -u 32 -n 64 -v 524288000(限制最大进程数、文件描述符、虚拟内存 512MB)
验证是否真正受限:别信“能进 bash”就万事大吉
三项基础检查缺一不可:
- 运行
id—— UID 必须是untrusted对应数值,不能是 0 - 运行
ls /proc/1/ns/pid并与宿主机对比 —— 值不同说明 PID 命名空间已隔离(注意:chroot 本身不提供此能力,此项依赖unshare --pid等前置操作) - 尝试
ls /etc/shadow或cat /proc/sys/kernel/osrelease—— 应提示 “No such file or directory” 或权限拒绝

















