linux启用sftp
## 🔧 1. 安装 OpenSSH 并查看版本
OpenSSH 通常默认已安装。若未安装,请执行:
sudo yum install -y openssh-server openssh-clients
查看 SSH 版本以确认安装成功:
ssh -V
输出示例:
OpenSSH_8.0p1, OpenSSL 1.1.1k FIPS 25 Mar 2021
> ✅ 只要能输出版本号,说明 OpenSSH 安装正常。
---
## 👥 2. 创建 SFTP 组和用户
创建专用组 sftp,用于统一管理 SFTP 用户:
sudo groupadd sftp
创建用户 mysftp,并将其加入 sftp 组,禁止 Shell 登录:
sudo useradd -g sftp -s /bin/false mysftp
为用户设置密码:
sudo passwd mysftp
> 🔐 提示:输入强密码,避免使用字典词(如 password、123456)。
> 若提示“BAD PASSWORD”,请使用包含大小写、数字、特殊字符的组合,如 MyP@ssw0rd2024。
---
## 📁 3. 创建 Chroot 根目录并设置用户主目录
创建 SFTP 用户的根目录(chroot 目录):
sudo mkdir -p /var/ftp/pub
将该目录设为用户 mysftp 的主目录:
sudo usermod -d /var/ftp/pub mysftp
---
## ⚙️ 4. 修改 SSH 配置文件 /etc/ssh/sshd_config
备份原始配置(推荐):
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
编辑配置文件:
sudo vi /etc/ssh/sshd_config
### 修改内容如下:
# 注释掉默认的外部 SFTP 子系统
#Subsystem sftp /usr/libexec/openssh/sftp-server
# 启用内置 SFTP 服务(更安全)
Subsystem sftp internal-sftp
# 针对 sftp 组的用户应用以下限制
Match Group sftp
# 设置 chroot 目录(必须由 root 拥有,不可被用户写)
ChrootDirectory /var/ftp/pub
# 强制使用 internal-sftp,禁止 shell 命令
ForceCommand internal-sftp
# 禁用端口转发
AllowTcpForwarding no
# 禁用 X11 转发
X11Forwarding no
> ✅ 说明:
> - internal-sftp 是 OpenSSH 内建模块,无需外部二进制,更安全。
> - ChrootDirectory 会将用户锁定在 /var/ftp/pub,无法访问系统其他路径。
> - /bin/false + ForceCommand 确保用户无法获得 Shell。
---
## 🔐 5. 设置根目录权限(关键!)
SFTP 对权限要求非常严格,否则会报错:
fatal: bad ownership or modes for chroot directory
正确设置:
# chroot 根目录必须由 root 拥有,且不能让用户可写
sudo chown root:sftp /var/ftp/pub
sudo chmod 755 /var/ftp/pub
> ❌ 错误做法:
> chown mysftp:sftp /var/ftp/pub # 不行!用户不能拥有 chroot 根目录
> chmod 777 /var/ftp/pub # 不行!权限太宽松
---
## 📂 6. 创建用户可写目录
在 chroot 目录下创建子目录供用户上传文件:
sudo mkdir -p /var/ftp/pub/mysftp
该子目录可以由用户拥有和写入:
sudo chown mysftp:sftp /var/ftp/pub/mysftp
sudo chmod 755 /var/ftp/pub/mysftp
> ✅ 用户登录后路径为 /,但可进入 /mysftp 并上传文件。
> 💡 可创建更多目录,如 /var/ftp/pub/upload,统一管理。
---
## 🔁 7. 重启 SSH 服务
应用配置更改:
sudo systemctl restart sshd.service
(可选)设置开机自启:
sudo systemctl enable sshd.service
查看ssh状态
sudo systemctl status sshd
---
## 🧪 8. 测试连接
### 方法一:使用命令行测试
sftp mysftp@localhost
或远程连接:
sftp mysftp@your-server-ip
成功后应显示:
Connected to your-server-ip.
sftp>
尝试上传文件:
put local_file.txt /mysftp/
### 方法二:使用 FileZilla
- 协议:**SFTP - SSH File Transfer Protocol**
- 主机your-server-ip
- 端口22
- 用户名mysftp
- 密码:你设置的密码
> ⚠️ 不要选择 FTP 或 FTPS!
---
## 📋 9. 常见问题排查
### ❌ 错误fatal: bad ownership or modes for chroot directory
运行以下命令检查路径权限:
namei -l /var/ftp/pub
输出应类似:
f: /var/ftp/pub
drwxr-xr-x root root /
drwxr-xr-x root root var
drwxr-xr-x root root ftp
drwxr-xr-x root sftp pub
确保:
- 所有父目录由 root 拥有
- /var/ftp/pub 为 root:sftp 755
### ❌ 无法上传文件
检查 /var/ftp/pub/mysftp 是否由 mysftp 拥有且权限为 755。
### ❌ 连接被拒绝 / Connection refused
- 检查防火墙:
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --reload
- 检查云服务器安全组是否放行 22 端口(入方向)
## ✅ 安全建议(生产环境)
| 建议 | 说明 |
|------|------|
| 使用 SSH 密钥登录 | 比密码更安全,可禁用密码登录 |
| 创建多个用户 | 每个用户独立目录,便于审计 |
| 定期更新系统 | yum update |
| 日志监控 | 查看 /var/log/secure 登录记录 |
## 🧩 扩展:支持多个 SFTP 用户
可按相同模式添加更多用户:
sudo useradd -g sftp -s /bin/false user2
sudo passwd user2
sudo mkdir /var/ftp/pub/user2
sudo chown user2:sftp /var/ftp/pub/user2
所有用户共享 /var/ftp/pub 为 chroot 根目录,彼此隔离。