SFTP(SSH File Transfer Protocol)是一种在两台或多台计算机之间安全传输数据的方法。它是在SSH协议之上运行的FTP,利用了SSH的安全性,并完全支持其身份验证机制。

如今,推荐使用SFTP来替代传统的FTP或FTP/S协议。SFTP默认就是安全的,因为这就是SSH的工作方式。从安全角度来看,SFTP还能保护你免受密码嗅探和中间人攻击(MiTM)的威胁。

与SSH一样,SFTP使用加密和加密哈希函数来保护数据完整性。它还支持多种安全身份验证方法,包括密码认证和密钥认证。此外,它减少了服务器对外开放的端口数量,因为它运行在与SSH协议相同的端口上。

前提条件

在本指南中,你将学习如何在Linux系统上搭建SFTP服务器,以及sftp客户端的基本命令。

以下是实现所需的当前环境:

  • 一台Linux服务器 - 可以使用Debian、Ubuntu、CentOS、Fedora、Rocky或任何其他Linux发行版。
  • 确保你的Linux系统上已安装OpenSSH软件包。
  • SFTP客户端 - sftp命令行工具或你偏好的任何GUI客户端。

验证OpenSSH软件包

要搭建SFTP服务器,Linux系统上必须安装OpenSSH软件包。几乎所有Linux发行版服务器都默认安装了OpenSSH。但如果你系统上没有OpenSSH,可以从官方仓库安装。

1. 要确认OpenSSH软件包是否已安装在你的Linux系统上,请使用以下命令。

对于Debian或Ubuntu服务器,可以使用以下dpkg命令。

dpkg -l | grep ssh

以下是我们的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

第一列的"ii"表示软件包已安装。在Debian/Ubuntu系统上已安装"openssh-sftp-server"软件包。

RHEL/CentOS/Fedora/Rocky Linux/AlmaLinux用户可以使用以下rpm命令。

rpm -qa | grep ssh

创建用户组和用户

在这一步中,你将为SFTP服务器创建一个新的用户组和用户。属于该用户组的用户将被允许访问SFTP服务器。出于安全考虑,SFTP用户不能访问SSH服务,他们只能访问SFTP服务器。

1. 执行以下命令创建一个新的用户组"sftpgroup"。

sudo groupadd sftpgroup

2. 使用以下命令创建一个新用户"sftpuser"。

sudo useradd -G sftpgroup -d /srv/sftpuser -s /sbin/nologin sftpuser

详细参数说明:

  • -G:自动将用户添加到"sftpgroup"。
  • -d:指定新用户的家目录。
  • -s:将新用户的默认shell设置为"/sbin/nologin",这意味着该用户不能访问SSH服务器。

3. 接下来,使用以下命令为用户"sftpuser"创建密码。

passwd sftpuser

输入你的强密码并重复输入,然后按"Enter"确认。

创建SFTP用户和用户组

要添加更多用户,重复步骤2和3,最重要的是,所有SFTP用户都必须在"sftpgroup"用户组中,且不能通过SSH获得shell访问权限。

配置Chroot Jail目录

创建新用户组和用户后,必须为SFTP用户创建和配置chroot目录。

1. 对于用户"sftpuser",新的家目录将位于"/srv/sftpuser"。执行以下命令来创建它。

mkdir -p /srv/sftpuser

2. 要为用户"sftpuser"设置chroot,必须将目录的所有权更改为root用户,但允许用户组读取和执行而不允许写入。

使用以下命令将目录的所有权更改为root用户。

sudo chown root /srv/sftpuser

赋予用户组读取和执行权限,但不允许写入。

sudo chmod g+rx /srv/sftpuser

3. 接下来,在"/srv/sftpuser"目录内创建一个新的"data"目录,并将该"data"目录的所有权更改为用户"sftpuser"。

mkdir -p /srv/sftpuser/data  
chown sftpuser:sftpuser /srv/sftpuser/data

配置SFTP用户上传目录和Chroot Jail

到目前为止,以下是SFTP用户目录的配置详情:

  • 目录"/srv/sftpuser"是默认的家目录。
  • 用户"sftpuser"不能写入"/srv/sftpuser"目录,但可以在该目录中读取内容。
  • 用户"sftpuser"可以将文件上传到SFTP服务器的"/srv/sftpuser/data"目录。

在SSH服务器上启用SFTP

要在OpenSSH上启用SFTP服务器,必须编辑SSH配置文件"/etc/ssh/sshd_config"。

1. 使用nano或vim编辑SSH配置文件"/etc/ssh/sshd_config"。

sudo nano /etc/ssh/sshd_config

2. 注释掉以下配置以禁用独立的"sftp-server"功能。

#Subsystem      sftp    /usr/lib/openssh/sftp-server

3. 将以下配置粘贴到文件末尾。

Subsystem sftp internal-sftp  
  
Match Group sftpgroup  
     ChrootDirectory %h  
     X11Forwarding no  
     AllowTCPForwarding no  
     ForceCommand internal-sftp

保存配置并退出。

详细配置说明:

  • 我们使用"internal-sftp"替代子进程"sftp-server"。
  • SFTP服务器为"sftpgroup"用户组启用。

4. 要应用新配置,使用以下命令重启SSH服务。

sudo systemctl restart sshd

SFTP服务器已准备就绪并可访问,它运行在与SSH服务相同的端口上。

访问SFTP服务器

在客户端,我们将使用sftp命令行工具,它在大多数Linux发行版中默认安装。但你也可以使用其他命令行客户端或GUI FTP客户端,如FileZillaCyberduck等。

1. 要连接到SFTP服务器,执行如下sftp命令。

sftp sftpuser@SERVER-IP

如果你的SFTP和/或SSH服务器运行在自定义端口上,可以使用如下sftp命令。

sftp -P PORT sftpuser@SERVER-IP

输入"sftpuser"的密码。

2. 连接到SFTP服务器后,执行以下命令。

显示当前工作路径并列出所有可用的文件和目录。

pwd  
ls

使用sftp命令连接到SFTP服务器

3. 将本地文件上传到SFTP服务器的"/"目录,这会导致"permission denied"(权限拒绝),因为它是chroot目录。

put /path/to/file/on/local /

4. 将本地文件上传到SFTP服务器的"/data/"目录。如果你的配置正确,你的文件将成功上传到"/data/"目录。

put /path/to/file1/on/local1 /data/  
put /path/to/file2/on/local /data/

验证SFTP服务器的读写权限

5. 现在使用以下命令查看"/data"目录中的可用文件。

ls /data/

你将看到上传到SFTP服务器的文件。

列出SFTP服务器上的所有文件

总结

恭喜!你已经成功在Linux系统上配置了SFTP服务器。这种类型的配置可以应用于大多数安装了OpenSSH的Linux系统。此外,你还学习了如何为SFTP用户设置chroot目录,以及学习了基本的sftp客户端命令。