在 CentOS 上限制 SFTP 用户只能访问指定目录(不能 SSH 登录、不能访问其他目录),最常用、最安全的方法是使用 OpenSSH 自带的 internal-sftp + ChrootDirectory。下面给你一套标准做法,适用于 CentOS 7 / 8 / Stream。
确认 OpenSSH 已安装:
rpm -qa | grep openssh
一般系统都自带,版本建议 OpenSSH 5.0+(CentOS 7+ 都没问题)。
useradd -m -d /home/sftpuser -s /sbin/nologin sftpuser
passwd sftpuser
/sbin/nologin防止 SSH 登录
⚠️ ChrootDirectory 必须由 root 拥有,且不能有其他用户写权限
mkdir -p /sftp/sftpuser
chown root:root /sftp/sftpuser
chmod 755 /sftp/sftpuser
mkdir /sftp/sftpuser/upload
chown sftpuser:sftpuser /sftp/sftpuser/upload
chmod 755 /sftp/sftpuser/upload
✅ 用户只能往 upload 写文件
编辑 SSH 配置:
vim /etc/ssh/sshd_config
Subsystem sftp internal-sftp
不要用
Subsystem sftp /usr/libexec/openssh/sftp-server
Match User sftpuser
ChrootDirectory /sftp/sftpuser
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
你也可以按 用户组 限制(推荐多用户场景):
Match Group sftpusers
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
systemctl restart sshd
sftp sftpuser@服务器IP
pwd
ls
cd /
✅ 应该看到:
Remote working directory: /
且无法访问 /etc、/root 等系统目录
检查:
/var/log/secure
常见原因:
✅ 正确示例:
ls -ld /sftp/sftpuser
# drwxr-xr-x root root
/sftp/sftpuser (root:root 755) ← Chroot
/sftp/sftpuser/upload (sftpuser:sftpuser)
如果你需要:
可以直接告诉我你的具体需求,我可以给你定制方案。