SFTP 或 SSH 文件传输协议是一种在两台计算机之间安全传输数据的方法。它是运行在 SSH 协议之上并利用其安全性并完全支持其身份验证的 FTP。
现在,建议使用 SFTP 而不是旧的旧 FTP 或 FTP/S 协议。SFTP 默认是安全的,因为这就是 SSH 的工作方式。从安全的角度来看,SFTP 还可以保护您免受密码嗅探和中间人攻击 (MiTM)。
与 SSH 一样,SFTP 也使用加密和加密哈希函数保护您的数据完整性。此外,它还支持多种安全身份验证方法,包括密码和基于密钥的身份验证。此外,它减少了服务器对外部网络的开放端口,因为它与 SSH 协议在同一端口上运行。
先决条件
在本指南中,您将学习如何在 Linux 系统上设置 SFTP 服务器。此外,您还将学习 sftp 客户端的基本命令。
以下是当前的实施环境:
Linux 服务器 - 您可以使用 Debian、Ubuntu、CentOS、Fedora、Rocky 或任何其他 Linux 发行版。
确保 OpenSSH 软件包在您的 Linux 系统上可用。
SFTP 客户端 - sftp 命令行或您喜欢的任何 GUI 客户端。
验证 OpenSSH 包
要设置 SFTP 服务器,您必须在 Linux 系统上安装 OpenSSH 软件包。几乎所有 Linux 分发服务器都默认安装了 OpenSSH 软件包。但是,如果您的系统上没有 OpenSSH 软件包,您可以从官方存储库安装它。
要确保在您的 Linux 系统上安装了 OpenSSH 软件包,请使用以下命令。
对于 Debian 或 Ubuntu 服务器,您可以使用下面的 dpkg 命令。
dpkg -l | grep ssh
1
下面是我们 Debian 系统的输出。
ii libssh2-1:amd64 1.9.0-2 amd64 SSH2 client-side library
ii openssh-client 1:8.4p1-5 amd64 secure shell (SSH) client, for secure access to remote machines
ii openssh-server 1:8.4p1-5 amd64 secure shell (SSH) server, for secure access from remote machines
ii openssh-sftp-server 1:8.4p1-5 amd64 secure shell (SSH) sftp server module, for SFTP access from remote machines
1
2
3
4
第一列“ ii ”表示已安装软件包。软件包“ openssh-sftp-server ”安装在 Debian/Ubuntu 系统上。
对于 RHEL/CentOS/Fedora/Rocky Linux/AlmaLinux 用户,您可以使用如下 rpm 命令。
rpm -qa | grep ssh
1
创建组和用户
在这一步,您将为 SFTP 服务器创建一个新组和用户。该组内的用户将被允许访问 SFTP 服务器。并且出于安全原因,SFTP 用户无法访问 SSH 服务。SFTP 用户只能访问 SFTP 服务器。
执行以下命令创建一个新组’ sftpgroup '。
sudo groupadd sftpgroup
1
2.使用以下命令 创建一个新用户“ sftpuser ”。
sudo useradd -G sftpgroup -d /srv/sftpuser -s /sbin/nologin sftpuser
1
详细选项:
-G : 自动将用户添加到’ sftpgroup '。
-d:指定新用户的主目录。
-s : 将新用户的默认设置为’ /sbin/nologin ',这意味着该用户无法访问 SSH 服务器。
接下来,使用以下命令 为用户“ sftpuser ”创建密码。
passwd sftpuser
1
输入您的强密码并重复,然后按“ Enter ”确认。
要添加更多用户,请重复第2 和第 3 阶段,最重要的是,所有 SFTP 用户必须在组 ’ sftpgroup ’ 中,并且不能通过 SSH 访问 shell。
设置 Chroot 监狱目录
创建新组和用户后,您必须为 SFTP 用户创建和配置 chroot 目录。
对于用户’sftpuser’,新的主目录将位于’/srv/sftpuser’。执行下面的命令来创建它。
mkdir -p /srv/sftpuser
1
要为用户’ sftpuser '设置chroot ,您必须将目录的所有权更改为用户root,但保持组可以读取和执行而没有写入权限。
使用以下命令将目录的所有权更改为用户“root”。
sudo chown root /srv/sftpuser
1
授予组读取和执行权限,但不能写入。
sudo chmod g+rx /srv/sftpuser
1
接下来,在“ /srv/sftpuser ”目录中创建一个新的“data”目录,并将该“ data ”目录的所有权更改为用户“ sftpuser ”。
mkdir -p /srv/sftpuser/data
chown sftpuser:sftpuser /srv/sftpuser/data
1
2
到目前为止,下面详细介绍了 SFTP 用户目录的配置。
目录“ /srv/sftuser”是默认的主目录。
用户 ’ sftpuser '不能写入目录 ’ /srv/sftpuser ',但可以读取该目录中的内容。
用户’ sftpuser ‘可以将文件上传到目录’ /srv/sftpuser/data '的SFTP服务器。
在 SSH 服务器上启用 SFTP
要在 OpenSSH 上启用 SFTP 服务器,您必须编辑 SSH 配置“/etc/ssh/sshd_config”。
1.使用 nano 或 vim 编辑 ssh 配置“ /etc/ssh/sshd_config ”。
sudo nano /etc/ssh/sshd_config
1
2.注释以下配置以禁用独立的“ sftp-server ”功能。
#Subsystem sftp /usr/lib/openssh/sftp-server
1
将以下配置粘贴到该行的底部。
Subsystem sftp internal-sftp
Match Group sftpgroup
ChrootDirectory %h
X11Forwarding no
AllowTCPForwarding no
ForceCommand internal-sftp
1
2
3
4
5
6
7
保存配置并退出。
详细配置:
我们不使用子进程“ sftp-server ”,而是使用“ internal-sftp ”。
为组“ sftpgroup ”启用了 SFTP 服务器。
要应用新配置,请使用以下命令重新启动 ssh 服务。
sudo systemctl restart sshd
1
SFTP 服务器已准备就绪并可访问,它与 SSH 服务在同一端口上运行。
访问 SFTP 服务器
在客户端,我们将使用默认安装在大多数 Linux 发行版上的 sftp 命令行。但是,您也可以使用其他命令行客户端或 GUI FTP 客户端,例如FileZilla、Cyberduck等。
要连接到 SFTP 服务器,请执行 sftp 命令,如下所示。
sftp ftpuser@SERVER-IP
1
如果您的 SFTP 和/或 SSH 服务器在自定义端口上运行,您可以使用 sftp 命令,如下所示。
sftp -P PORT ftpuser@SERVER-IP
1
键入“ sftpuser ”的密码。
连接到 SFTP 服务器后,执行以下命令。
显示当前路径工作目录并列出所有可用的文件和目录。
pwd
ls
1
2
将本地文件上传到SFTP服务器的’/ ‘目录,会出现’ permission denied ',因为是chroot目录。
put /path/to/file/on/local /
1
将本地文件上传到SFTP 服务器上的目录“ /data/ ”。如果您的配置正确,您的文件将被上传到“ /data/ ”目录。
put /path/to/file1/on/local1 /data/
put /path/to/file2/on/local /data/
1
2
现在使用以下命令 检查“ /data ”目录中的可用文件。
ls /data/
1
您将看到您的文件上传到 SFTP 服务器。
结论
恭喜!您已成功在 Linux 系统上配置 SFTP 服务器。这种类型的配置可以应用在大多数安装了 OpenSSH 的 Linux 系统上。此外,您还学习了如何为 SFTP 用户设置 chroot 目录并学习了基本的 sftp 客户端命令。