在 CentOS 上限制 SFTP 用户只能访问指定目录(不能 SSH 登录、不能越权),最常用、最安全的做法是使用 OpenSSH 自带的 chroot + internal-sftp。
下面给你一套标准可落地的配置步骤(CentOS 7 / 8 / Stream 通用)。
Subsystem sftp internal-sftpMatch User/Group 限制ChrootDirectory 锁定根目录# 创建用户组
groupadd sftpusers
# 创建用户(不允许 SSH 登录)
useradd -g sftpusers -s /sbin/nologin sftpuser
# 设置密码
passwd sftpuser
假设限制目录为:
/data/sftp/sftpuser
mkdir -p /data/sftp/sftpuser
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
⚠️ ChrootDirectory 必须属主是 root,且其他用户不可写
mkdir /data/sftp/sftpuser/upload
chown sftpuser:sftpusers /data/sftp/sftpuser/upload
用户只能在 upload 里写文件。
编辑:
vi /etc/ssh/sshd_config
找到这行(注释或删除):
# Subsystem sftp /usr/libexec/openssh/sftp-server
改成:
Subsystem sftp internal-sftp
Match Group sftpusers
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
%u表示用户名,自动映射到/data/sftp/sftpuser
systemctl restart sshd
sftp sftpuser@服务器IP
✅ 成功
❌ 如果失败,看 /var/log/secure
fatal: bad ownership or modes for chroot directory
✅ 解决:
ChrootDirectory 必须 root 拥有ChrootDirectory 下不能直接写Match User user1,user2Match GroupAllowTcpForwarding no
LogLevel VERBOSE
如果你愿意,我可以:
直接说你的需求即可。