一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux 用户登录后的环境隔离技术 chroot/jail

时间:2026-07-12 09:04:46 编辑:袖梨 来源:一聚教程网

chroot不是安全沙箱,仅限制路径可见性,需配合OpenSSH ChrootDirectory等配置才能实现用户登录即隔离,且必须满足父目录属主为root、权限≤755等硬性条件。

Linux 用户登录后的环境隔离,chroot 是最轻量、最直接的路径级限制手段,但它不是“自动生效”的登录机制——必须配合 SSH 配置或定制登录流程才能让用户一登录就落入 jail。它不加密、不虚拟化、也不阻断网络,只管“根目录在哪”,所以用对了很实用,用错了反而带来安全隐患。

chroot 对用户生效的前提条件

OpenSSH 的 ChrootDirectory 是最常用也最稳妥的方式,但有硬性要求:

  • 从系统根(/)到 chroot 目录的每一级父目录,所有权必须是 root:root
  • 这些父目录权限不能开放组/其他写权限(chmod 755 是上限,775 或 777 会拒绝登录)
  • chroot 目录本身(如 /sftp/user1)必须由 root 拥有,且不可被组/其他人写
  • 用户真正需要写的子目录(如 /sftp/user1/upload)才归属该用户,并设好权限

SFTP 场景下的标准配置流程

这是生产中最常见、风险最低的落地方式,完全禁用 Shell,只允许文件传输,所有操作可审计:

  • 新建专用组:sudo groupadd sftp-locked
  • 添加用户并禁用登录 shell: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/user1
    sudo chmod 755 /sftp /sftp/user1
    sudo chown user1:sftp-locked /sftp/user1/upload
  • 编辑 /etc/ssh/sshd_config,追加以下段落:
    Subsystem sftp internal-sftp
    Match Group sftp-locked
    X11Forwarding no
    AllowTcpForwarding no
    ChrootDirectory /sftp/%u
    ForceCommand internal-sftp
    PermitTunnel no
  • 重启服务:sudo systemctl restart sshd

手动构建可交互的 chroot 环境(适合调试或修复)

若需让用户登录后进入一个带 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/procsudo mount --bind /dev /srv/jail/user1/devsudo 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/user1sudo chown user1:user1 /srv/jail/user1/home/user1

关键提醒:这不是安全沙箱

chroot 只改根路径,不隔离进程、网络、内核资源。如果用户在 jail 内获得 root 权限,仍可能通过 /proc/1/root、设备节点或内核漏洞逃逸。因此:

  • 绝不应在 jail 内保留 su、sudo、mount 等特权命令
  • 避免以 root 身份运行用户进程;可用 --userspec=nobody:nogroup 降权启动
  • 真正需要强隔离,请用 systemd-nspawn、podman 或 Docker
  • chroot 的价值在于“路径可见性控制”,而非“权限边界控制”

热门栏目