在 CentOS 上配置 SFTP 用户,常见且安全的做法是:
使用 OpenSSH 自带的 SFTP + 限制用户只能 SFTP,不能 SSH 登录,通常配合 ChrootDirectory 使用。
下面是一套标准、推荐的做法(CentOS 7/8 通用)。
useradd -m -s /sbin/nologin sftpuser
-m:创建家目录-s /sbin/nologin:禁止 SSH 登录sftpuser 为用户名,可自行修改passwd sftpuser
⚠️ ChrootDirectory 必须对 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
编辑 SSH 配置:
vim /etc/ssh/sshd_config
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /data/sftp/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
如果你是多个 SFTP 用户,也可以用:
Match Group sftpusers
systemctl restart sshd
在另一台机器上测试:
sftp sftpuser@服务器IP
✅ 成功示例:
sftp> pwd
Remote working directory: /
sftp> cd upload
sftp> put test.txt
bad ownership or modes for chroot directory
✅ 检查:
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
如果 SELinux 开启,可能导致无法访问。
查看状态:
getenforce
临时关闭测试:
setenforce 0
如果关闭后可用,说明是 SELinux 问题,建议配置:
semanage fcontext -a -t ssh_home_t "/data/sftp/sftpuser(/.*)?"
restorecon -Rv /data/sftp/sftpuser
groupadd sftpusers
useradd -m -g sftpusers -s /sbin/nologin user1
Match Group sftpusers
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
| 项目 | 说明 |
|---|---|
| 用户 shell | /sbin/nologin |
| SFTP 目录 | 必须是 root 拥有 |
| 上传目录 | 单独创建并赋予用户 |
| SSH 配置 | internal-sftp + ChrootDirectory |
| SELinux | 注意影响 |
如果你需要:
✅ 只允许密钥登录
✅ 限制磁盘配额
✅ Web + SFTP 共用目录
✅ Docker 环境 SFTP
可以告诉我你的具体场景,我给你定制方案。