在 CentOS 上限制 SFTP 用户只能访问指定目录(不能 SSH 登录、不能越界),最常用、最安全的做法是使用 OpenSSH 自带的 internal-sftp + Chroot。
下面以 CentOS 7 / 8 / Stream 为例,一步步说明。
# 创建用户(不允许登录 shell)
useradd -m -s /sbin/nologin sftpuser
# 设置密码
passwd sftpuser
Chroot 目录必须满足:
mkdir -p /data/sftp/sftpuser
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
# 用户实际可写目录
mkdir /data/sftp/sftpuser/upload
chown sftpuser:sftpuser /data/sftp/sftpuser/upload
✅ 用户登录后看到的根目录是 /
✅ 实际对应系统路径:/data/sftp/sftpuser
✅ 只能往 upload 写文件
编辑配置文件:
vi /etc/ssh/sshd_config
# Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /data/sftp/sftpuser
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
PasswordAuthentication yes
如果是多个用户,可以用:
Match Group sftp
systemctl restart sshd
⚠️ 千万别断开当前 SSH 会话,建议新开窗口测试
sftp sftpuser@服务器IP
登录后:
pwd
# 显示: /
ls
# 只能看到 upload
查看日志:
tail -f /var/log/secure
常见原因:
setsebool -P ssh_chroot_rw_homedirs on
groupadd sftp
usermod -aG sftp sftpuser
sshd_config:
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
✅ 使用 internal-sftp
✅ Chroot 目录属主必须是 root
✅ 用户目录只能在其子目录下写
✅ 禁止 SSH shell 登录
如果你需要:
我可以继续帮你配置。