vsftpdvery secure FTP的简写形式,是一款非常安全的FTP软件。该软件是基于GPL开发的,被设计为Linux平台下稳定、快速、安全的FTP软件,它支持IPv6以及SSL加密。Vsftpd的安全性主要体现在三个方面:进程分离,处理不同任务的进程彼此是独立运行的;进程运行时均以最小权限运行;多数进程都使用chroot进行了禁锢,防止客户非法共享目录,这里的chroot是改变根的一种技术,如果我们通过vsftpd共享了/var/ftp目录,则该目录对客户端而言就是共享的根目录。

vsftpd虽然是一款FTP软件,但FTP不同于其他的互联网协议,它使用多端口通信。当客户端连接服务器请求资源时,服务器会使用21端口与客户端进行通信,该端口专门处理客户端发送给服务器的请求命令,也就是俗称的命令端口。而最终服务器与客户端进行数据传输时,还需要使用另一个数据端口,数据端口号取决于服务器运行的模式是主动模式还是被动模式。

 

4.3.1 FTP工作模式

1. 主动(active modeFTP工作模式

第一步,客户端随机开启大于1024X端口与服务器的21端口建立连接通道,通道建立后,客户端随时可以通过该通道发送上传或下载的命令。

第二步,当客户端需要与服务器进行数据传输时,客户端会再开启一个大于1024的随机端口Y,并将Y端口号通过之前的命令通道传送给服务器的21端口。

第三步,服务器获取到客户端的第二个端口后会主动连接客户端的该端口,通过三次握手后,完成服务器与客户端数据通道的建立,所有的数据均通过该数据通道进行传输。

2. 被动(passive modeFTP工作模式

第一步,客户端随意开启大于1024X端口与服务器的21端口建立连接通道。

第二步,当客户端需要与服务器进行数据传输时,客户端从命令通道发送数据请求要求上传或下载数据。

第三步,服务器收到数据请求后会随机开启一个端口Y,并通过命令通道将该端口信息传送给客户端。

第四步,客户端在收到服务器发送过来的数据端口Y的信息后,将在客户端本地开启一个随机端口Z,此时客户端再主动通过本机的Z端口与服务器的Y端口进行连接,通过三次握手连接完成后,即可进行数据传输。

FTP协议最初使用主动模式工作,但现在客户端主机多数都位于防火墙后面,而且防火墙策略一般不允许入站数据。也就是说,客户端主机可以连接外网,但外网不可以直接接入客户端主机。这样采用主动模式FTP服务器最终将无法正常工作,所以就有了后来的被动模式的FTP服务。

 

4.3.2 安装与管理vsftpd

安装包:vsftpd

RPM格式的vsftpd软件安装完成后,该软件的主程序是/usr/sbin/vsftpd,下面是vsftpd相关的核心文件与目录列表说明。

/etc/logrotate.d/vsftpd(日志轮转)

/etc/pam.d/vsftpd(基于PAMvsftpd验证配置文件)

/etc/rc.d/init.d/vsftpdvsftpd启动脚本,可以使用service调用)

/etc/vsftpdvsftpd软件主目录)

/etc/vsftpd/ftpusers(默认的vsftpd黑名单)

/etc/vsftpd/user_list(可以通过只配置文件设置该文件为黑名单或白名单)

/etc/vsftpd/vsftpd.confvsftpd主配置文件)

/usr/sbin/vsftpdvsftpd主程序)

/usr/share/doc/vsftpd-2.2.2vsftpd文档资料路径)

/var/ftp(默认vsftpd共享目录)

 

4.3.3 配置文件解析

vsftpd配置文件默认位于/etc/vsftpd目录下,vsftpd会自动寻找以.conf结尾的配置文件,并使用此配置文件启动FTP服务。配置文件的格式为:选项=值(中间不可以有任何空格符),以#开头的行会被识别为注释行。表4-2给出了vsftpd的主要配置选项及其对应的含义。

4-2

账户类别

设置项

功能描述

全局配置

listen=YES

是否监听端口,独立运行守护进程

listen_port=21

监听入站FTP请求的端口号

write_enable=YES

是否允许写操作,全局开关

download_enable=YES

如果设置为NO,则拒绝所有的下载请求

dirmessage_enable=YES

用户进入目录是否显示消息

xferlog_enable=YES

是否开启xferlog日志功能

xferlog_std_format=YES

Xferlog日志文件格式

connect_from_port_20=YES

使用主动模式连接,启用20号端口

pasv_enable=YES

是否启用被动模式连接,默认为被动模式

pasv_max_port=24600

被动模式连接最大端口号

pasv_min_port=24500

被动模式连接最小端口号

userlist_enable=YES

是否启用userlist用户列表文件

userlist_deny=YES

是否禁止userlist文件中的账户访问FTP

max_client=2000

最大允许同时2000客户端连接,0代表无限制

max_per_ip=0

每个客户端的最大连接限制,0代表无限制

tcp_wrappers=YES

是否启用tcp_wrappers

guest_enable=YES

如果为YES,则所有的非匿名登录都映射为guest_username指定的用户

guest_username=ftp

设定来宾账户

user_config_dir=/etc/vsftpd/conf

指定目录,在该目录下可以为账户设置独立的配置文件与选项

dual_log_enable=NO

是否启用双日志功能,生成两个日志文件

anonymous_enable=YES

是否开启匿名访问功能,默认为开启

匿名账户

anon_root=/var/ftp

匿名访问FTP的根路径,默认为/var/ftp

anon_upload_enable=YES

是否允许匿名账户上传,默认禁止

anon_mkdir_write_enable=YES

是否运行匿名账户创建目录,默认禁止

anon_other_write_enable=YES

