## 🔧 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/pubroot: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 根目录,彼此隔离。