介绍
FTP,文件传输协议的简称,是一种广泛用于在客户端和服务器之间移动文件的网络协议。 它已经被更快,更安全,更方便的传递文件的方式所取代。 许多休闲网民希望从他们的网络浏览器直接下载https
,和命令行用户更有可能使用的安全协议,如
scp
或
SFTP 。 FTP仍然用于支持具有非常具体需求的传统应用程序和工作流程。如果您可以选择使用什么协议,请考虑探索更现代的选项。当你需要FTP时,vsftpd是一个很好的选择。 vsftpd针对安全性,性能和稳定性进行了优化,针对其他FTP服务器中发现的许多安全问题提供了强有力的保护,是许多Linux发行版的默认设置。 在本教程中,我们将向您展示如何配置vsftpd,以允许用户使用具有SSL / TLS保护的登录凭据的FTP将文件上传到其主目录。
先决条件
要遵循本教程,您将需要:- 一个Ubuntu 16.04服务器与非root用户
sudo
权限 :您可以了解更多关于如何建立一个用户利用这些权限在我们与Ubuntu 16.04的初始服务器安装指南。
第1步 - 安装vsftpd
我们将从更新我们的软件包列表和安装vsftpd守护进程开始:sudo apt-get update
sudo apt-get install vsftpd
安装完成后,我们将复制配置文件,以便开始使用空配置,将原始文件保存为备份。
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
通过配置的备份,我们准备好配置防火墙。
第2步 - 打开防火墙
我们将检查防火墙状态,看看是否已启用。如果是这样,我们将确保允许FTP流量,这样您就不会遇到防火墙规则在测试时阻塞您。sudo ufw status
在这种情况下,只允许SSH通过:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
您可能有其他规则或没有防火墙规则。由于只有
ssh
通信在这种情况下允许的,我们需要添加规则FTP流量。 我们需要为FTP打开端口20和21,为以后启用TLS时打开端口990,对于我们计划在配置文件中设置的被动端口范围,打开端口40000-50000:
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw status
现在我们的防火墙规则看起来像:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
990/tcp ALLOW Anywhere
20/tcp ALLOW Anywhere
21/tcp ALLOW Anywhere
40000:50000/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
20/tcp (v6) ALLOW Anywhere (v6)
21/tcp (v6) ALLOW Anywhere (v6)
990/tcp (v6) ALLOW Anywhere (v6)
40000:50000/tcp (v6) ALLOW Anywhere (v6)
随着
vsftpd
安装和必要的端口开放,我们已经准备好进行下一个步骤。
第3步 - 准备用户目录
在本教程中,我们将创建一个用户,但您可能已经有一个需要FTP访问的用户。我们会在随后的说明中保留现有用户对其数据的访问权限。即使如此,我们建议您先开始使用新用户,直到您配置并测试了您的设置。 首先,我们将添加一个测试用户:sudo adduser sammy
在出现提示时分配密码,随时可以通过其他提示按“ENTER”。 FTP通常是更安全的,当用户被限制到特定的目录中。
vsftpd
完成这一用
chroot
监狱。 当
chroot
为本地用户启用,他们被限制在默认情况下,他们的主目录。 然而,因为这样的
vsftpd
固定的目录中,它不能由用户写入。这对于只应通过FTP连接的新用户来说是正常的,但是如果现有用户也可以通过shell访问,则可能需要写入其主文件夹。 在这个例子中,而不是从主目录中删除写入权限,我们将创建一个
ftp
目录作为
chroot
和可写
files
目录来存放实际文件。 创建
ftp
文件夹,设置它的所有权,并且一定要取出用下面的命令写权限:
sudo mkdir /home/sammy/ftp
sudo chown nobody:nogroup /home/sammy/ftp
sudo chmod a-w /home/sammy/ftp
让我们验证权限:
sudo ls -la /home/sammy/ftp
Outputtotal 8
4 dr-xr-xr-x 2 nobody nogroup 4096 Aug 24 21:29 .
4 drwxr-xr-x 3 sammy sammy 4096 Aug 24 21:29 ..
接下来,我们将创建可上传文件的目录,并将所有权分配给用户:
sudo mkdir /home/sammy/ftp/files
sudo chown sammy:sammy /home/sammy/ftp/files
权限检查在
files
目录应该返回如下:
sudo ls -la /home/sammy/ftp
Outputtotal 12
dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 .
drwxr-xr-x 3 sammy sammy 4096 Aug 26 13:59 ..
drwxr-xr-x 2 sammy sammy 4096 Aug 26 14:01 files
最后,我们将添加一个
test.txt
文件时,我们测试以后使用:
echo "vsftpd test file" | sudo tee /home/sammy/ftp/files/test.txt
现在,我们已经确保了
ftp
目录,并允许该用户访问
files
目录,我们将我们的注意力转向配置。
第4步 - 配置FTP访问
我们计划允许具有本地shell帐户的单个用户与FTP连接。这两个关键的设置中已经设置vsftpd.conf
。首先打开配置文件,验证配置中的设置是否与下面的设置匹配:
sudo nano /etc/vsftpd.conf
/etc/vsftpd.conf
. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .
接下来,我们需要更改文件中的一些值。为了让用户上传文件,我们将取消对
write_enable
使我们的设置:
/etc/vsftpd.conf
. . .
write_enable=YES
. . .
我们还将取消注释chroot,以防止FTP连接的用户访问目录树外部的任何文件或命令。
/etc/vsftpd.conf
. . .
chroot_local_user=YES
. . .
我们将添加一个
user_sub_token
,以便插入用户名在我们
local_root directory
路径,以便我们的配置将为该用户,并可能被添加任何未来的用户。
/etc/vsftpd.conf
user_sub_token=$USER
local_root=/home/$USER/ftp
我们将限制可用于被动FTP的端口范围,以确保有足够的连接可用:
/etc/vsftpd.conf
pasv_min_port=40000
pasv_max_port=50000
注意:我们预先打开,我们在这里设置为被动端口范围的端口。
如果更改值,请务必更新防火墙设置。 由于我们只打算根据具体情况允许FTP访问,因此我们将设置配置,以便只有在用户被明确添加到列表而不是默认情况下才能访问该用户。
/etc/vsftpd.conf
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
userlist_deny
切换的逻辑。当设置为“YES”时,列表上的用户被拒绝FTP访问。当它设置为“NO”时,只有列表上的用户被允许访问。完成更改后,保存并退出文件。 最后,我们将创建并添加我们的用户到文件。我们将使用
-a
标志追加到文件:
echo "sammy" | sudo tee -a /etc/vsftpd.userlist
请仔细检查是否已按预期添加:
cat /etc/vsftpd.userlist
Outputsammy
重新启动守护程序以加载配置更改:
sudo systemctl restart vsftpd
现在我们准备测试了。
第5步 - 测试FTP访问
我们已经将服务器配置为只允许用户sammy
通过FTP连接。让我们确保是这样的情况。
匿名用户应该无法连接 :我们禁用匿名访问。在这里,我们将通过尝试匿名连接来测试。如果我们正确无误,则应拒绝匿名用户的权限:
ftp -p 203.0.113.0
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): anonymous
530 Permission denied.
ftp: Login failed.
ftp>
关闭连接:
bye
比其他用户sammy
应连接失败 :下一步,我们将尝试连接作为我们
sudo
用户。他们也应该被拒绝访问,并且应该在他们被允许输入他们的密码之前发生。
ftp -p 203.0.113.0
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>
关闭连接:
bye
sammy
应该能够连接,以及读取和写入文件 :在这里,我们将确保我们的指定用户
可以连接:
ftp -p 203.0.113.0
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
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>
我们将换入
files
目录下,然后使用
get
命令传输我们前面创建我们本地机器的测试文件:
cd files
get test.txt
Output227 Entering Passive Mode (203,0,113,0,169,12).
150 Opening BINARY mode data connection for test.txt (16 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (1588 bytes/s)
ftp>
我们会向右转,尝试使用新名称上传文件以测试写入权限:
put test.txt upload.txt
Output227 Entering Passive Mode (203,0,113,0,164,71).
150 Ok to send data.
226 Transfer complete.
16 bytes sent in 0.000894 seconds (17897 bytes/s)
关闭连接:
bye
现在我们已经测试了我们的配置,我们将采取措施进一步保护我们的服务器。
第6步 - 保护交易
由于FTP 不加密在传输过程中的任何数据,包括用户凭据,我们将启用TTL / SSL来提供加密。第一步是创建与vsftpd一起使用的SSL证书。 我们将使用openssl
创建一个新的证书,并使用
-days
标志,使其有效期为一年。 在同一个命令中,我们将添加一个私有的2048位RSA密钥。 然后,通过两个设置
-keyout
和
-out
标志为相同的值,私有密钥和证书将位于同一文件中。 我们将使用以下命令:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
系统将提示您提供证书的地址信息。将您自己的信息替换为以下问题:
OutputGenerating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:NY
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
有关证书标志的更多详细信息,请参阅
OpenSSL的要领:用SSL证书,私钥和CSR的工作 一旦你创建了证书,打开
vsftpd
重新配置文件:
sudo nano /etc/vsftpd.conf
向文件的底部,你应该两行打头
rsa_
。评论他们,使他们看起来像:
/etc/vsftpd.conf
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
在它们下面,添加以下行,它们指向我们刚刚创建的证书和私钥:
/etc/vsftpd.conf
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
之后,我们将强制使用SSL,这将阻止不能处理TLS的客户端连接。这是必要的,以确保所有流量都加密,但可能会强制您的FTP用户更改客户端。更改
ssl_enable
为
YES
:
/etc/vsftpd.conf
ssl_enable=YES
之后,添加以下行以显式拒绝通过SSL的匿名连接,并要求数据传输和登录时使用SSL:
/etc/vsftpd.conf
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
之后,我们将配置服务器使用TLS,SSL的首选后继,通过添加以下行:
/etc/vsftpd.conf
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
最后,我们将添加两个选项。首先,我们不需要SSL重用,因为它可以打破许多FTP客户端。我们将需要“高”加密密码套件,目前这意味着密钥长度等于或大于128位:
/etc/vsftpd.conf
require_ssl_reuse=NO
ssl_ciphers=HIGH
完成后,保存并关闭文件。 现在,我们需要重新启动服务器以使更改生效:
sudo systemctl restart vsftpd
在这一点上,我们将不再能够与不安全的命令行客户端连接。如果我们尝试,我们会看到:
ftp -p 203.0.113.0
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
421 Service not available, remote server has closed connection
ftp>
接下来,我们将验证我们是否可以使用支持TLS的客户端进行连接。
第7步 - 使用FileZilla测试TLS
大多数现代FTP客户端可以配置为使用TLS加密。我们将演示如何使用FileZilla连接,因为它的跨平台支持。请参阅其他客户端的文档。 当您第一次打开FileZilla时,找到站点管理器图标就在文件下面,最上面一行的最左边的图标。点击它: 将打开一个新窗口。点击右下角的“新网站”按钮: 在“我的网站”下,会显示一个带有“新网站”字样的新图标。您可以立即命名或稍后返回并使用重命名按钮。 您必须使用名称或IP地址填写“主机”字段。在“加密”下拉菜单中,选择“需要通过TLS的显式FTP”。 对于“登录类型”,选择“请求密码”。填写在“用户”字段中创建的FTP用户: 单击界面底部的“连接”。系统将要求您输入用户密码: 点击“确定”连接。您现在应该使用TLS / SSL加密连接到您的服务器。 当你接受了证书,双击该files
夹并拖动upload.txt向左,以确认你能下载文件。
完成后,右键单击本地副本,将其重命名为upload-tls.txt`并将其拖回到服务器以确认您可以上传文件。
您现在已确认可以安全且成功地传输启用了SSL / TLS的文件。
第8步 - 禁用Shell访问(可选)
如果由于客户端要求而无法使用TLS,则可以通过禁用FTP用户以任何其他方式登录的能力来获得一些安全性。一种相对直接的方法来防止它是通过创建一个自定义shell。这不会提供任何加密,但它会限制受损帐户对FTP可访问文件的访问。 首先,打开一个名为ftponly
bin目录:
sudo nano /bin/ftponly
我们会添加一条消息,告诉用户他们无法登录的原因。请粘贴以下内容:
#!/bin/sh
echo "This account is limited to FTP access only."
更改使文件可执行的权限:
sudo chmod a+x /bin/ftponly
打开有效shell的列表:
sudo nano /etc/shells
在底部,添加:
/ etc / shells
. . .
/bin/ftponly
使用以下命令更新用户的shell:
sudo usermod sammy -s /bin/ftponly
现在尝试以sammy登录:
ssh sammy@203.0.113.0
你应该会看到:
OutputThis account is limited to FTP access only.
Connection to 203.0.113.0 closed.
这证实了用户无法再
ssh
到服务器,仅限于FTP访问。