vsFTPd(Very Secure File Transfer Protocol Daemon)是一款在类Unix系统(如Linux)中广泛使用的FTP服务器软件。
一、功能特点
-
安全性高
- 它被设计为高度安全的FTP服务器。例如,它在默认配置下会以独立的低权限用户运行,这降低了系统被入侵后可能造成的危害。即使攻击者设法利用了vsFTPd的漏洞,由于其运行在低权限环境下,也很难对整个系统造成毁灭性的破坏。
- 支持多种安全认证方式,包括PAM(Pluggable Authentication Modules)认证。PAM允许系统管理员灵活地配置用户认证方式,如可以通过系统用户数据库、LDAP(Lightweight Directory Access Protocol)等方式进行认证,从而增强了用户访问控制的安全性。
-
性能良好
- vsFTPd在处理大量并发连接时表现出色。它采用了优化的网络I/O模型,能够高效地处理文件传输请求。例如,在一个企业内部网络中,当多个用户同时从服务器下载或上传文件时,vsFTPd可以有效地分配系统资源,保证文件传输的速度和稳定性。
- 它对带宽的利用也比较合理,支持限速功能。系统管理员可以根据用户组或单个用户的需求,限制其最大上传和下载速度,避免个别用户过度占用带宽而影响其他用户的使用。
-
兼容性强
- 能够很好地兼容各种FTP客户端软件。无论是命令行的FTP客户端(如Linux下的
ftp
命令),还是图形界面的客户端(如FileZilla等),都可以顺利地连接到vsFTPd服务器进行文件传输操作。 - 支持多种文件系统,包括常见的ext4(Linux常用文件系统)、NTFS(Windows常用文件系统,通过一些兼容层)等。这意味着它可以方便地存储和传输存储在不同文件系统中的文件。
- 能够很好地兼容各种FTP客户端软件。无论是命令行的FTP客户端(如Linux下的
二、工作模式
-
主动模式(PORT模式)
- 在主动模式下,客户端首先向服务器的FTP控制端口(默认是21)发送连接请求,建立控制连接。然后,当客户端需要进行数据传输时,它会在本地打开一个随机端口,并通过控制连接将这个端口号告诉服务器。服务器会主动发起一个从其数据端口(默认是20)到客户端指定端口的数据连接。不过,这种模式存在一个问题,就是如果客户端位于防火墙后面,防火墙可能会阻止服务器主动发起的数据连接,导致文件传输失败。
-
被动模式(PASV模式)
- 被动模式解决了主动模式下防火墙可能带来的问题。在被动模式中,客户端同样先建立控制连接到服务器的21端口。当需要传输数据时,服务器会在本地打开一个随机的数据端口,并通过控制连接将这个端口号告知客户端。然后客户端主动发起一个从自己的数据端口到服务器指定数据端口的数据连接,这样就可以顺利地进行文件传输,即使客户端位于防火墙后面也能正常工作。
三、配置文件和基本配置选项
-
配置文件
- vsFTPd的主要配置文件是
/etc/vsftpd.conf
(在Linux系统中)。这个文件包含了服务器的各种设置,如用户访问权限、目录设置、安全选项等。管理员可以通过编辑这个文件来定制服务器的行为。
- vsFTPd的主要配置文件是
-
基本配置选项
listen=YES
或listen=NO
:用于指定vsFTPd是独立运行(listen = YES
)还是通过xinetd等服务来启动(listen = NO
)。独立运行模式下,vsFTPd会直接监听指定的端口,通常用于需要高性能的场景;而通过xinetd启动则更加灵活,适用于对资源占用有严格控制的情况。anonymous_enable=YES
或anonymous_enable=NO
:用于控制是否允许匿名用户访问。如果设置为YES
,匿名用户可以使用默认的用户名(如ftp
或anonymous
)登录服务器,一般用于提供公共文件下载服务;设置为NO
则禁止匿名用户访问,增强服务器的安全性。local_enable=YES
或local_enable=NO
:决定是否允许本地系统用户登录。如果设置为YES
,系统中的用户可以使用自己的用户名和密码登录vsFTPd服务器进行文件操作。
三、部署和问题解决
1. 安装
操作系统: centos7.x
# 安装
yum install vsftpd
# 启动服务
systemctl start vsftpd
# 设置开机启动
systemctl enable vsftpd
配置文件样例:(/etc/vsftpd.conf)
# 允许匿名用户登录
anonymous_enable=YES
# 匿名用户的主目录
anon_root=/var/ftp
# 允许匿名用户上传文件
anon_upload_enable=NO
# 允许匿名用户创建目录
anon_mkdir_enable=NO
# 允许本地用户登录
local_enable=YES
# 本地用户的写入权限
write_enable=YES
# 本地用户的主目录,默认为用户的家目录
local_root=/home/ftpusers
# 开启被动模式
pasv_enable=YES
# 被动模式下服务器使用的端口范围,用于数据传输
pasv_min_port=40000
pasv_max_port=40100
# 设置以独立模式运行
listen=YES
# 设置最大客户端连接数
max_clients=100
# 设置每个IP的最大连接数
max_per_ip=5
2.用户设置:
vsftpd有三种用户访问模式:匿名;本地用户;虚拟用户。
-
匿名用户配置
-
基本配置文件(/etc/vsftpd.conf)设置
-
允许匿名用户访问:将
anonymous_enable
设置为YES
。这是启用匿名用户访问的关键选项。例如:anonymous_enable = YES
。 -
指定匿名用户主目录:通过
anon_root
选项设置匿名用户登录后的主目录。比如设置为/var/ftp
,即anon_root = /var/ftp
。这是匿名用户访问服务器时的初始目录。 -
控制匿名用户上传权限:
- 如果希望禁止匿名用户上传文件,将
anon_upload_enable
设置为NO
,如anon_upload_enable = NO
。 - 若要允许匿名用户上传文件,在确保
write_enable = YES
(这个选项同时影响普通用户和匿名用户的写入权限)的基础上,将anon_upload_enable
设置为YES
,并且要注意设置anon_root
目录的权限,使其可写。
- 如果希望禁止匿名用户上传文件,将
-
控制匿名用户创建目录权限:
- 要禁止匿名用户创建目录,将
anon_mkdir_enable
设置为NO
,例如anon_mkdir_enable = NO
。 - 若允许匿名用户创建目录,在满足写入权限的条件下,将
anon_mkdir_enable
设置为YES
。
- 要禁止匿名用户创建目录,将
-
-
目录权限设置
- 对于
anon_root
指定的匿名用户主目录(如/var/ftp
),如果允许匿名用户上传或创建目录,需要设置合适的权限。例如,使用chmod
命令设置权限,若要允许写入操作,可以将其权限设置为755
(rwxr - xr - x
)或更宽松的权限(但要考虑安全性)。如chmod 755 /var/ftp
。
- 对于
-
-
普通用户配置
-
基本配置文件(/etc/vsftpd.conf)设置
-
允许本地用户访问:将
local_enable
设置为YES
,这是启用本地用户(普通用户)访问的关键选项。例如:local_enable = YES
。 -
设置本地用户的写入权限:通过
write_enable
选项控制本地用户是否有写入权限。若希望本地用户能够上传、删除和修改文件等操作,将write_enable
设置为YES
,如write_enable = YES
。 -
指定本地用户主目录:默认情况下,本地用户登录后的主目录是其在系统中的家目录。可以通过
local_root
选项修改这个默认设置。例如,设置为/home/ftpusers
,即local_root = /home/ftpusers
。 -
控制本地用户的访问权限:
- 可以使用
chroot_local_user
选项来限制本地用户只能访问其主目录及其子目录。如果设置chroot_local_user = YES
,本地用户登录后将被“禁锢”在自己的主目录下。 - 若要允许部分用户可以访问其他目录,可以结合
chroot_list_enable
和chroot_list_file
选项。例如,设置chroot_list_enable = YES
,并指定一个文件(如/etc/vsftpd.chroot_list
)来记录那些不被限制在主目录的用户名单,这些用户在名单中就可以访问其他目录。
- 可以使用
-
-
目录和用户权限设置
- 对于
local_root
指定的本地用户主目录(如/home/ftpusers
),如果允许用户写入,需要确保目录及其文件的权限设置合理。例如,用户的家目录权限一般为700
(rwx------
),可以根据需要调整。同时,要注意文件系统的权限继承等特性,确保用户能够正常访问和操作文件。
- 对于
-
-
虚拟用户配置
-
创建虚拟用户数据库文件和PAM配置
-
创建虚拟用户数据库文件:首先创建一个文本文件(如
/etc/vsftpd/vsftpd - virtual - users.txt
),格式为“用户名:密码”,每行一个用户记录。然后使用db_load
命令将其转换为db
数据库文件。例如:-
创建文本文件:
user1:password1 user2:password2
-
转换为数据库文件(假设安装了
db4 - utils
包):db_load -T -t hash -f /etc/vsftpd/vsftpd - virtual - users.txt /etc/vsftpd/vsftpd - virtual - users.db
-
-
配置PAM(Pluggable Authentication Modules)认证:在
/etc/pam.d/
目录下创建一个名为vsftpd - virtual
的文件,内容如下:auth required pam_userdb.so db=/etc/vsftpd/vsftpd - virtual - users account required pam_userdb.so db=/etc/vsftpd/vsftpd - virtual - users
-
-
基本配置文件(/etc/vsftpd.conf)设置
- 启用虚拟用户认证:添加
guest_enable = YES
,使vsftpd启用虚拟用户(以访客身份)登录。 - 指定虚拟用户对应的系统用户:添加
guest_username = ftpuser
(假设使用ftpuser
作为虚拟用户映射的系统用户,需要先创建这个系统用户)。这个系统用户的家目录将作为虚拟用户的根目录,除非另行指定。 - 指向PAM配置文件:添加
pam_service_name = vsftpd - virtual
,告诉vsftpd使用前面创建的vsftpd - virtual
PAM配置文件进行认证。
- 启用虚拟用户认证:添加
-
设置虚拟用户的权限和目录
- 为虚拟用户创建单独的目录:为每个虚拟用户创建单独的目录,例如为
user1
创建目录/var/ftp/virtual - users/user1
,为user2
创建目录/var/ftp/virtual - users/user2
等。 - 设置目录权限:使用
chmod
命令设置目录权限,一般可以设置为755
,如chmod 755 /var/ftp/virtual - users/user1
。 - 配置vsftpd的权限设置选项:在
/etc/vsftpd.conf
文件中,可以使用virtual_use_local_privs = YES
(如果希望虚拟用户拥有与本地用户相同的权限)或virtual_use_local_privs = NO
(如果希望虚拟用户权限受到更多限制)来控制虚拟用户的权限。还可以通过write_enable
等选项来控制虚拟用户是否有写入权限。
- 为虚拟用户创建单独的目录:为每个虚拟用户创建单独的目录,例如为
-
对应的应用场景:
-
安全性优先场景推荐使用虚拟用户模式
-
原因:
- 隔离系统账户安全风险:虚拟用户模式下,用户的账户信息存储在独立的数据库中,与系统用户账户(如
/etc/passwd
和/etc/shadow
中的账户)分离。即使虚拟用户的密码被泄露,攻击者也很难直接利用这些信息获取系统级别的访问权限,因为虚拟用户并不直接对应真实的系统账户。例如,在一个提供文件共享服务的服务器中,外部用户使用虚拟用户登录进行文件下载或上传,即使他们的虚拟用户密码被破解,也不会危及系统的其他服务(如SSH登录、系统管理员权限等)。 - 灵活的权限管理:可以为每个虚拟用户或不同组的虚拟用户单独配置权限。比如,可以设置某些虚拟用户只能访问服务器上特定的目录用于文件下载,而另一些虚拟用户可以在多个目录中进行上传和下载操作。这种精细的权限控制有助于满足复杂的业务需求,同时将权限限制在必要的范围内,减少潜在的安全漏洞。例如,在企业内部的文件服务器中,对于不同部门的员工可以创建不同的虚拟用户组,分别赋予不同的文件访问和操作权限。
- 隔离系统账户安全风险:虚拟用户模式下,用户的账户信息存储在独立的数据库中,与系统用户账户(如
-
-
内部网络环境且对权限管理要求不高场景可使用普通用户模式
-
原因:
- 方便利用现有系统用户体系:在内部网络环境中,如果服务器主要用于企业内部员工之间的文件传输,并且已经有完善的系统用户管理机制,使用普通用户模式可以方便地利用现有的系统用户账户。员工可以使用他们在系统中的账户登录vsftpd服务器,减少额外的配置工作。例如,在一个小型办公室网络中,员工使用自己的系统账户登录FTP服务器来共享和交换工作文件。
- 相对熟悉的权限管理方式:普通用户的权限管理在一定程度上依赖于系统用户本身的权限设置。对于熟悉系统用户管理(如Linux系统中的用户组、文件权限等概念)的管理员来说,通过配置
/etc/vsftpd.conf
文件中的相关选项(如write_enable
、chroot_local_user
等)来控制普通用户在FTP服务中的权限相对比较直观。例如,通过设置chroot_local_user
选项可以限制本地用户只能访问其主目录及其子目录,这与系统中对用户文件访问范围的控制有一定的相似性。
-
-
提供公共文件下载服务场景可以考虑匿名用户模式
-
原因:
- 简单方便:匿名用户模式的配置相对简单,主要用于提供公共文件下载服务。当服务器上有一些公开的、不需要用户认证即可访问的文件(如软件更新包、公开文档等)时,启用匿名用户模式并设置好相应的文件目录(如
anon_root
目录),就可以让用户方便地下载文件。例如,一个开源软件项目的服务器可以通过匿名FTP服务提供软件的安装包供用户下载。 - 安全风险可控(对于纯下载场景) :在只提供文件下载的情况下,即使允许匿名用户访问,安全风险相对较低。因为匿名用户没有写入权限,无法修改服务器上的文件,也就不容易对服务器造成破坏。不过,如果需要提供文件上传功能,匿名用户模式的安全风险会显著增加,需要谨慎配置(如严格控制上传目录和权限)。
- 简单方便:匿名用户模式的配置相对简单,主要用于提供公共文件下载服务。当服务器上有一些公开的、不需要用户认证即可访问的文件(如软件更新包、公开文档等)时,启用匿名用户模式并设置好相应的文件目录(如
-
3. PAM认证
-
PAM(Pluggable Authentication Modules)认证简介
-
定义和作用
- PAM是一种用于Linux及其他类Unix系统中的认证机制,它提供了一种灵活的方式来进行用户认证、账户管理、会话管理等操作。通过PAM,系统服务(如vsftpd)可以使用不同的认证方式,而无需将这些认证逻辑硬编码到服务本身。例如,它可以让vsftpd根据配置选择使用系统用户数据库认证、LDAP认证或者其他自定义的认证方式。
- PAM的核心是一系列的模块,这些模块可以在不同的阶段(如认证阶段、账户检查阶段等)对用户请求进行处理。每个模块可以执行特定的功能,比如验证用户密码、检查账户是否过期等,并且可以根据模块的返回结果来决定是否允许用户访问服务。
-
工作流程
- 当用户尝试访问一个使用PAM认证的服务(如vsftpd)时,PAM会按照配置文件中指定的顺序加载相关的模块。首先是认证(auth)阶段,模块会验证用户提供的身份信息(如用户名和密码)是否正确。然后是账户(account)阶段,会检查用户账户的状态,例如账户是否被锁定、是否过期等。如果用户通过了这些阶段,就可以成功访问服务。
-
-
普通用户模式下vsftpd中PAM认证的设置
-
默认设置说明
- 在普通用户模式下,vsftpd默认使用系统的PAM配置进行认证。在CentOS等Linux系统中,其对应的PAM配置文件通常是
/etc/pam.d/vsftpd
。这个文件中的配置会引导vsftpd使用系统的用户数据库(如/etc/passwd
和/etc/shadow
)来验证用户身份。
- 在普通用户模式下,vsftpd默认使用系统的PAM配置进行认证。在CentOS等Linux系统中,其对应的PAM配置文件通常是
-
关键配置选项解释(在默认配置文件中)
-
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
- 这一行用于检查用户是否在
/etc/vsftpd/ftpusers
文件中。如果用户在这个文件中,认证将被拒绝。pam_listfile.so
是PAM的一个模块,用于检查用户是否在指定的文件列表中。item = user
表示按用户名进行检查,sense = deny
表示如果用户在文件中则拒绝,file = /etc/vsftpd/ftpusers
指定了检查的文件,onerr = succeed
表示如果文件读取错误(例如文件不存在),则认证继续进行(视为成功)。
- 这一行用于检查用户是否在
-
auth required pam_shells.so
- 这一行用于检查用户的登录shell是否在
/etc/shells
文件中。如果用户的登录shell不在这个文件中,认证将被拒绝。这是为了确保只有拥有合法登录shell的用户才能访问vsftpd服务,从而增加安全性。
- 这一行用于检查用户的登录shell是否在
-
auth required pam_unix.so
- 这是使用系统的
pam_unix.so
模块进行用户身份验证。它会根据系统用户数据库(/etc/passwd
和/etc/shadow
)中的信息来验证用户提供的用户名和密码是否正确。
- 这是使用系统的
-
account required pam_unix.so
- 在账户检查阶段,使用
pam_unix.so
模块检查用户账户的状态。例如,它会检查账户是否被锁定、是否过期等情况,以确保只有合法状态的账户才能访问服务。
- 在账户检查阶段,使用
-
-
一般情况下,如果只是使用普通用户模式,并且系统的PAM配置没有被修改过,vsftpd可以正常使用系统用户进行认证。如果需要特殊的认证要求(如添加额外的认证方式或者修改现有认证规则),则可以修改/etc/pam.d/vsftpd
文件中的配置。不过,修改PAM配置需要谨慎,因为错误的配置可能会导致用户无法正常访问服务。
但是呢,在搜索到的安装说明的博文中,很多都会要求创建ftp的本地用户后,设置禁止该用户登录访问操作系统,比如下面:
useradd ftpuser
useradd -d /home/ftpuser -m ftpuser
usermod -s /sbin/nologin ftpuser
# password ftpuser
但是这里PAM认证会有问题,当输入了用户密码后,还是无法登录创建好的ftp,哪怕用户密码是正确的。在默认的 PAM 配置中,对于 FTP 服务的认证,可能会包含对用户登录 shell 的检查,如auth required pam_shells.so
这一配置项会检查用户的 shell 是否在/etc/shells
文件内。如果将 FTP 用户的登录 shell 设置为不可登录的类型,那么在进行 PAM 认证时,这一检查可能会导致认证失败
解决办法:
- 注释或修复特定行:在
/etc/pam.d/vsftpd
文件中,找到auth required pam_shells.so
这一行,将其注释掉或修改为auth required pam_nologin.so
- 确认其他关键配置项:检查文件中的其他配置项是否满足需求,如
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
用于检查用户是否在/etc/ftpusers
文件中被禁止登录,可根据实际情况调整该文件中的用户列表;auth required pam_unix.so shadow nullok
用于进行标准的 Unix 认证,通常不需要修改,但如有特殊认证需求可进一步调整
在普通用户模式下禁止用户登录操作系统后,可通过以下方法确保PAM认证能正常工作:
修改PAM配置文件
- 注释或修改特定行:在
/etc/pam.d/vsftpd
文件中,找到auth required pam_shells.so
这一行,将其注释掉或修改为auth required pam_nologin.so
。 - 确认其他关键配置项:检查文件中的其他配置项是否满足需求,如
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
用于检查用户是否在/etc/ftpusers
文件中被禁止登录,可根据实际情况调整该文件中的用户列表;auth required pam_unix.so shadow nullok
用于进行标准的Unix认证,通常不需要修改,但如有特殊认证需求可进一步调整。
其他需要排查的问题:
检查用户及权限设置
- 确保用户存在且属性正确:确认禁止登录操作系统的普通用户在系统中存在,且其主目录和相关权限设置正确。例如,用户的主目录应具有适当的读写权限,以便用户在登录FTP时能够正常访问和操作文件。可使用命令
ls -ld /home/用户名
查看用户主目录的权限。 - 检查用户组及组成员关系:确保用户所属的用户组以及组权限设置不会影响PAM认证和FTP登录。有时候,特定的用户组可能具有特殊的权限或限制,需要根据实际情况进行调整。
检查vsftpd服务配置
- 确认相关选项启用:在
/etc/vsftpd/vsftpd.conf
文件中,确保local_enable=YES
已设置,以启用本地用户登录。 - 设置用户限制选项:根据需要设置
chroot_local_user=YES
等选项,将用户限制在其主目录内,以增强安全性。
测试与调试
- 进行登录测试:在完成上述设置后,尝试使用普通用户登录FTP服务器,观察是否能够正常认证和登录,以及是否能够进行预期的文件操作。
- 查看日志文件:如果登录出现问题,可以查看
/var/log/vsftpd.log
等相关日志文件,以获取更详细的错误信息,帮助定位和解决问题。