能,但必须同时满足ChrootDirectory路径属主为root、权限≤755、启用internal-sftp子系统、用户Shell设为/sbin/nologin或/bin/false这四个硬性条件,缺一不可。

用 ChrootDirectory 把 SFTP 传输账号锁死在指定路径,核心是让系统在用户登录后“换根”——即把整个文件系统视图限制在某个目录内,使其无法看到或访问该目录以外的任何内容。这不依赖 shell 登录权限,而是由 OpenSSH 的 internal-sftp 子系统强制执行,安全可靠。
前提条件必须满足
Chroot 能否生效,取决于几个硬性要求,缺一不可:
-
Chroot 目录及其所有上级目录(一直到
/)的所有者必须是 root,且不能被非 root 用户写入;例如/data/sftp/user1要生效,则/、/data、/data/sftp、/data/sftp/user1全部属主为 root - Chroot 目录本身权限建议设为 755(root 可读写,组和其他仅可读执行),不能是 777 或 700
-
用户不能拥有交互式 shell 登录权限,应设为
/sbin/nologin或/bin/false -
必须使用
internal-sftp子系统,需注释掉原sftp-server行,并启用Subsystem sftp internal-sftp
配置 sshd_config 的关键段落
以锁定用户 backup 到 /srv/backup 为例,在 /etc/ssh/sshd_config 末尾添加:
Subsystem sftp internal-sftp
Match User backup
ChrootDirectory /srv/backup
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
注意:Match 块必须放在文件末尾,且不能嵌套;ChrootDirectory 指向的是“监狱根目录”,不是用户家目录——用户实际进入的位置是该目录下的 /home/backup(如果存在)或直接 /。
准备 Chroot 环境(仅限 SSH 交互式登录,SFTP 不需要)
⚠️ 如果你只做纯 SFTP 文件传输(推荐),无需复制 bash、dev 设备、lib 库等复杂操作。SFTP 协议本身不依赖 shell 环境,只要 ChrootDirectory 结构合规、权限正确,internal-sftp 就能正常工作。
但如果你同时允许该用户通过 SSH 执行命令(如 ssh backup@host ls),那就必须手动构建最小 chroot 环境:创建 /srv/backup/{bin,dev,lib64,etc},复制 bash 和依赖库,生成 /dev/{null,tty,zero,random},并放入精简版 /etc/passwd 和 /etc/group。这对 SFTP 账号属于过度配置,一般不建议。
用户与目录权限实操要点
假设要锁定用户 upload 到 /var/www/uploads:
- 创建用户:
useradd -s /sbin/nologin -M upload(-M跳过家目录自动创建) - 建目录并设权:
mkdir -p /var/www/uploads/upload,然后chown root:upload /var/www/uploads,再chmod 755 /var/www/uploads - 赋予用户对其子目录的写权限:
chown upload:upload /var/www/uploads/upload && chmod 755 /var/www/uploads/upload - 确保
/var、/var/www、/var/www/uploads全部属主为 root(可用ls -ld /var /var/www /var/www/uploads验证)
这样用户登录后,看到的根就是 /var/www/uploads,其可写位置仅为 /upload 子目录,既安全又实用。

















