跳至内容

安全 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 Server 多站点设置,您的本地根目录将反映这一点。如果您的设置不同,或者这不是Web服务器,请调整“local_root”设置。

local_root=/var/www/sub-domains

确保“write_enable”也是yes。

write_enable=YES

找到“chroot_local_users”行并删除注释。在其后添加两行,如下所示:

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提供,libdb-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 Hardened Web Server的一部分。如果设置为使用虚拟用户和证书,它非常安全。

此过程包含许多步骤,用于设置vsftpd。花额外的时间正确设置它将确保您的服务器尽可能安全。

作者:Steven Spencer

贡献者:Ezequiel Bruni,Ganna Zhyrnova