跳至内容

安全 FTP 服务器 - vsftpd

先决条件

  • 熟悉命令行编辑器(在此示例中使用 vi
  • 对从命令行发出命令、查看日志和其他一般的系统管理员职责有很高的熟悉度
  • 了解 PAM 和 openssl 命令将很有帮助
  • 以 root 用户或普通用户并使用 sudo 运行命令

简介

vsftpd 是 Very Secure FTP Daemon(FTP 是文件传输协议)。它已经存在多年,并且是 Rocky Linux 和许多其他 Linux 发行版的默认 FTP 守护进程。

vsftpd 允许使用带可插拔认证模块 (PAM) 的虚拟用户。这些虚拟用户在系统中不存在,除了 FTP 之外没有任何其他权限。如果虚拟用户被攻破,拥有这些凭据的人在以该用户身份访问后将没有任何其他权限。此设置非常安全,但需要一些额外的工作。

考虑 sftp

即使使用此处设置 vsftpd 的安全设置,您仍可能需要考虑使用 sftpsftp 将加密整个连接流,更加安全。我们创建了一个名为 安全服务器 - sftp 的文档,该文档涉及设置 sftp 和锁定 SSH。

安装 vsftpd

您还必须确保 openssl 已安装。如果您正在运行 Web 服务器,这可能**已经**安装,但为了验证,您可以运行

dnf install vsftpd openssl

您还需要启用 vsftpd 服务

systemctl enable vsftpd

现在不要启动服务。

配置 vsftpd

您需要确保禁用某些设置并启用其他设置。通常,安装 vsftpd 时已设置了最合理的选项。最好还是验证一下。

要检查配置文件并在必要时进行更改,请运行

vi /etc/vsftpd/vsftpd.conf

查找行 "anonymous_enable=" 并确保其为 "NO" 且**未**被注释掉。(注释掉此行将启用匿名登录)。当正确时,该行将显示为

anonymous_enable=NO

确保 "local_enable" 设置为 yes

local_enable=YES

为本地 root 用户添加一行。如果服务器是 Web 服务器,并且您使用了 Apache Web 服务器多站点设置,则您的本地 root 将反映这一点。如果您的设置不同,或者这不是 Web 服务器,请调整 "local_root" 设置

local_root=/var/www/sub-domains

确保 "write_enable" 也设置为 yes

write_enable=YES

找到 "chroot_local_user" 行并删除注释。在此之后添加此处所示的两行

chroot_local_user=YES
allow_writeable_chroot=YES
hide_ids=YES

在此下方,您需要添加一个处理虚拟用户的部分

# Virtual User Settings
user_config_dir=/etc/vsftpd/vsftpd_user_conf
guest_enable=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd
nopriv_user=vsftpd
guest_username=vsftpd

您需要在文件底部附近添加一个部分,以强制加密在互联网上发送的密码。您需要安装 openssl,并且还必须为此创建证书。

首先在文件底部添加这些行

rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.key
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

pasv_min_port=7000
pasv_max_port=7500

保存您的配置。(对于 vi,请按 Shift+:+W+Q。)

设置 RSA 证书

您需要创建 vsftpd RSA 证书文件。作者通常认为服务器可以使用 4 或 5 年。根据您认为服务器在此硬件上运行的时间长度来设置此证书的有效天数。

根据需要编辑天数,并使用此命令的格式创建证书和私钥文件

openssl req -x509 -nodes -days 1825 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.key -out /etc/vsftpd/vsftpd.pem

与所有证书创建过程一样,这将启动一个脚本,询问您一些信息。这个过程并不难。许多字段可以留空。

第一个字段是国家代码字段,请在此处填写您的国家两字母代码

Country Name (2 letter code) [XX]:

接下来是州或省,请填写全名,而不是缩写

State or Province Name (full name) []:

接下来是地区名称。这是您的城市

Locality Name (eg, city) [Default City]:

接下来是公司或组织名称。您可以留空或填入。这是可选的

Organization Name (eg, company) [Default Company Ltd]:

接下来是组织单位名称。如果服务器用于特定部门,您可以填写此项,否则留空

Organizational Unit Name (eg, section) []:

以下字段需要填写,但您可以决定如何填写。这是您服务器的通用名称。例如:webftp.domainname.ext

Common Name (eg, your name or your server's hostname) []:

电子邮件字段可以留空

Email Address []:

完成后,证书创建将发生。

设置虚拟用户

如前所述,使用虚拟用户来 vsftpd 更安全,因为它们没有任何系统权限。也就是说,您需要为虚拟用户添加一个用户。您还需要添加一个组

groupadd nogroup
useradd --home-dir /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

用户必须与 vsftpd.conf 文件中的 guest_username= 行匹配。

转到 vsftpd 的配置目录

cd /etc/vsftpd

您需要创建一个密码数据库。您使用此数据库来认证我们的虚拟用户。您需要创建一个文件来读取虚拟用户和密码。这将创建数据库。

将来,在添加用户时,您将需要再次重复此过程

vi vusers.txt

用户和密码是分行输入的,输入用户名,按 Enter,然后输入密码。继续操作,直到添加完所有当前想要访问系统的用户。例如

user_name_a
user_password_a
user_name_b
user_password_b

创建完文本文件后,您需要生成 vsftpd 将使用的虚拟用户密码数据库。使用 db_load 命令执行此操作。db_loadlibdb-utils 提供,应该已在您的系统上加载,但如果未加载,您可以简单地安装它:

dnf install libdb-utils

使用以下命令从文本文件创建数据库

db_load -T -t hash -f vusers.txt vsftpd-virtual-user.db

花点时间回顾一下 db_load 的作用

  • -T 允许将文本文件导入数据库
  • -t 指定底层访问方法
  • *hash* 是您指定的底层访问方法
  • -f 表示从指定文件读取
  • 指定的文件是 *vusers.txt*
  • 您正在创建或添加到数据库是 *vsftpd-virtual-user.db*

更改数据库文件的默认权限

chmod 600 vsftpd-virtual-user.db

删除 "vusers.txt" 文件

rm vusers.txt

添加用户时,使用 vi 创建另一个 "vusers.txt" 文件,然后重新运行 db_load 命令,这将把用户添加到数据库。

设置 PAM

vsftpd 在安装软件包时会安装一个默认的 pam 文件。您将用自己的内容替换它。**始终**先备份旧文件。

在 /root 中为您的备份文件创建一个目录

mkdir /root/backup_vsftpd_pam

将 pam 文件复制到此目录

cp /etc/pam.d/vsftpd /root/backup_vsftpd_pam/

编辑原始文件

vi /etc/pam.d/vsftpd

删除此文件中的所有内容,除了 "#%PAM-1.0",然后添加以下行

auth       required     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user
account    required     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user
session    required     pam_loginuid.so

保存更改并退出(在 vi 中按 Shift+:+W+Q)。

这将启用您在 vsftpd-virtual-user.db 中定义的虚拟用户的登录,并禁用本地登录。

设置虚拟用户的配置

每个虚拟用户都有一个配置文件,指定他们自己的 "local_root" 目录。此本地根目录的所有者是用户 "vsftpd",组是 "nogroup"。

(请参阅“设置虚拟用户”部分)

要更改目录的所有权,请在命令行中输入

chown vsftpd.nogroup /var/www/sub-domains/whatever_the_domain_name_is/html

您需要创建包含虚拟用户配置的文件

mkdir /etc/vsftpd/vsftpd_user_conf
vi /etc/vsftpd/vsftpd_user_conf/username

该文件将只包含一行,指定虚拟用户的 "local_root"

local_root=/var/www/sub-domains/com.testdomain/html

此路径的规范在 vsftpd.conf 文件中的“虚拟用户”部分。

启动 vsftpd

启动 vsftpd 服务并测试您的用户,假设服务已正确启动

systemctl restart vsftpd

测试 vsftpd

您可以使用命令行在一台机器上测试您的设置,并通过 FTP 测试对该机器的访问。即便如此,最简单的测试方法是使用 FTP 客户端,例如 FileZilla

当您使用虚拟用户测试运行 vsftpd 的服务器时,您会收到一个 SSL/TLS 证书信任消息。此信任消息会告知用户服务器使用了证书,并请求他们在继续之前批准它。您可以在连接为虚拟用户时将文件放置在 "local_root" 文件夹中。

如果您无法上传文件,则可能需要返回并重新验证每个步骤。例如,可能是 "local_root" 的所有权权限未设置为 "vsftpd" 用户和 "nogroup" 组。

结论

vsftpd 是一个流行且常见的 FTP 服务器,它可以作为独立服务器,也可以作为 Apache 加固 Web 服务器 的一部分。如果设置为使用虚拟用户和证书,它相当安全。

此过程涉及许多设置 vsftpd 的步骤。花额外的时间正确设置将确保您的服务器尽可能安全。

作者:Steven Spencer

贡献者:Ezequiel Bruni, Ganna Zhyrnova