下面分几种常见场景,说明在 CentOS 上如何设置 SFTP 权限。内容适用于 CentOS 7 / 8 / Stream,默认使用 OpenSSH。
这是最推荐、最安全的做法。
useradd -m -s /sbin/nologin sftpuser
passwd sftpuser
-s /sbin/nologin:禁止 SSH 登录,只能 SFTP
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
编辑:
vim /etc/ssh/sshd_config
在文件末尾添加:
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /data/sftp/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
systemctl restart sshd
sftp sftpuser@服务器IP
✅ 登录后只能在 /upload 写文件
✅ 不能访问系统其他目录
✅ 不能 SSH 登录
useradd -m -s /sbin/nologin sftp1
useradd -m -s /sbin/nologin sftp2
mkdir -p /data/sftp/shared
chown root:root /data/sftp/shared
chmod 755 /data/sftp/shared
mkdir /data/sftp/shared/data
chown sftp1:sftp1 /data/sftp/shared/data
chmod 770 /data/sftp/shared/data
groupadd sftpgroup
usermod -aG sftpgroup sftp1
usermod -aG sftpgroup sftp2
chown :sftpgroup /data/sftp/shared/data
setfacl -m u:sftpuser:rwx /data/sftp/sftpuser/upload
setfacl -d -m u:sftpuser:rwx /data/sftp/sftpuser/upload
⚠️ 但 SFTP 协议本身不支持“禁止删除”
如需严格限制,推荐:
查看状态:
getenforce
如果是 Enforcing,需设置:
semanage fcontext -a -t ssh_home_t "/data/sftp(/.*)?"
restorecon -Rv /data/sftp
或临时关闭测试:
setenforce 0
| 问题 | 原因 |
|---|---|
| 登录失败 | ChrootDirectory 不是 root 拥有 |
| 无法上传 | 用户没有写权限 |
| 能 SSH 登录 | 没设置 /sbin/nologin |
| 连接被拒 | sshd_config 写错 |
internal-sftp如果你愿意,可以告诉我:
我可以给你一份完全可直接用的配置。