是否允许匿名账户进行其他所有的写操作

anon_max_rate=0

匿名数据传输率(B/s

anon_umask=077

匿名上传权限掩码

本地账户

local_enable=YES

是否启用本机账户FTP功能

local_max_rate=0

本机账户数据传输率(B/s

local_umask=077

本地账户权限掩码

chroot_local_user=YES

是否禁锢本地账户根目录,默认为NO

local_root=/ftp/common

本地账户访问FTP根路径

 

4.3.4 账户权限

vsftpd支持的常用登录方式有:匿名登录、本地账户登录、虚拟账户登录三种方式。

匿名账户登录一般应用于下载服务器,这种下载服务器往往是对外开放的。Vsftpd默认开启的是匿名共享,默认共享路径是/var/ftp

本地账户登录则需要使用系统账户以及对应的系统密码才可以登录使用FTP,默认的配置文件中,anonymous_enablelocal_enable均被设置为YES,此时FTP为匿名访问模式,如果需要开启本地账户FTP功能,需要将anonymous_enable设置为NO,默认共享路径问账户个人家目录。需要注意的是,开启本地账户登录后,用户可以离开家目录,从而进入系统中的其他目录,这样是非常危险的,如果在配置文件中使用chroot_local_user,用户将被禁锢在自己的家目录下。由于SELinux默认不允许FTP共享家目录,因此,在没有完全掌握SELinux设置方法的情况下,建议关闭SELinux以完成下面的案例。

当有大量用户需要使用FTP时,vsftpd支持虚拟账户模式登录FTP,从而避免了创建大量的系统账户,通过guest_enable可以开启vsftpd的虚拟账户功能,guest_username用来指定本地账户的虚拟映射名称。

vsftpd有两个文件(黑名单文件与白名单文件)可以对用户进行ACL控制,/etc/vsftpd/ftpusers,默认是一个黑名单文件。/etc/vsftpd/user_list文件会根据主配置文件中配置项设定的不同,而成为黑名单文件或白名单文件。此外。也可以禁用该文件。主配置文件中的userlist_enable决定了是否启用user_list文件,如果启用,还需要根据userlist_deny来决定该文件是黑名单还是白名单文件,如果user_deny=YES则该文件为黑名单,如果user_deny=NO,则该文件为白名单。需要注意的是,黑名单表示仅拒绝名单中的账户访问FTP,也就是其他所有的账户默认允许访问FTP。而白名单表示仅允许白名单中的账户访问FTP,其他账户则默认拒绝访问FTP

 

4.3.5 vsftpd应用案例

案例1:虚拟账户FTP,满足大量账户的访问需求

vsftpd虚拟账户的数据需要保存在Berkeley DB格式的数据文件中,所以需要安装db4_utils工具来创建这样的数据文件,具体步骤如下。

1)创建虚拟用户数据库

首先需要创建明文密码文件,明文文件奇数行为用户名,偶数行为密码。然后使用db_load工具将其转换为数据库文件,db_load工具需要通过安装db4-utils软件获得,最后可以通过修改文件权限以增强数据资料的安全性。

[root@instructor ~]# yum -y install db4-utils
[root@instructor ~]# vim /etc/vsftpd/vlogin
tomcat
123456
jerry
123456
[root@instructor ~]# db_load -T -t hash -f /etc/vsftpd/vlogin /etc/vsftpd/vlogin.db
[root@instructor ~]# chmod 600 /etc/vsftpd/{vlogin,vlogin.db}

 

2)创建PAM文件,设置基于虚拟账户验证

Linux一般通过PAM文件设置账户的验证机制,然后通过创建新的PAM文件,使用新的数据文件进行登录验证,PAM文件中的db选项于指定并验证账户和密码的数据库文件,数据库文件无需.db的名称后缀。注意,因为本环境使用的是Centos6.4 64位操作系统,所以验证模块调用的是lib64目录下文件。

[root@instructor ~]# vim /etc/pam.d/vsftpd.pam
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vlogin
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vlogin

 

3)设置虚拟账户目录共享

因为所有的虚拟账户最终都需要映射到一个真实的系统用户,所以这里需要添加一个系统账户并设置家目录,为了进行测试,这里复制一份测试文件。

[root@instructor ~]# useradd -s /sbin/nologin -d /home/ftp virtual
[root@instructor ~]# cp /etc/redhat-release /home/ftp/

 

4)修改主配置文件

与配置本地账户FTP一样,我们需要修改vsftpd的主配置文件,使用guest_enable选项开启虚拟账户功能,所有的虚拟账户都将被映射为guest_username指定的一个系统真实账户。如果需要对虚拟账户进行权限设置,使用与匿名账户一样的设置项即可,如anon_mkdir_write_enable=NO,就可以控制虚拟账户无法创建目录。

[root@instructor ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=YES
chroot_local_user=YES
guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.pam
user_config_dir=/etc/vsftpd_user_conf
user_sub_token=$USER

 

5)为每个用户设置独立的共享路径

通过在主配置文件中使用user_config_dir选项,设置一个基于账户的配置目录,在该目录下,可以创建若干个与账户名称同名的文件,并在文件中为此账户设置独立的配置选项,包括权限与共享路径等设置,这样就可以为每个账户做单独的权限设置等操作。本例仅以tomcat为例,其他账户参考模板文件即可。当然,如果你还需要对权限、限速、并发量等选项进行设置,可以参考匿名账户的设置选项添加至账户独立的配置文件中。

[root@instructor ~]# mkdir /etc/vsftpd_user_conf
[root@instructor ~]# mkdir /home/ftp/tomcat
[root@instructor ~]# vim /etc/vsftpd_user_conf/tomcat
local_root=/home/ftp/$USER