Vsftpd是Very Server FTP的简写形式,是一款非常安全地FTP软件。该软件是基于GPL开发的,被设计为Linux平台下稳定、快速、安全地FTP软件,它支持IPv6以及SSL加密。Vsftpd的安全性主要体现在三个方面:进程分离,处理不同任务的进程彼此是独立运行的;进程运行时均以最小权限运行;多数进程使用chroot进行了禁锢,防止客户访问非法共享目录。chroot是改变根的一种技术,如果我们通过vsftpd共享了/var/ftp目录,则该目录对客户端而言就是共享的根目录。
Vsftp是一款FTP软件。FTP不同于其他的互联网协议,它使用多端口通信。当客户端连接服务器请求资源时,服务器会使用21端口与客户端进行通信,该端口专门处理客户端发送给服务器的请求命令,也就是命令端口。而服务器与客户端进行数据传输时,还需要使用另一个数据端口,数据端口号取决于服务器运行模式是主动模式还是被动模式。
FTP工作模式
1.主动FTP工作模式
主动FTP模式(active mode)的工作步骤如下:
第一步:客户端随机开启一个大于1024的端口与服务器的21端口建立连接通道,通道建立后,客户端随时可以通过该通道发送上传和下载的命令。
第二步:当客户端需要与服务器进行数据传输时,客户端会再次开启一个大于1024的随机端口,并将该端口通过之前的命令通道传送给服务器的21端口。
第三步:服务器获取到客户端的第二个端口后会通过20端口主动连接该端口,通过三次握手后,完成服务器与客户端数据通道建立,所以数据通过该数据通道进行传输。
2.被动FTP工作模式
被动FTP模式(passive mode)的工作过程如下:
第一步:客户端随机开启一个大于1024的端口与服务器的21端口建立连接。
第二步:当客户端要与服务器进行数据传输时,客户端从命令通道发送数据请求要求上传或下载数据
第三步:服务器收到数据请求后会随机开启一个端口,并通过命令通道该端口信息传送给客户端。
第四步:客户端在收到服务器发送过来的数据端口后,会在本地在开启一个随机端口,此时客户端会主动通过这个随机端口连接服务器发送过来的端口,三次握手完成后,可以数据传输。
综上,FTP需要使用多个网络端口才可以正常工作,其中一个端口用于命令的传输(命令端口),另一个端口用于数据的传输(数据端口)。主动模式在传输数据时,服务器会主动连接客户端;被动模式在传输数据时,由客户端主动连接服务器。FTP协议最初使用主动模式工作,但是客户端大多位于防火墙后面,防火墙策略一般不允许高位端口。这样采用主动模式的FTP服务器最终将无法正常工作,所以有了后来的被动模式的FTP服务。
安装与管理Vsftpd
yum -y install vsftpd
service vsftpd start
chkconfig vsftpd on
软件主程序是/usr/sbin/vsftpd,下面是vsftpd相关的核心文件说明。
/etc/logrotate.d/vsftpd(日志轮转备份配置文件)
/etc/pam.d/vsftpd(基于PAM的vsftpd验证配置文件)
/etc/rc.d/init.d/vsftpd(vsftpd启动脚本,可以使用service调用)
/etc/vsftpd(vsftpd软件主目录)
/etc/vsftpd/ftpusers(默认的vsftpd黑名单)
/etc/vsftpd/user_list(可以通过主配置文件设置该文件为黑名单或白名单)
/etc/vsftpd/vsftpd.conf(vsftpd主配置文件)
/usr/sbin/vsftpd(vsftpd主程序)
/usr/share/doc/vsftpd-2.2.2(vsftpd文档资料路径)
/var/ftp(默认vsftpd共享目录)
Vsftpd配置文件解析
Vsftpd配置文件默认位于/etc/vsftpd目录下,Vsftpd会自动寻找以.conf结尾的配置文件,并使用此配置文件启动FTP服务。配置文件的格式为:选项=值(中间不可以有任何空格符),以#开头的行会被识别成注释行。
设置类别 | 设置项 | 功能描述 |
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_clients=2000 | 最大允许同时2000客户端连接,0代表无限制 | |
max_per_ip=0 | 每个客户端的最大连接限制,0代表无限制 | |
tcp_wrappers=YES | 是否启用tcp_wrappers | |
guest_enable=YES | 如果为YES,则所有的非匿名登录都映射为guest_uesrname指定的账户 | |
guest_username=ftp | 设定来宾账户 | |
user_config_dir=/etc/vsftpd/conf | 指定目录,在该目录下可以为用户设置独立的配置文件与选项 |
dual_log_enable=NO | 是否启用双日志功能,生成两个日志文件 | |
anoymous_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根路径 |
Vsftpd账户类型
Vsftpd支持的常用登录方式有:匿名登录、本地账户登录、虚拟账户登录三种方式。
匿名账户登录一般用于下载服务器。这种下载服务器是对外开放的,无须输入用户名和密码即可使用,vsftpd默认开启的是匿名共享,默认共享路径为/var/ftp。
本地账户登录则需要使用系统账户以及对应的系统密码才可以登录使用FTP,用RPM方式安装vsftpd后,默认的配置软件中,anonymous_enable与local_enablede均被设置为YES,此时FTP为匿名访问模式,如果需要开启本地账户FTP功能,需要将anonymous_enable设置为NO,默认共享路径为账户个人家目录。要注意的是,开启本地账户登录后,用户可以离开家目录进入系统其他目录,这很危险。所以,在配置文件中使用chroot_local_user,用户将被禁锢在自己的家目录下,放置用户进入系统中的其他目录。
当有大量的用户使用FTP时,vsftpd支持虚拟账户模式登录FTP,从而避免创建大量系统账户,通过guest_enable可以开启vsftpd的虚拟账户功能,guest_username用来指定本地账户的虚拟映射名称。
vsftpd有两个文件(黑名单文件和白名单文件)可以对用户进行ACL控制,/etc/vsftpd/ftpusers是一个黑名单文件,存储在该文件中的所有用户都将无法访问FTP,格式为每行一个账户。/etc/vsftpd/user_list文件会根据主配置文件中配置项设置的不同,而成为黑名单文件或白名单文件。此外,也可以禁用该文件。主配置文件中的user_enable决定了是否启用user_list文件,如果启用,还可以根据userlist_deny来决定该文件是黑名单还是白名单文件,如果usetlist_deny=YES,则该文件为黑名单,如果userlist_deny=NO,则该文件为白名单。需要注意的是,黑名单表示仅拒绝名单中的账户访问FTP,也就是其他所有账户默认允许访问FTP。而白名单表示仅允许白名单中的账户访问FTP,没有在白名单中的其他所有账户则默认将拒绝访问FTP。
以下分别实现一下本地账户和虚拟账户。
1)本地账户
a.修改配置文件
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
b.创建系统账户及测试文件
useradd -s /sbin/nologin tom
useradd -s /sbin/nologin jerry
useradd -s /sbin/nologin smith
passwd给账户设置密码,不设密码ftp无法登录。
touch /home/{tom,jerry,smith}/test.txt
c.服务管理
setenforce 0
service iptables stop
service vsftpd restart
chkconfig vsftpd on
d.客户端访问
客户端访问ftp://192.168.77.100,输入账号密码,可以看到文件test.txt。
2)虚拟账户
Vsftpd虚拟账户数据要保存在Berkeley DB格式的数据文件中,需要使用db4-utils工具来创建此类数据文件。
a.创建虚拟用户数据库
先创建明文密码文件,奇数行为用户名,偶数行为密码,然后使用db_load工具转换为数据库文件,db_load工具需要通过安装db4-utils软件获得,最后要修改密码文件和数据库文件的权限。
yum install -y db4-utils
vi /etc/vsftpd/vlogin
linux
123456
centos
654321
db_load -T -t hash -f /etc/vsftpd/vlogin /etc/vsftpd/vlogin.db
chmod 600 /etc/vsftpd/{vlogin,vlogin.db}
b.创建PAM文件,设置基于虚拟账户验证
Linux一般通过PAM文件设置账户的验证机制,通过创建新的PAM文件,使用新的数据文件进行登录验证,PAM文件中的db选项指定并验证账户和密码的数据库文件,数据库文件无须.db的名称后缀。
vi /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
c.设置虚拟账户共享目录
所有虚拟账户最后都将映射为一个真实的系统账户,这里添加一个操作系统账户并设置家目录。
useradd -s /sbin/nologin -d /home/ftp virtual
touch /home/ftp/test.txt、
d.修改主配置文件
修改vsftpd的主配置文件,使用guest_enable选项开始虚拟账户功能,所有的虚拟账户都将被映射为guest_username指定的一个系统真实账户。如果需要对虚拟账户进行权限设置,使用与匿名账户一样的设置即可,如anon_mkdir_write_enable=NO就可以控制虚拟账户无法创建目录。下面是vsftpd.conf的配置内容:
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=virtual
listen=YES
listen_port=21
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=39999
pam_service_name=/etc/pam.d/vsftpd.pam
user_config_dir=/etc/vsftpd_user_conf
user_sub_token=$USER
e.为每个用户设置独立共享路径
vsftpd.conf中使用了user_config_dir选项,设置一个基于账户的配置目录,再改目录中可以创建若干个与账户名称同名的文件,并在此文件中为账户设置独立的配置选项,包括权限与共享路径等,这样可以为每个账户做单独的权限设置等操作。本例以linux为例,其他账户参照修改即可。如果你还需要对权限、限速、并发量等选项进行设置,可以参考匿名账号的设置选项添加至账户独立的配置文件中。
mkdir /etc/vsftpd_user_conf
mkdir -p /home/ftp/linux
vi /etc/vsftpd_user_conf/linux
local_root=/home/ftp/$USER
f.重启服务
service iptables stop
setenforce 0
service vsftpd restart