FTP 或文件传输协议是一种非常古老的知名协议,用于在客户端和服务器之间传输文件。它也是一个不安全的协议,仅在没有 TLS 的情况下使用。在本教程中,我们将为 TLS 配置 vsftpd,它允许我们安全地使用 FTP。如今,FTP 经常被更安全的协议所取代,例如 SFTP 或 SCP。
但是,如果您需要在服务器上使用 FTP,vsftpd(Very Secure FTP Daemon)是一个完美的选择。
在本教程中,我们将学习如何在基于 Ubuntu 20.04 的服务器上使用 vsftpd 安装和配置 FTP 服务器。我们还将学习如何使用 SSL/TLS 协议保护连接。
先决条件
- 具有 sudo 权限的非 root 用户的 Ubuntu 20.04 服务器。
第 1 步 - 安装 vsftpd
第一步是安装vsftpd。
$ sudo apt update
$ sudo apt install vsftpd
接下来,我们需要备份原始配置文件,以便我们可以从全新的配置开始。
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
步骤 2 - 配置防火墙
在这一步中,我们将配置 UFW 防火墙以允许访问 FTP 端口。
首先,让我们检查一下防火墙的状态。
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
我们可以看到,目前只允许使用 SSH 端口。当我们使用 TLS 时,让我们打开端口 20(FTP 命令端口)、21(FTP 数据端口)、990 以及我们将来可能需要的被动端口范围的端口 35000-40000。
$ sudo ufw allow 20:21/tcp
$ sudo ufw allow 990/tcp
$ sudo ufw allow 35000:40000/tcp
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
990/tcp ALLOW Anywhere
20:21/tcp ALLOW Anywhere
35000:40000/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
20:21/tcp (v6) ALLOW Anywhere (v6)
990/tcp (v6) ALLOW Anywhere (v6)
35000:40000/tcp (v6) ALLOW Anywhere (v6)
第 3 步 - 配置 vsftpd
我们现在将讨论一些重要的设置,以使 vsftpd 正常工作。
首先打开配置文件。
$ sudo nano /etc/vsftpd.conf
1. FTP 访问
在本教程中,我们将只允许本地用户访问 FTP,并禁用任何匿名访问。为此,请确保存在以下几行,如下所示。
anonymous_enable=NO
local_enable=YES
2. 启用文件上传
FTP 在这里最重要的唯一目的是能够写入服务器。取消注释以下行以通过删除#
前面的内容来启用文件上传。
write_enable=YES
3. chroot 监狱
当用户仅限于某个目录时,FTP 效果最佳。vsftpd 通过使用 chroot jails 实现了这一点。当为本地用户启用 chroot 时,默认情况下他们被限制在他们的主目录中。为此,请取消注释以下行。
chroot_local_user=YES
为防止任何安全漏洞,只要用户被限制为可写的目录,启用时 chroot 就不会工作。
为了解决这个限制,我们有两种方法可以在启用 chroot 时允许文件上传。
-
方法 1 - 此方法使用不同的目录进行 FTP 上传。在本教程中,我们将
ftp
在用户的家中创建一个目录作为 chroot 和upload
用于上传文件的第二个可写目录。为此,请在文件底部添加以下几行。user_sub_token=$USER local_root=/home/$USER/ftp
-
方法 2 - 第二种方法是简单地授予对整个主目录的可写访问权限。添加以下行以实现此目的。
allow_writeable_chroot=YES
4. 被动FTP
vsftpd 可以使用任何端口进行被动 FTP 连接。我们可以为 vsftpd 可以使用的最小和最大端口号指定一个范围。这些是我们之前在 UFW 防火墙中配置的端口。
添加以下行以允许被动 FTP 连接。
pasv_min_port=35000
pasv_max_port=40000
5. 限制用户
要只允许某些用户登录到 FTP 服务器,请在底部添加以下行。
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
启用此选项后,我们需要指定应允许哪些用户使用 FTP 并在/etc/vsftpd.userlist
文件中添加他们的用户名。
重新启动 vsftpd 以启用配置。
$ sudo systemctl restart vsftpd
步骤 4 - 配置用户目录
出于本教程的目的,我们将为 FTP 事务创建一个新用户帐户。如果您已经有一个用于此目的的用户帐户,则可以跳过步骤 1。另外,如果您之前allow_writeable_chroot=YES
在配置文件中设置过,则可以跳过步骤 3。
步骤 1 - 添加新用户。
$ sudo adduser testuser
设置一个强密码并跳过所有其他提示。
步骤 2 - 将用户添加到允许的 FTP 用户列表中。
$ echo "testuser" | sudo tee -a /etc/vsftpd.userlist
第 3 步 - 创建 FTP 和文件目录
这一步是如果你想要一个不同的目录作为 FTP 根目录和一个不同的目录来上传文件以绕过 chroot jail 限制。
创建 FTP 文件夹。
$ sudo mkdir /home/testuser/ftp
设置其所有权。
$ sudo chown nobody:nogroup /home/testuser/ftp
删除写入权限。
$ sudo chmod a-w /home/testuser/ftp
在继续之前验证权限。
$ sudo ls -al /home/testuser/ftp
total 8
dr-xr-xr-x 2 nobody nogroup 4096 Jun 7 13:08 .
drwxr-xr-x 3 testuser testuser 4096 Jun 7 13:08 ..
现在让我们为文件创建实际的可写目录。
$ sudo mkdir /home/testuser/ftp/upload
$ sudo chown testuser:testuser /home/testuser/ftp/upload
测试权限。
$ sudo ls -al /home/testuser/ftp
total 12
dr-xr-xr-x 3 nobody nogroup 4096 Jun 7 13:10 .
drwxr-xr-x 3 testuser testuser 4096 Jun 7 13:08 ..
drwxr-xr-x 2 testuser testuser 4096 Jun 7 13:10 upload
最后,让我们添加一个test.txt
用于测试的文件。
$ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt
第 5 步 - 测试 FTP 访问
我们的 FTP 服务器此时功能齐全。在继续之前,我们可以做一个小测试。
让我们尝试以匿名用户身份登录。
$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): anonymous
530 Permission denied.
ftp: Login failed.
ftp>
关闭连接。
ftp> bye
它按预期工作,即不允许匿名用户。
让我们尝试以任何其他 sudo 用户的身份进行连接。它也不应该连接。
$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>
关闭连接。
ftp> bye
最后让我们尝试以testuser
我们为 FTP 创建的方式进行连接。
$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): testuser
331 Please specify the password.
Password: your_user's_password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
让我们切换到upload
目录并使用get
命令将测试文件传输到我们的本地机器。
ftp> cd upload
250 Directory successfully changed.
ftp> get test.txt
227 Entering Passive Mode (136,244,105,99,165,42).
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (164.3719 kB/s)
ftp>
接下来,让我们使用put
命令以新名称上传文件以测试写入权限。
ftp> put test.txt upload.txt
227 Entering Passive Mode (136,244,105,99,163,102).
150 Ok to send data.
226 Transfer complete.
17 bytes sent in 0.000894 seconds (518.7988 kB/s)
关闭连接。
ftp> bye
步骤 6 - 使用 SSL/TLS 保护传输
为了加密 FTP 传输,我们需要一个 SSL 证书并配置 vsftpd 来使用它。
如果您已经有一个域或子域指向您的 FTP 服务器,您可以创建一个免费的 Let's Encrypt SSL 证书并使用它。
出于本教程的目的,我们将使用自签名 SSL 证书。要创建一个,请使用openssl
命令。
以下命令将创建一个 2048 位的私钥和一个有效期为 1 年的证书。证书和密钥都将保存到同一个文件中。
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
您可以跳过后面的提示或根据自己的喜好填写值。
现在我们的证书已经创建好了,是时候再次打开 vsftpd 配置文件了。
$ sudo nano /etc/vsftpd.conf
找到以下几行并通过在它们前面放置一个哈希来注释掉它们,如下所示。
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
现在,添加以下几行。
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
另外,将 的值更改ssl_enable
为YES
。
ssl_enable=YES
让我们添加更多设置以提高 SSL 安全性。
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
大多数这些设置是不言自明的。这些对匿名用户禁用 SSL,并要求 SSL 用于数据传输和登录。我们还禁用了不安全的 SSL 协议,并将坚持使用 TLSv1.0。最后,我们禁用了 SSL 的重用,并要求使用高加密密码套件。
重启服务器使设置生效。
$ sudo systemctl restart vsftpd
现在,您将无法通过命令行使用 FTP。您将需要使用支持 TLS 的客户端进行连接。
第 7 步 - 使用 FileZilla 测试 TLS
在我们的教程中,我们将使用 Filezilla 测试 TLS 功能。
当您打开 Filezilla 时,单击顶行单词Host正上方的站点管理器图标。
将打开一个新窗口。单击右下角的“新建站点”按钮。
您将看到一个名为New site的新图标。您可以使用重命名按钮重命名它。
使用您服务器的 IP 地址填写主机字段。由于我们的 FTP 端口是 21,这是 FTP 的默认端口,因此您可以将端口字段留空。对于加密选项,从下拉菜单中选择需要显式 FTP over TLS。
使用我们在上面创建的用户名和密码填写您的 FTP 用户名和密码。单击“连接”按钮继续。
成功连接后,您将看到如下所示的服务器证书。
您可以选中在以后的会话中始终信任此证书选项。这样您就不会在每次登录时都被询问。单击“确定”继续。
您现在可以执行正常的 FTP 操作。
步骤 8 - 禁用外壳访问
这一步完全是可选的。默认情况下,在创建 FTP 用户时,如果未明确指定,该用户将具有对服务器的 SSH 访问权限。
您应该禁用对 FTP 用户的 shell 访问以提高安全性。要禁用它,我们需要创建一个新的 shell,它将打印一条消息,指出用户帐户仅限于 FTP 访问。
创建/bin/ftponly
外壳并使其可执行。
$ echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a /bin/ftponly
$ sudo chmod a+x /bin/ftponly
将新 shell 附加到/etc/shells
文件中的有效 shell 列表中。
$ echo "/bin/ftponly" | sudo tee -a /etc/shells
将用户外壳更改为/bin/ftponly
.
$ sudo usermod newftpuser -s /bin/ftponly
您可以使用相同的命令更改要授予 FTP 访问权限的所有用户的外壳。
结论
我们的教程到此结束,我们安装和配置 vsftpd 以在基于 Ubuntu 20.04 的服务器上安装 FTP 服务器。我们还将 FTP 连接配置为使用 SSL/TLS 工作。