在 CentOS 上限制 SFTP 权限,常见且安全的做法是使用 OpenSSH 自带的 internal-sftp + Chroot,而不是给普通 Shell。下面按最常用、最安全的方式一步步说明。
sftpuser/data/sftp/sftpuser)CentOS 7/8 默认已安装:
rpm -qa | grep openssh
如未安装:
yum install -y openssh-server
systemctl enable sshd
systemctl start sshd
useradd -m -s /sbin/nologin sftpuser
passwd sftpuser
/sbin/nologin禁止 SSH 登录
⚠️ Chroot 目录必须由 root 拥有,且其他用户不能写
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
chmod 755 /data/sftp/sftpuser/upload
✅ 用户只能往 upload 写文件
编辑配置文件:
vim /etc/ssh/sshd_config
找到或添加:
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /data/sftp/sftpuser
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
如果你要限制多个用户:
Match Group sftpusers
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
systemctl restart sshd
sftp sftpuser@服务器IP
✅ 成功
❌ 如果失败,查看日志:
tail -f /var/log/secure
原因:
755✅ 解决:
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
原因:
✅ 解决:
chown sftpuser:sftpuser /data/sftp/sftpuser/upload
Match User sftpuser
ChrootDirectory /data/sftp/sftpuser
ForceCommand internal-sftp
AllowUsers sftpuser@192.168.1.*
groupadd sftpusers
usermod -aG sftpusers sftpuser
Match Group sftpusers
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
✅ 最安全、最标准
internal-sftpChrootDirectory/sbin/nologin如果你需要:
可以直接告诉我你的使用场景,我可以给你定制方案。