chroot jail 不是安全沙箱,仅重定向文件系统路径,必须配合最小化构建、挂载控制、用户降权和资源限制四步才能形成有效约束链。
chroot jail 本身不是安全沙箱,它只做文件系统路径重定向,不隔离进程、网络或内核资源。所以为不安全服务建隔离环境,不能只靠 chroot 命令,必须配合最小化构建、挂载控制、用户降权和资源限制四步动作,才能形成有效约束链。
选专用路径,比如 /srv/chroot/untrusted,避免用 /tmp 或用户家目录:
sudo mkdir -p /srv/chroot/untrusted/{bin,lib64,etc,dev,proc,sys,tmp,usr}
curl,先执行 ldd $(which curl),再仅把输出中带 /lib64/ 的 .so 文件拷入 /srv/chroot/untrusted/lib64/
sudo mknod -m 666 /srv/chroot/untrusted/dev/{null,zero,urandom,tty} c 1 3(主次设备号按需调整)没这些,ps、ls /proc、DNS 解析等基本功能都会失效:
sudo mount -t proc proc /srv/chroot/untrusted/procsudo mount --bind /sys /srv/chroot/untrusted/syssudo 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
chroot 内保留 root 权限等于主动放弃隔离效果:
sudo useradd -r -s /bin/bash -d /untrusted untrusted
sudo mkdir -p /srv/chroot/untrusted/home/untrusted,并设属主: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 对应数值,不能为 0ls /:只应看到你放进去的 bin、lib64 等目录,看不到宿主机的 /etc 或 /home
ls /etc/shadow 或 cat /proc/sys/kernel/osrelease:应返回 “No such file or directory” 或权限拒绝