chroot不是安全沙箱,仅限制路径可见性,需配合OpenSSH ChrootDirectory等配置才能实现用户登录即隔离,且必须满足父目录属主为root、权限≤755等硬性条件。
Linux 用户登录后的环境隔离,chroot 是最轻量、最直接的路径级限制手段,但它不是“自动生效”的登录机制——必须配合 SSH 配置或定制登录流程才能让用户一登录就落入 jail。它不加密、不虚拟化、也不阻断网络,只管“根目录在哪”,所以用对了很实用,用错了反而带来安全隐患。
OpenSSH 的 ChrootDirectory 是最常用也最稳妥的方式,但有硬性要求:
/sftp/user1)必须由 root 拥有,且不可被组/其他人写/sftp/user1/upload)才归属该用户,并设好权限这是生产中最常见、风险最低的落地方式,完全禁用 Shell,只允许文件传输,所有操作可审计:
sudo groupadd sftp-locked
sudo useradd -m -d /sftp/user1 -s /sbin/nologin -g sftp-locked user1
sudo mkdir -p /sftp/user1/upload,然后执行sudo chown root:root /sftp /sftp/user1sudo chmod 755 /sftp /sftp/user1sudo chown user1:sftp-locked /sftp/user1/upload
/etc/ssh/sshd_config,追加以下段落:Subsystem sftp internal-sftpMatch Group sftp-lockedX11Forwarding noAllowTcpForwarding noChrootDirectory /sftp/%uForceCommand internal-sftpPermitTunnel no
sudo systemctl restart sshd
若需让用户登录后进入一个带 bash 的受限命令行(非 SFTP),必须手动准备完整骨架:
sudo mkdir -p /srv/jail/user1/{bin,lib64,etc,dev,proc,sys,home}
sudo cp /bin/bash /srv/jail/user1/bin/,再运行 ldd /bin/bash,把所有 /lib64/*.so.* 文件复制进去sudo cp -a /dev/{null,zero,random,urandom} /srv/jail/user1/dev/
sudo mount -t proc proc /srv/jail/user1/proc,sudo mount --bind /dev /srv/jail/user1/dev,sudo mount -t sysfs sysfs /srv/jail/user1/sys
sudo cp /etc/resolv.conf /srv/jail/user1/etc/,sudo cp /etc/nsswitch.conf /srv/jail/user1/etc/
sudo mkdir /srv/jail/user1/home/user1,sudo chown user1:user1 /srv/jail/user1/home/user1
chroot 只改根路径,不隔离进程、网络、内核资源。如果用户在 jail 内获得 root 权限,仍可能通过 /proc/1/root、设备节点或内核漏洞逃逸。因此:
--userspec=nobody:nogroup 降权启动