chroot jail 不是安全沙箱,仅更改根目录且不隔离内核资源,无法防御 root 权限逃逸;它适用于系统修复、轻量测试及非特权进程路径限制,真正安全隔离应使用 Podman、systemd-nspawn 或 Docker。

chroot jail 不是安全沙箱,它只改根目录、不隔离内核资源,无法防御 root 权限逃逸。真正需要安全隔离,请用 podman、systemd-nspawn 或 Docker;chroot 适合系统修复、轻量测试或非特权进程路径限制——这点必须先明确。
一、基础 jail 目录结构与最小化准备
选一个专用路径,比如 /srv/jail/basic,按最小原则建好骨架:
- 执行 mkdir -p /srv/jail/basic/{bin,lib64,etc,dev,proc,sys}
- 复制必要命令:如 cp /bin/{bash,ls} /srv/jail/basic/bin/
- 查依赖并复制:运行 ldd /bin/bash,把输出中所有 => /lib64/xxx.so 路径的文件,用 cp --parents 拷进对应位置(例如 cp --parents /lib64/libc.so.6 /srv/jail/basic/)
- 补关键设备节点:cp -a /dev/{null,zero,random,urandom} /srv/jail/basic/dev/
二、必备虚拟文件系统挂载
没挂载 /proc /dev /sys,chroot 内连 ps 和 id 都会异常。进入前必须执行:
- mount -t proc proc /srv/jail/basic/proc
- mount --bind /dev /srv/jail/basic/dev
- mount -t sysfs sysfs /srv/jail/basic/sys
若需网络功能,还得拷配置:cp /etc/resolv.conf /srv/jail/basic/etc/,并确认 /etc/nsswitch.conf 存在且含 hosts: files dns 行。
三、启动与验证 chroot 环境
用以下命令进入并快速验证是否“真隔离”:
- sudo chroot /srv/jail/basic /bin/bash
- 进去后立即执行:ls /(应只看到你放进去的 bin、lib64 等目录)
- 运行:id(看 uid/gid)、mount(确认 /proc /sys 已挂载)、ls /proc/1/ns(该目录为空或报错,说明无命名空间隔离——这正是 chroot 的本质局限)
若提示 “No such file or directory”,不是 bash 缺失,而是某个 .so 库漏了或路径不对;若 ls /proc 报错或内容为空,说明 proc 没挂对。
四、SSH 用户强制 chroot 的实用配置
想让用户登录即落入 jail?别改用户 shell,用 OpenSSH 原生支持:
- 确保 jail 根目录(如 /srv/jail/webdev)属主为 root:root,权限为 755,且不可被用户写
- 编辑 /etc/ssh/sshd_config,添加段落:
Match User webdev
ChrootDirectory /srv/jail/webdev
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no - 用户 home 必须设为 jail 内路径(如 /home/webdev),真实位置是 /srv/jail/webdev/home/webdev,且需手动创建并设权 chown webdev:webdev /srv/jail/webdev/home/webdev
重启 sshd 后,该用户只能通过 SFTP 访问指定目录,无法执行任意命令——这是生产中较稳妥的用法。
chroot 的价值不在“防黑客”,而在“防手滑”。它脆弱但轻快,适合修复、测试和受限交付场景。只要不把它当容器用,就很少踩坑。


















