127 lines
6.0 KiB
Markdown
127 lines
6.0 KiB
Markdown
在 **CentOS 9 服务器**上部署一个安全、受限的 SFTP 服务,然后在 **Windows 客户端**上通过免费工具将其挂载为一个网络驱动器
|
||
|
||
整个流程分为两大步:
|
||
|
||
### 第一步:在 CentOS 9 上配置 SFTP 服务端
|
||
|
||
这个步骤的目标是创建一个只能进行文件传输、不能登录 Shell 的安全用户,并将其限制在特定的目录中。
|
||
|
||
1. **安装与启动 OpenSSH 服务**
|
||
CentOS 9 通常预装了 OpenSSH,它是 SFTP 服务的基础。如果未安装,可以执行以下命令:
|
||
```bash
|
||
sudo dnf install -y openssh-server
|
||
```
|
||
安装后,启动并设置开机自启:
|
||
```bash
|
||
sudo systemctl enable --now sshd
|
||
sudo systemctl status sshd # 确认状态为 active (running)
|
||
```
|
||
|
||
|
||
2. **创建 SFTP 用户组和用户**
|
||
创建一个专用的用户组和用户,并禁止该用户通过 SSH 登录系统。
|
||
```bash
|
||
# 创建用户组
|
||
sudo groupadd sftpusers
|
||
|
||
# 创建用户,指定组、家目录,并禁止shell登录
|
||
# 这里以用户名 'mysftpuser' 为例,你可以自行替换
|
||
sudo useradd -g sftpusers -d /sftp/mysftpuser -s /sbin/nologin mysftpuser
|
||
|
||
# 为用户设置密码
|
||
sudo passwd mysftpuser
|
||
```
|
||
|
||
|
||
3. **创建目录并设置严格的权限**
|
||
这是最关键的一步。为了安全,SFTP 的 `Chroot` 目录(即用户的家目录)必须属于 `root` 用户,且其他用户不能有写入权限。用户实际能读写的应该是其下的子目录。
|
||
```bash
|
||
# 创建用户的家目录(作为 chroot 的根)
|
||
sudo mkdir -p /sftp/mysftpuser
|
||
|
||
# 在家目录下创建一个用户可写的 upload 文件夹
|
||
sudo mkdir -p /sftp/mysftpuser/upload
|
||
|
||
# 设置家目录 /sftp/mysftpuser 的所有者为 root,权限为 755
|
||
sudo chown root:root /sftp/mysftpuser
|
||
sudo chmod 755 /sftp/mysftpuser
|
||
|
||
# 设置 upload 目录的所有者为 mysftpuser,组为 sftpusers,权限为 755
|
||
sudo chown mysftpuser:sftpusers /sftp/mysftpuser/upload
|
||
sudo chmod 755 /sftp/mysftpuser/upload
|
||
```
|
||
|
||
|
||
4. **修改 SSH 配置文件 (`/etc/ssh/sshd_config`)**
|
||
编辑配置文件,启用内部 SFTP 并限制 `sftpusers` 组的用户。
|
||
```bash
|
||
sudo vi /etc/ssh/sshd_config
|
||
```
|
||
* 找到或添加以下行,**注释掉**原有的 `Subsystem`,启用内置 SFTP:
|
||
```
|
||
#Subsystem sftp /usr/libexec/openssh/sftp-server
|
||
Subsystem sftp internal-sftp
|
||
```
|
||
* 在文件末尾添加以下配置块,对 `sftpusers` 组生效:
|
||
```
|
||
Match Group sftpusers
|
||
ChrootDirectory /sftp/%u
|
||
ForceCommand internal-sftp
|
||
AllowTcpForwarding no
|
||
X11Forwarding no
|
||
```
|
||
> `%u` 会自动替换为用户名,确保每个用户被锁定在自己的家目录中 。
|
||
|
||
5. **重启 SSH 服务并检查防火墙**
|
||
修改配置后,需要重启服务并确保防火墙放行 SSH 端口(22)。
|
||
```bash
|
||
# 检查配置文件语法是否正确
|
||
sudo sshd -t
|
||
|
||
# 如果无报错,重启服务
|
||
sudo systemctl restart sshd
|
||
|
||
# 配置防火墙(如果系统启用了防火墙)
|
||
sudo firewall-cmd --permanent --add-service=ssh
|
||
sudo firewall-cmd --reload
|
||
```
|
||
|
||
|
||
### 第二步:在 Windows 上挂载为网络驱动器
|
||
|
||
Windows 原生不支持直接挂载 SFTP。因此,我们需要安装两个免费软件来让 Windows 获得这个能力。
|
||
|
||
1. **在 Windows 上安装必备软件**
|
||
* **WinFsp**: 它是一个底层的文件系统驱动,为 SSHFS-Win 提供运行基础。
|
||
* **SSHFS-Win**: 这是一个实现了 SSHFS 协议的 Windows 客户端。
|
||
* **操作步骤**:
|
||
1. 从 GitHub 或其他可信来源下载 [WinFsp](https://github.com/winfsp/winfsp) 和 [SSHFS-Win](https://github.com/winfsp/sshfs-win) 的安装包。
|
||
2. **务必先安装 WinFsp**,再安装 SSHFS-Win,全部保持默认设置即可 。
|
||
|
||
2. **开始映射网络驱动器**
|
||
* 打开 Windows 的**文件资源管理器**。
|
||
* 在左侧导航栏右键点击 **“此电脑”**,选择 **“映射网络驱动器”** 。
|
||
|
||
3. **配置驱动器号和文件夹路径**
|
||
* **驱动器**:选择一个你喜欢的盘符,例如 `Z:`。
|
||
* **文件夹**:这是最关键的一步,需要按照 SSHFS-Win 要求的特殊格式填写。假设你的 CentOS 服务器 IP 是 `192.168.1.100`,SFTP 用户名是 `mysftpuser`,SSH 端口是默认的 22,那么你应该输入:
|
||
```
|
||
\\sshfs\mysftpuser@192.168.1.100
|
||
```
|
||
**注意**:如果 SSH 端口不是默认的22(例如改成了 2222),则需要在 IP 地址后用感叹号指定端口,格式为 `\\sshfs\user@ip!port` 。
|
||
* 勾选 **“登录时重新连接”**,这样每次开机都会自动挂载。
|
||
* 点击 **“完成”**。
|
||
|
||
4. **输入密码并完成连接**
|
||
系统会弹出一个 Windows 安全窗口,要求你输入 `mysftpuser` 的密码。输入后即可成功连接。
|
||
现在,打开“此电脑”,你就能看到一个新的 `Z:` 盘,里面就是你 CentOS 服务器上的 `/sftp/mysftpuser/upload` 目录内容。你可以像操作本地硬盘一样,对它进行拖拽、复制、粘贴等操作。
|
||
|
||
### 常见问题排查
|
||
* **连接时提示"Connection closed by remote host"**:这通常是服务器端的 `ChrootDirectory` 权限设置错误。请返回第一步的第3点,**确保 `/sftp/mysftpuser` 目录的所有者是 `root`,且权限为 755** 。
|
||
* **因需要暴露22端口 需确保其他用户配置白名单登录 防止被黑**
|
||
* **登录后看不到任何文件或无法写入**:请检查你是否进入了 `upload` 目录。因为 `mysftpuser` 的家目录归 `root` 所有,你只能看到但无法写入。你需要进入 `upload` 目录才能上传文件。同时检查 `upload` 目录的所有者是否为 `mysftpuser` 。
|
||
* **SELinux 阻止**:如果你的 CentOS 启用了 SELinux(建议保持启用),可能需要执行以下命令来允许 SSH 读写用户目录:
|
||
```bash
|
||
sudo setsebool -P ssh_chroot_rw_homedirs on
|
||
```
|