ChrootDirectory实现SFTP用户隔离需满足四点:一、目录及其所有上级目录属主为root且权限≤755;二、必须启用internal-sftp子系统并禁用高危选项;三、用户不能是root且Shell须设为/bin/nologin等禁用类型;四、登录后pwd显示/且无法访问沙箱外路径。

直接用 ChrootDirectory 把 SFTP 账号“焊死”在指定路径,是 OpenSSH 提供的原生沙箱机制,但不是配完就生效——它对目录结构、权限、子系统和用户身份有硬性要求。配错一个环节,轻则登录失败,重则形同虚设。
一、目录结构与权限必须严格达标
ChrootDirectory 指向的路径(比如 /sftp/deploy)及其所有上级目录(/sftp → /),必须同时满足:
-
属主必须是 root:执行
chown root:root /sftp /sftp/deploy -
非 root 用户不可写:执行
chmod 755 /sftp /sftp/deploy(不能是 775、777 或 757) -
内部可写子目录需单独授权:如需上传,建
/sftp/deploy/upload,再chown deploy:deploy /sftp/deploy/upload,但父级/sftp/deploy仍保持 root:root + 755
二、配置必须绑定 internal-sftp 子系统
Chroot 和传统外部 sftp-server 不兼容。必须确保 /etc/ssh/sshd_config 中:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 全局只保留一行:
Subsystem sftp internal-sftp(删掉所有其他Subsystem sftp行) - 匹配块内强制启用 internal-sftp:
ForceCommand internal-sftp - 禁用高危扩展:
X11Forwarding no、AllowTcpForwarding no、PermitTunnel no
示例配置段:
Match Group sftp-locked
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
PermitTunnel no
三、用户不能是 root,且 Shell 必须禁用
OpenSSH 明确拒绝为 root 用户启用 ChrootDirectory——这不是 bug,是安全设计。真实做法是:
- 创建专用低权账号:
useradd -m -s /usr/bin/false deploy-user(/usr/bin/false或/bin/nologin) - 账号密码或密钥认证照常,但无法获得交互式 shell
- 绝不在配置中写
Match User root或给 root 配ChrootDirectory,否则 sshd 启动会静默忽略或报错
四、SFTP 登录后行为确认要点
成功连接后,用户视角的根目录就是 ChrootDirectory 所指路径。验证是否真正锁死:
- 执行
pwd应显示/,而非真实路径 - 执行
ls /只能看到你放进沙箱里的内容(如upload、download) - 执行
cd ..或cd /etc应提示 “No such file or directory” - 若还能跳出或看到系统文件,一定是某层父目录(如
/sftp)被设成了 775 或属主非 root

















