如何在 Debian 上设置 vsftpd
Vsftpd 是 Very Secure FTP Daemon 的缩写:它是 Linux 和其他类 Unix 操作系统上最常用的 ftp 服务器之一。它是开源的,在GPL许可下发布,支持虚拟用户和数据SSL 加密。在本教程中,我们将了解如何在 Linux 上安装和配置它。
在本教程中您将学习:
如何在 Debian 10 上安装 vsftpd
如何配置 vsftpd
如何设置匿名使用
如何设置本地用户登录
如何设置虚拟用户
如何设置 ufw 以允许传入流量
如何在 Debian 上设置 vsftpd
使用的软件要求和约定
安装
Vsftpd 在官方 Debian 存储库中可用,因此要安装它,我们可以使用我们最喜欢的包管理器;只需同步存储库并安装软件包即可。这两件事都可以通过以下方式完成 运行以下命令:
$ sudo apt-get update && sudo apt-get install vsftpd
几秒钟后,该软件包就会安装在我们的 Debian 系统上。包中包含的安装脚本也会自动启动 vsftpd 服务,但我们必须记住每次更改配置文件时重新启动或重新加载该服务。为了能够使用 vsftpd 提供的虚拟用户功能,我们还需要安装另一个软件包:
$ sudo apt-get install libpam-pwdfile
我们将在本教程的专门部分中看到它的用法。
安装所需的软件包后,我们可以进一步配置 vsftpd:我们将在本教程的下一部分中了解如何执行此操作。
Vsftpd 设置
vsftpd 配置文件为 /etc/vsftpd.conf
。如果我们打开它,我们可以看到其中已经包含的各种指令。让我们看看什么与最常见的情况最相关。
启用匿名登录
默认情况下,禁用匿名用户未经身份验证的服务器访问。要启用它,我们必须使用 anonymous_enable
指令,该指令位于配置文件中的 25
行。我们所要做的就是将其设置为 YES
: 必须将指令更改为:
anonymous_enable=YES
我们可能想要更改的另一个指令是让我们设置一个目录,其中 vsftpd 在匿名访问后将尝试导航。让我们控制此设置的指令是anon_root
。假设我们希望匿名用户默认访问 /srv/ftp
目录,我们可以这样写:
anon_root=/srv/ftp
所有匿名登录都在内部映射到设计的用户,默认情况下为 ftp。要更改此映射,我们必须使用 ftp_username 选项并将其设置为我们要将匿名用户映射到的用户名。
默认情况下,出于明显的安全原因,不允许匿名用户在服务器上写入任何内容。如果您想更改此行为(不推荐),则需要更改几个选项。首先,通用write_enable
指令必须设置为YES
。该指令在配置文件的第 31
行被注释,因此您所要做的就是删除注释。
# Uncomment this to enable any form of FTP write command.
write_enable=YES
启用此指令后,我们所要做的就是处理另外两个选项:anon_upload_enable
和 anon_mkdir_write_enable
。当前者设置为YES
时,匿名用户将能够上传文件,但前提是该文件映射到的用户(正如我们所说,ftp,通过默认)对目标目录具有写权限。要激活这个选项,我们所要做的就是删除配置文件第 40 行的注释:
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
anon_upload_enable=YES
相反,当设置为 YES 时,anon_mkdir_write_enable
指令允许匿名用户在服务器上创建新目录,条件与我们上面看到的相同(服务器上的底层用户必须对父目录有写权限)。该指令位于配置文件的 44
行:
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
anon_mkdir_write_enable=YES
再一次,由于变量已经设置为 YES,为了使其相关,我们所要做的就是从中删除注释。
为了允许匿名用户执行其他类型的写入操作,例如重命名或删除目录,我们必须使用配置文件中不存在的另一个指令, anon_other_write_enable
并将其设置为 YES
(如果上面的行为是我们想要的行为):
anon_other_write_enable=YES
经过身份验证的登录
要允许本地系统用户使用其系统密码访问 ftp 服务器,必须将 local_enable
指令设置为 YES
:这是 Debian 系统上的默认设置。该指令可以在守护程序的第 28
行找到 配置文件:
# Uncomment this to allow local users to log in.
local_enable=YES
默认情况下,当本地用户成功通过身份验证时,他/她将拥有自己的 root 目录。但是,可以使用 local_root
指令指定替代起点。该指令不存在于配置文件中,因此如果要使用我们必须添加它。例如,要将 /srv/ftp
目录设置为本地根目录,我们可以编写:
local_root=/srv/ftp
chroot 本地用户
作为一项安全措施,可以在其自己的主目录中chroot每个经过身份验证的用户。要完成此任务,我们必须使用 chroot_local_user 指令:
chroot_local_user=YES
启用此功能后,可以使用以下指令指定排除列表(不应 chroot 的用户列表):
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
第一个指令需要激活该功能,另一个指令用于指定包含排除列表的文件的位置。如果该文件不存在,则必须创建,否则登录将失败。
作为一项安全措施,当用户被 chroot 时,它不应该能够写入 chroot 的顶级目录。如果是这种情况,在最新版本的 vsftpd 中,用户将无法登录,服务器将响应以下消息:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
这个问题基本上可以通过两种方式解决。第一个显然是修复权限,拒绝用户对 chroot 顶级目录的写入访问权限,并允许他们仅在子目录上写入。 如果您不关心可能的安全隐患,解决问题的第二种方法是使用以下指令绕过此限制:
allow_writeable_chroot=YES
说到权限,请务必记住,本地用户的默认 umask 设置为 077
。如果认为此设置过于严格,则可以使用 local_umask
指令更改它。该指令在配置文件的第 35
行注释:
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
#local_umask=022
使用虚拟用户登录
vsftpd 提供的一项不错的功能是可以使用虚拟用户登录。虚拟用户是系统上并不真正存在的用户,仅存在于 sftpd 应用程序的上下文中。要启用此功能,我们必须使用以下指令:
guest_enable=YES
当该功能处于活动状态时,所有非匿名登录(甚至是真实/本地用户)都会映射到使用 guest_username
指令指定的用户,默认情况下,正如我们已经看到的那样,该用户是 ftp 。
下一步是创建一个包含虚拟用户的用户名和密码的文件。要生成哈希密码,我们可以使用 openssl 并发出以下命令:
$ openssl passwd -1
Password:
Verifying - Password:
$1$pfwh3Jou$DQBiNjw8bBtDqys7ezTpr.
openssl 的 passwd 命令用于生成哈希密码(md5)。在上面的示例中,我们被要求对密码进行哈希处理并进行确认。最后生成散列密码并显示在屏幕上。
用户名和密码必须放入一个文件中,假设它是 /etc/virtual_users.pwd
,格式如下:
username:hashed_password
因此,假设我们的虚拟用户名为“linuxconfig”,我们会这样写:
linuxconfig:$1$pfwh3Jou$DQBiNjw8bBtDqys7ezTpr.
必须对我们要配置的每个虚拟用户重复该操作。
现在我们必须创建 pam 服务,vsftpd 将使用该服务对虚拟用户进行身份验证。我们将文件命名为 vsftpd_virtual
并将其放置在 /etc/pam.d
目录中。其内容如下:
#%PAM-1.0
auth required pam_pwdfile.so pwdfile /etc/vsftpd/virtual_users.pwd
account required pam_permit.so
正如您所看到的,我们在第一行指定了包含虚拟用户的用户名和密码的文件的路径。现在我们需要做的就是指示 vsftpd 使用这个 pam“服务”。我们可以使用 pam_service_name
指令来做到这一点:
pam_service_name=vsftpd_virtual
此时我们可以保存配置文件,重新启动守护进程并验证我们是否能够使用刚刚创建的虚拟用户登录。
启用数据加密的 SSL 支持
默认情况下,vsftpd 上禁用 SSL 支持,因此传输的数据不会加密。要启用 SSL 支持,我们必须使用以下指令,位于配置文件的 149
至 151
行:
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=YES
第一个指令 rsa_cert_file
用于指示用于 SSL 加密连接的 RSA 证书的路径。相反,第二个 rsa_private_key
用于指定 RSA 私钥的位置。最后,ssl_enable
指令用于启用 SSL 加密。
该示例使用 /etc/ssl/certs/ssl-cert-snakeoil.pem
和 /etc/ssl/private/ssl-cert-snakeoil.key
文件,但是您几乎肯定想使用专用的。
指定被动模式的端口范围
FTP 被动模式是新安装的 vsftpd 的默认模式,但如果我们想明确启用它,我们可以使用以下指令:
# Set to NO if you want to disallow the PASV method of obtaining a data connection
# (passive mode). Default: YES
pasv_enable=YES
当服务器在被动模式下运行时,它会向客户端发送一个它应该侦听连接的IP地址和端口。默认情况下,该端口是随机选择的,但是,由于我们必须在服务器上使用防火墙,因此我们必须知道应该允许流量通过哪些端口。可以使用 pasv_min_port
和 pasv_max_port
指令指定要使用的端口范围,例如:
# The minimum port to allocate for PASV style data connections. Can be used to
# specify a narrow port range to assist firewalling.
pasv_min_port=10090
# The maximum port to allocate for PASV style data connections. Can be used to
# specify a narrow port range to assist firewalling. Default: 0 (use any port)
pasv_max_port=10100
通过以下配置,服务器将使用从 10090
到 10100
的一系列端口。
防火墙设置
为了使我们的 vsftpd 服务器正常工作,我们必须允许流量通过所需的端口,有些我们必须为我们的防火墙设置适当的规则。在本教程中,我将假设使用 ufw 防火墙管理器(简单防火墙)。
我们要允许流量通过的第一个端口是端口 21
,它是 FTP 协议使用的标准端口:
$ sudo ufw allow in 21/tcp
其次,我们必须允许通过我们在上一节中设置的指定端口范围传入流量。要指定端口范围,我们可以运行:
$ sudo ufw allow in 10090:10100/tcp
结论
在本文中,我们了解了如何在 Debian 10 Buster 上安装和配置 vsftpd。我们了解了如何设置匿名使用和本地用户使用,以及如何利用该服务提供的虚拟用户功能。由于 FTP 不提供数据加密,因此我们了解了如何启用 SSL 支持,以及最后如何设置防火墙以允许传入流量通过所需端口。有关可在 vsftpd 配置文件中使用的指令的完整列表,请查看 vsftpd.conf 联机帮助页 (VSFTPD.CONF(5))。想知道如何以编程方式使用 FTP 服务器?看看我们关于如何使用 python 连接到 FTP 服务器的文章。