使用OpenSSH internal-sftp实现SFTP用户chroot禁锢需配置Subsystem sftp internal-sftp、Match Group规则指定ChrootDirectory %h并设ForceCommand internal-sftp -d /,且chroot路径各级目录属主必须为root、无群组/其他用户写权限,用户shell应设为/bin/false或/usr/sbin/nologin。

Linux系统中通过OpenSSH的SFTP子系统实现安全文件传输时,若需限制用户仅能访问自身家目录(即“禁锢”或“chroot”),不能浏览系统其他路径,必须正确配置SFTP子系统与chroot环境。单纯修改用户shell或设置home目录权限不足以实现可靠禁锢,关键在于OpenSSH的internal-sftp子系统配合严格的chroot目录结构和权限控制。
使用 internal-sftp 实现安全禁锢
OpenSSH自版本4.8起推荐使用内置的internal-sftp替代旧版sftp-server,因其支持原生chroot且无需额外二进制文件,更安全可控。
- 在
/etc/ssh/sshd_config中禁用默认sftp-server,启用internal-sftp:
Subsystem sftp internal-sftp
- 为特定用户组(如sftponly)配置chroot规则:
Match Group sftponly<br> ChrootDirectory %h<br> ForceCommand internal-sftp -d /<br> AllowTcpForwarding no<br> X11Forwarding no
其中%h表示用户家目录;-d /使用户登录后直接位于chroot根目录(即其家目录顶层),而非子目录。
chroot目录权限必须严格满足要求
OpenSSH对chroot目录有硬性权限限制:从根目录到用户家目录的**每一级父目录**,属主必须为root,且不能有群组或其他用户的写权限(即不能是777、775、755等含group/others writable的权限)。
- 例如用户
alice家目录为/sftp/alice,则: -
/sftp必须由root拥有,权限为755或750(不能是775) -
/sftp/alice必须由root拥有,权限建议755;若需用户上传,其内部子目录(如/sftp/alice/upload)才可由alice拥有并设为755或775 - 常见错误:将
/sftp/alice设为alice:alice且755 → 登录失败,报错“fatal: bad ownership or modes”
用户Shell与认证方式需同步调整
被chroot的SFTP用户不应拥有交互式shell权限,否则可能绕过限制。
- 将用户shell设为
/bin/false或/usr/sbin/nologin(不影响SFTP,因internal-sftp不依赖shell) - 确保用户密码或密钥已正确配置;若用密钥,
~/.ssh/authorized_keys应放在chroot内的/home/alice/.ssh/(注意:此时/home/alice实际是chroot后的/sftp/alice) - 若需保留SSH登录能力(仅限SFTP),不可设置
AllowUsers或DenyUsers误拦;可用Match User单独配置更精细规则
调试与验证要点
配置变更后必须重载sshd(sudo systemctl reload sshd),并检查日志(/var/log/auth.log)定位问题。
- 典型错误信息及对应原因:
-
Write failed: Broken pipe或Connection closed→ chroot路径权限不合规 -
Received message too long→ 用户shell启动了非预期进程(如bash profile输出内容),应清空.bashrc等文件或确保其不输出任何内容 - 登录成功但无法列出目录 → chroot内缺失必要目录结构(如
/dev/null非必需,但/etc/passwd、/lib64等也不需要——internal-sftp纯用户态运行,无需这些)








