如何在 Ubuntu 18.04 上为用户目录设置 vsftpd 您所在的位置:网站首页 linux密码修改成功但提示认证失败 如何在 Ubuntu 18.04 上为用户目录设置 vsftpd

如何在 Ubuntu 18.04 上为用户目录设置 vsftpd

2023-03-23 09:10| 来源: 网络整理| 查看: 265

介绍

FTP是文件传输协议的缩写,是一种网络协议,曾经被广泛用于在客户端和服务器之间移动文件。此后,它已被更快、更安全、更方便的文件传递方式所取代。许多普通的 Internet 用户希望通过 https 直接从他们的 Web 浏览器下载,命令行用户更有可能使用安全协议,例如 scp 或 [SFTP](https://www.digitalocean.com/ community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server)。

FTP 仍用于支持具有非常特殊需求的遗留应用程序和工作流。如果您可以选择使用哪种协议,请考虑探索更现代的选项。但是,当您确实需要 FTP 时,vsftpd 是一个很好的选择。 vsftpd 针对安全性、性能和稳定性进行了优化,针对其他 FTP 服务器中发现的许多安全问题提供了强大的保护,并且是许多 Linux 发行版的默认设置。

在本教程中,您将配置 vsftpd 以允许用户使用由 SSL/TLS 保护的登录凭据使用 FTP 将文件上传到他或她的主目录。

先决条件

要学习本教程,您需要:

一个 Ubuntu 18.04 服务器和一个具有 sudo 权限的非 root 用户:您可以在我们的 [使用 Ubuntu 18.04 的初始服务器设置](https://www .digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04)指南。 步骤 1 — 安装 vsftpd

让我们首先更新我们的包列表并安装 vsftpd 守护进程:

sudo apt 更新 sudo apt install vsftpd

安装完成后,让我们复制配置文件,这样我们就可以从空白配置开始,将原始配置保存为备份:

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

备份配置后,我们就可以配置防火墙了。

步骤 2 — 打开防火墙

让我们检查防火墙状态以查看它是否已启用。如果是,我们将确保允许 FTP 流量,这样防火墙规则就不会阻止我们的测试。

检查防火墙状态:

须藤 ufw 状态

在这种情况下,只允许通过 SSH:

输出状态:活动 采取行动 -- ------ ---- OpenSSH 允许任何地方 OpenSSH (v6) 允许在任何地方 (v6)

您可能有其他规则或根本没有防火墙规则。由于在这种情况下只允许 SSH 流量,我们需要为 FTP 流量添加规则。

让我们为 FTP 打开端口“20”和“21”,为启用 TLS 时打开端口“990”,为我们计划在配置文件中设置的被动端口范围打开端口“40000-50000”:

sudo ufw 允许 20/tcp sudo ufw 允许 21/tcp sudo ufw 允许 990/tcp sudo ufw 允许 40000:50000/tcp 须藤 ufw 状态

我们的防火墙规则现在应该如下所示:

输出状态:活动 采取行动 -- ------ ---- OpenSSH 允许任何地方 990/tcp 允许任何地方 20/tcp 允许任何地方 21/tcp 允许任何地方 40000:50000/tcp 允许任何地方 OpenSSH (v6) 允许在任何地方 (v6) 20/tcp (v6) 允许任何地方 (v6) 21/tcp (v6) 允许在任何地方 (v6) 990/tcp (v6) 允许在任何地方 (v6) 40000:50000/tcp (v6) 允许在任何地方 (v6)

安装了 vsftpd 并打开了必要的端口,让我们继续创建一个专用的 FTP 用户。

步骤 3 — 准备用户目录

我们将创建一个专用的 FTP 用户,但您可能已经有一个需要 FTP 访问的用户。我们将在以下说明中注意保留现有用户对其数据的访问权限。即便如此,我们建议您在配置和测试设置之前从新用户开始。

首先,添加一个测试用户:

sudo adduser sammy

出现提示时分配密码。在其他提示中随意按“ENTER”。

当用户被限制在特定目录时,FTP 通常更安全。 vsftpd 使用 [chroot](https://www.digitalocean.com/community/tutorials/how-to-configure-chroot-environments-for-testing-on-an-ubuntu-12-04- vps#what-is-a-chroot-environment) 监狱。当为本地用户启用 chroot 时,默认情况下他们被限制在他们的主目录中。然而,由于 vsftpd 保护目录的方式,它不能被用户写入。这对于应该只通过 FTP 连接的新用户来说很好,但如果现有用户也有 shell 访问权限,他们可能需要写入他们的主文件夹。

在这个例子中,我们不是从主目录中删除写权限,而是创建一个 ftp 目录作为 chroot 和一个可写的 files 目录来保存实际文件。

创建“ftp”文件夹:

sudo mkdir /home/sammy/ftp

设置其所有权:

sudo chown 没有人:nogroup /home/sammy/ftp

删除写权限:

sudo chmod a-w /home/sammy/ftp

验证权限:

sudo ls -la /home/sammy/ftp 输出总数 8 4 dr-xr-xr-x 2 没有人 nogroup 4096 8 月 24 日 21:29。 4 drwxr-xr-x 3 萨米萨米 4096 年 8 月 24 日 21:29 ..

接下来,让我们为文件上传创建目录并将所有权分配给用户:

sudo mkdir /home/sammy/ftp/files sudo chown sammy:sammy /home/sammy/ftp/files

对 ftp 目录的权限检查应返回以下内容:

sudo ls -la /home/sammy/ftp 输出总数 12 dr-xr-xr-x 3 没有人 nogroup 4096 8 月 26 日 14:01。 drwxr-xr-x 3 sammy sammy 4096 8 月 26 日 13:59 .. drwxr-xr-x 2 sammy sammy 4096 8 月 26 日 14:01 文件

最后,让我们添加一个 test.txt 文件以供我们测试时使用:

echo "vsftpd 测试文件" | sudo tee /home/sammy/ftp/files/test.txt

现在我们已经保护了ftp目录并允许用户访问files目录,让我们修改我们的配置。

步骤 4 — 配置 FTP 访问

我们计划允许具有本地 shell 帐户的单个用户连接 FTP。 vsftpd.conf 中已经设置了这两个关键设置。首先打开配置文件以验证配置中的设置是否与以下设置匹配:

苏多纳/等/vsftpd。 conf

/etc/vsftpd.conf

. . . # 允许匿名 FTP? (默认禁用)。 匿名启用u003d否 # # 取消注释以允许本地用户登录。 local_enableu003dYES . . .

接下来,让我们通过取消注释 write_enable 设置来允许用户上传文件:

/etc/vsftpd.conf

. . . write_enableu003dYES . . .

我们还将取消注释 chroot 以防止 FTP 连接的用户访问目录树之外的任何文件或命令:

/etc/vsftpd.conf

. . . chroot_local_useru003dYES . . .

让我们还添加一个 user_sub_token 以将用户名插入到我们的 local_root directory 路径中,这样我们的配置将适用于该用户和任何其他未来用户。在文件中的任意位置添加这些设置:

/etc/vsftpd.conf

. . . user_sub_tokenu003d$USER local_rootu003d/home/$USER/ftp

我们还要限制可用于被动 FTP 的端口范围,以确保有足够的连接可用:

/etc/vsftpd.conf

. . . pasv_min_portu003d40000 pasv_max_portu003d50000

注意: 在第 2 步中,我们打开了我们在此处为被动端口范围设置的端口。如果您更改这些值,请务必更新您的防火墙设置。

为了根据具体情况允许 FTP 访问,让我们设置配置,以便用户只有在显式添加到列表时才能访问,而不是默认情况下:

/etc/vsftpd.conf

. . . userlist_enableu003dYES userlist_fileu003d/etc/vsftpd.userlist userlist_denyu003d否

userlist_deny 切换逻辑:当它设置为 YES 时,列表中的用户将被拒绝 FTP 访问。当它设置为“NO”时,只允许列表中的用户访问。

完成更改后,保存文件并退出编辑器。

最后,让我们将我们的用户添加到/etc/vsftpd.userlist。使用 -a 标志附加到文件:

回声“萨米” | sudo tee -a /etc/vsftpd.userlist

检查它是否按预期添加:

猫 /etc/vsftpd.userlist 输出萨米

重新启动守护程序以加载配置更改:

sudo systemctl 重启 vsftpd

配置到位后,让我们继续测试 FTP 访问。

步骤 5 — 测试 FTP 访问

我们已将服务器配置为仅允许用户 sammy 通过 FTP 连接。让我们确保它按预期工作。

匿名用户应该无法连接:我们已禁用匿名访问。让我们通过尝试匿名连接来测试它。如果我们的配置设置正确,匿名用户应该被拒绝权限。打开另一个终端窗口并运行以下命令。请务必将 203.0.113.0 替换为您服务器的公共 IP 地址:

ftp -p 203.0.113.0 输出连接到 203.0.113.0。 220 (vsFTPd 3.0.3) 名称(203.0.113.0:默认):匿名 530 权限被拒绝。 ftp:登录失败。 FTP>

关闭连接:

再见

** sammy 以外的用户应该无法连接**:接下来,让我们尝试以我们的 sudo 用户身份连接。他们也应该被拒绝访问,并且应该在他们被允许输入密码之前发生:

ftp -p 203.0.113.0 输出连接到 203.0.113.0。 220 (vsFTPd 3.0.3) 名称(203.0.113.0:默认):sudo_user 530 权限被拒绝。 ftp:登录失败。 FTP>

关闭连接:

再见

用户 sammy 应该能够连接、读取和写入文件:让我们确保我们指定的用户可以连接:

ftp -p 203.0.113.0 输出连接到 203.0.113.0。 220 (vsFTPd 3.0.3) 名称(203.0.113.0:默认):萨米 331 请指定密码。 密码:your_user's_password 230 登录成功。 远程系统类型是 UNIX。 使用二进制模式传输文件。 FTP>

让我们切换到 files 目录并使用 get 命令将我们之前创建的测试文件传输到本地机器:

光盘文件 获取 test.txt 输出 227 进入被动模式 (203,0,113,0,169,12)。 150 打开 test.txt(16 字节)的 BINARY 模式数据连接。 226 传输完成。 在 0.0101 秒内收到 16 个字节(1588 字节/秒) FTP>

接下来,让我们使用新名称上传文件以测试写入权限:

把test.txt上传.txt 输出 227 进入被动模式 (203,0,113,0,164,71)。 150 确定发送数据。 226 传输完成。 16 字节在 0.000894 秒内发送(17897 字节/秒)

关闭连接:

再见

现在我们已经测试了我们的配置,让我们采取措施进一步保护我们的服务器。

第 6 步 — 保护交易

由于 FTP 不 加密传输中的任何数据,包括用户凭据,我们将启用 TLS/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

系统将提示您提供证书的地址信息。用您自己的信息替换下面突出显示的值:

输出生成 2048 位 RSA 私钥 ..................................................... ......................+++ ......+++ 将新的私钥写入“/etc/ssl/private/vsftpd.pem” ----- 您将被要求输入将被合并的信息 进入您的证书请求。 您将要输入的是所谓的专有名称或 DN。 有很多字段,但你可以留一些空白 对于某些字段会有一个默认值, 如果输入“.”,该字段将留空。 ----- 国家名称(2 个字母代码)[AU]:US 州或省名称(全名)[Some-State]:NY 地区名称(例如,城市)[]:纽约市 组织名称(例如,公司)[Internet Widgits Pty Ltd]:DigitalOcean 组织单位名称(例如,部分)[]: 通用名称(例如服务器 FQDN 或您的姓名)[]:your_server_ip 电子邮件地址 []:

有关证书标志的更多详细信息,请参阅 [OpenSSL Essentials:使用 SSL 证书、私钥和 CSR](https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates -私钥和csrs)

创建证书后,再次打开“vsftpd”配置文件:

苏多纳/等/vsftpd。 conf

在文件的底部,您将看到以 rsa_ 开头的两行。将它们注释掉,使它们看起来像这样:

/etc/vsftpd.conf

. . . # rsa_cert_fileu003d/etc/ssl/certs/ssl-cert-snakeoil.pem # rsa_private_key_fileu003d/etc/ssl/private/ssl-cert-snakeoil.key . . .

在它们下面,添加以下行,指向我们刚刚创建的证书和私钥:

/etc/vsftpd.conf

. . . rsa_cert_fileu003d/etc/ssl/private/vsftpd.pem rsa_private_key_fileu003d/etc/ssl/private/vsftpd.pem . . .

之后,我们将强制使用 SSL,这将阻止无法处理 TLS 的客户端连接。这对于确保所有流量都被加密是必要的,但它可能会迫使您的 FTP 用户更改客户端。将 ssl_enable 更改为 YES:

/etc/vsftpd.conf

. . . ssl_enableu003d是 . . .

之后,添加以下行以明确拒绝通过 SSL 的匿名连接,并要求 SSL 用于数据传输和登录:

/etc/vsftpd.conf

. . . allow_anon_sslu003d否 force_local_data_sslu003dYES force_local_logins_sslu003dYES . . .

在此之后,通过添加以下行将服务器配置为使用 TLS(SSL 的首选后继者):

/etc/vsftpd.conf

. . . ssl_tlsv1u003d是 ssl_sslv2u003d否 ssl_sslv3u003d否 . . .

最后,我们将添加另外两个选项。首先,我们不需要 SSL 重用,因为它会破坏许多 FTP 客户端。我们将需要“高”加密密码套件,这目前意味着密钥长度等于或大于 128 位:

/etc/vsftpd.conf

. . . require_ssl_reuseu003d否 ssl_ciphersu003d高 . . .

完成的文件部分应如下所示:

/etc/vsftpd.conf

# 此选项指定用于 SSL 的 RSA 证书的位置 # 加密连接。 #rsa_cert_fileu003d/etc/ssl/certs/ssl-cert-snakeoil.pem #rsa_private_key_fileu003d/etc/ssl/private/ssl-cert-snakeoil.key rsa_cert_fileu003d/etc/ssl/private/vsftpd.pem rsa_private_key_fileu003d/etc/ssl/private/vsftpd.pem ssl_enableu003d是 allow_anon_sslu003d否 force_local_data_sslu003dYES force_local_logins_sslu003dYES ssl_tlsv1u003d是 ssl_sslv2u003d否 ssl_sslv3u003d否 require_ssl_reuseu003d否 ssl_ciphersu003d高

完成后,保存并关闭文件。

重新启动服务器以使更改生效:

sudo systemctl 重启 vsftpd

此时,我们将无法连接不安全的命令行客户端。如果我们尝试,我们会看到如下内容:

输出ftp -p 203.0.113.0 连接到 203.0.113.0。 220 (vsFTPd 3.0.3) 名称(203.0.113.0:默认):萨米 530 非匿名会话必须使用加密。 ftp:登录失败。 421 服务不可用,远程服务器已关闭连接 FTP>

接下来,让我们验证我们是否可以使用支持 TLS 的客户端进行连接。

第 7 步 — 使用 FileZilla 测试 TLS

大多数现代 FTP 客户端都可以配置为使用 TLS 加密。我们将演示如何与 FileZilla 连接,因为它具有跨平台支持。查阅其他客户端的文档。

当您第一次打开 FileZilla 时,在 Host 字样上方找到站点管理器图标,即顶行最左侧的图标。点击它:

站点管理员截图

将打开一个新窗口。点击右下角的 New Site 按钮:

新建站点按钮 在我的站点下一个新的图标新站点将出现。您可以现在命名或稍后返回并使用 Rename 按钮。

使用名称或 IP 地址填写 Host 字段。在 Encryption 下拉菜单下,选择 Require explicit FTP over TLS。

对于登录类型,选择询问密码。在 User 字段中填写您的 FTP 用户:

通用设置选项卡

点击界面底部的连接。您将被要求输入用户密码:

密码对话

点击 OK 进行连接。您现在应该使用 TLS/SSL 加密与您的服务器连接。

成功后,您将看到如下所示的服务器证书:

站点证书对话

接受证书后,双击 files 文件夹并将 upload.txt 拖到左侧以确认您可以下载文件:

下载test.txt

完成后,右键单击本地副本,将其重命名为 upload-tls.txt 并将其拖回服务器以确认您可以上传文件:

重命名并上传

您现在已经确认您可以在启用 SSL/TLS 的情况下安全且成功地传输文件。

步骤 8 — 禁用 Shell 访问(可选)

如果由于客户端要求而无法使用 TLS,则可以通过禁用 FTP 用户以任何其他方式登录的能力来获得一些安全性。一种相对简单的防止它的方法是创建自定义外壳。这不会提供任何加密,但会限制受感染帐户对 FTP 可访问的文件的访问。

首先,在 bin 目录中打开一个名为 ftponly 的文件:

须藤纳米/bin/ftponly

添加一条消息,告诉用户他们无法登录的原因:

/bin/ftponly

#!/bin/sh echo "此帐号仅限 FTP 访问。"

保存文件并退出编辑器。

更改权限以使文件可执行:

sudo chmod a+x /bin/ftponly

打开有效 shell 列表:

须藤纳米 /etc/shells

在底部添加:

/etc/shells

. . . /bin/ftponly

使用以下命令更新用户的 shell:

sudo usermod sammy -s /bin/ftponly

现在尝试以 sammy 身份登录您的服务器:

ssh sammy@your_server_ip

您应该会看到如下内容:

输出此帐户仅限于 FTP 访问。 与 203.0.113.0 的连接已关闭。

这确认用户不能再 ssh 到服务器并且仅限于 FTP 访问。

结论

在本教程中,我们介绍了为具有本地帐户的用户设置 FTP。如果您需要使用外部身份验证源,您可能需要查看 vsftpd 对虚拟用户的支持。这通过使用 PAM(可插入身份验证模块)提供了一组丰富的选项,如果您在另一个系统(例如 LDAP 或 Kerberos)中管理用户,这是一个不错的选择。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有