chroot通过强制重定向进程根路径实现轻量级文件系统隔离,使用户或进程仅能访问指定目录及其子目录;它不隔离网络、进程或资源,不能替代容器,但适用于SFTP上传区、系统修复等场景。

Linux chroot 用户环境隔离不是靠“锁住用户”实现的,而是通过强制重定向文件系统根路径,让指定用户或进程只能看到、访问一个预设目录及其子目录。它不改变网络、进程或设备访问能力,也不限制资源使用,因此不能替代容器或虚拟机,但对轻量级路径隔离、SFTP 上传区、系统修复等场景非常实用。
一、chroot 环境的核心前提
OpenSSH 的 ChrootDirectory 或手动 chroot 命令都依赖同一套硬性规则:
- 从系统根(
/)到 chroot 目录的每一级父目录,所有权必须是root:root - 这些父目录不能对组或其他人开放写权限(即
chmod 755是安全上限) - chroot 目录本身(如
/sftp/user1)必须由root拥有,且不可被组/其他写 - 用户实际可写子目录(如
/sftp/user1/upload)才应归属该用户,并开放适当权限
二、构建 SFTP 专用隔离区(推荐落地方式)
这是最常见也最稳妥的用户隔离用法,完全禁用 Shell,只允许文件传输,所有操作可审计:
- 新建组:
sudo groupadd sftp-audit - 添加用户(禁用登录 shell):
sudo useradd -m -d /sftp/user1 -s /sbin/nologin -g sftp-audit user1 - 创建结构:
sudo mkdir -p /sftp/user1/upload,再设权:sudo chown root:root /sftp /sftp/user1;sudo chmod 755 /sftp /sftp/user1;sudo chown user1:sftp-audit /sftp/user1/upload - 编辑
/etc/ssh/sshd_config,末尾添加:Subsystem sftp internal-sftp Match Group sftp-audit X11Forwarding no AllowTcpForwarding no ChrootDirectory /sftp/%u ForceCommand internal-sftp PermitTunnel no - 重启服务:
sudo systemctl restart sshd
三、手动 chroot 测试环境(适合调试或修复)
若需临时进入命令行环境(如修复损坏系统),请按顺序操作,缺一不可:
- 准备目录:
sudo mkdir -p /mnt/chroot/{bin,lib64,etc,dev,proc,sys} - 复制 bash 及依赖:
sudo cp /bin/bash /mnt/chroot/bin/;再运行ldd /bin/bash,把输出中所有/lib64/*.so.*文件复制进/mnt/chroot/lib64/ - 挂载虚拟文件系统:
sudo mount -t proc proc /mnt/chroot/proc;sudo mount --bind /dev /mnt/chroot/dev;sudo mount -t sysfs sysfs /mnt/chroot/sys - 复制基础配置:
sudo cp /etc/resolv.conf /mnt/chroot/etc/(否则无法解析域名) - 进入:
sudo chroot /mnt/chroot /bin/bash;进去后建议执行export PATH=/bin:/usr/bin:/sbin
四、关键注意事项与常见失败点
很多失败不是因为步骤错,而是忽略了设计边界:
-
报错 “No such file or directory”:90% 是缺少动态库(
libc.so.6等),不是没 bash;务必用ldd查,别凭经验猜 -
能进 chroot 但 ping 不通、ls /proc 报错:忘了挂
/proc或没复制/etc/resolv.conf -
以为 chroot 能防 root 逃逸:只要用户在 chroot 内是 root,就可通过
chroot + chdir + openat组合跳出;它本就不是安全机制 -
退出后忘记卸载:用
sudo umount -R /mnt/chroot/{proc,dev,sys}清理,否则可能影响下次挂载或系统状态











