vsftpd是linux发行版中的一款ftp服务器程序它的全称是“very secure ftp daemon”,号称是最安全的ftp服务器。它工作在2120号端口主要提供文件传输服务可以跨越网络提供服务非常好用。

 
本文主要内容
一ftp的工作原理:
二vsftpd的配置文件
三vsftpd的安装
四vsftpd的启动与关闭
五vsftpd的配置文件/etc/vsftpd/vsftpd.conf解析
六用tcp_wraper来控制vsftpd:
七创建ftp虚拟用户
八启用ssl建立安全的传输
 
一ftp的工作原理
    ftp的两种工作模式
    1主动模式
    工作原理客户端从一个任意的非特权端口大于1024N连接到FTP服务器的命令端口也就是21端口。然后客户端开始监听端口N+1并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口20连接到客户端指定的数据端口N+1
    2被动模式
    工作原理当开启一个 FTP连接时客户端打开两个任意的非特权本地端口大于1024N和N+1。第一个端口连接服务器的21端口但与主动方式的FTP不同客户端不会提交PORT命令并允许服务器来回连它的数据端口而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口大于1024P 并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据
    
    主动模式与被动模式的比较       
    主动FTP对FTP服务器的管理和安全很有利但对客户端的管理不利因为FTP服务器企图与客户端的高位随机端口建立连接而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利但对服务器端的管理不利。因为客户端要与服务器端建立两个连接其中一个连到一个高位随机端口而这个端口很有可能被服务器端的防火墙阻塞掉。目前ftp服务器一般工作在被动模式。
    
二vsftpd的配置文件
     1/etc/vsftpd/vsftpd.conf
     这个是vsftpd的主配置文件
     2/etc/xinetd.d/vsftpd
     如果vsftpd工作在超级守护进程的管理下这是其配置文件来管理vsftpd
     3/etc/pam.d/vsftpd
     如果vsftpd启用PAM机制这是PAM认证文件(此文件中file=/etc/vsftpd/ftpusers
 
字段,指明阻止访问的用户来自/etc/vsftpd/ftpusers文件中的用户)
     4/etc/vsftpd/ftpusers
     禁止使用vsftpd的用户列表文件
     5/etc/vsftpd/user_list
     禁止或允许使用vsftpd的用户列表文件
     6/etc/hosts.allow和/etc/hosts.deny
     如果vsftpd启用tcp_wraper控制机制这两个文件可以控制vsftpd
 
 
     小知识
    1ftp是受selinux管理的要配置好selinux或是关闭
    2改动vsftpd主配置文件时确保“=”两边无空格有些功能我们可以添加到配置文件中并且指令要顶格写
 
三vsftpd的安装在系统光盘中有对应的rpm包
#rpm -ivh rpm -ivh vsftpd-2.0.5-16.el5.i386.rpm
 
四vsftpd的启动与关闭
#service vsftpd start
#service vsftpd stop
 
五vsftpd的配置文件/etc/vsftpd/vsftpd.conf解析
anonymous_enable=YES
是否允许匿名用户访问匿名用户访问的时候是被映射为系统的ftp用户它的家目录为/var/ftp故我们用匿名访问的时候访问的是/var/ftp的目录这个目录的权限请不要随意改动如果改动可能造成无法访问。
 
local_enable=YES
是否允许本地用户登录ftp登录之后是用户的家目录但uid号小于500的用户都不允许登录
 
write_enable=YES
本地用户是否有上传权限
 
local_umask=022
本地用户上传的文件的反向掩码。而f用户访问ftp对文件的实际权限是所访问目录和这个文件权限的交集
 
anon_upload_enable=YES
是否允许匿名用户上传文件
 
anon_mkdir_write_enable=NO
匿名用户是否有创建目录的权限
 
anon_other_write_enable=NO
匿名用户是否有删除和重名名文件的权限
 
anon_world_readable_only=NO
匿名用户只能下载全局可读的文件即文件的属组属主其他用户都有读权限
 
dirmessage_enable=YES
当用户切换目录时定义的欢迎信息。可以在家目录中定义一个.message的文件
 
xferlog_enable=YES
是否打开传输日志
 
connect_from_port_20=YES
是否启用20号端口进行数据传输这样会工作在主动模式
 
chown_uploads=YES
chown_username=whoever
当用户上传了文件是否更改该上传的文件属主并且属主更改为哪个用户
 
xferlog_file=/var/log/xferlog
定义传输日志的位置默认在/var/log/messages中
 
xferlog_std_format=YES
定义日志的格式
 
idle_session_timeout=600
会话的超时时间
 
data_connection_timeout=120
数据连接的超时时间
 
nopriv_user=ftpsecure
指定一个安全用户账号,让FTP服务器用作完全隔离和没有特权的独立用户。一般不启用
 
async_abor_enable=YES
是否允许运行特殊的ftp命令"async ABOR"一般不启用
 
ascii_upload_enable=YES
ascii_download_enable=YES
以ascii形式传输一般不启用
 
ftpd_banner=Welcome to blah FTP service.
登录ftp的欢迎信息
 
deny_email_enable=YES
banned_email_file=/etc/vsftpd/banned_emails
是否要禁止匿名用户使用某些邮件地址,如果是输入禁止的邮件地址的路径和文件名可防Dos攻击
 
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
当这个文件中的用户登录时把其用户的目录锁定不能随意切换对保证系统的安全重要。
 
chroot_local_user=YES
把所有登录的用户都锁进自己的家目录不能随意切换
 
ls_recurse_enable=YES
当用户查看ftp服务器上目录文件时支持递归显示
 
listen=YES
以独立守护进程工作
 
listen_ipv6=YES
是否启用ipv6地址上监听
 
pam_service_name=vsftpd
定义以pam实现ftp用户认证根据/etc/pam.d/vsftpd定义进行认证
 
userlist_enable=YES
是否启用用户列表并且只允许/etc/vsftpd/user_list文件中的用户登录
 
userlist_deny=YES
启用用户列表禁止此列表/etc/vsftpd/usr_list中定义的用户登录
 
tcp_wrappers=YES
是否启用tcp_wrapper对vsftpd的控制
 
六用tcp_wraper来控制vsftpd:
首先要确保vsftpd的主配置文件"tcp_wrappers=YES"这一行启用
 
允许192.168.0网段访问
#vim /etc/hosts.allow
添加
vsftpd192.168.0.
禁止172.16.30网段访问
#vim /etc/hosts.deny
添加
vsftpd172.16.30.
 
七创建ftp虚拟用户
    什么是虚拟用户呢
虚拟用户是指那些非操作系统的用户。可以建多个虚拟用户访问ftp服务器的时候会映射到操作系统的一个普通进行访问访问的是这个被映射用户的家目录。
 
我们可以把ftp的账号密码信息存入mysql数据库中
1编译安装pam_mysql-0.7RC1
准备好pam_mysql-0.7RC1.tar.gz  http://pam-mysql.sourceforge.net/ 配置好yum源先安装开发组和所依赖的软件包
#yum groupinstall "Development Tools" "Development Libraries"
 
如果我们想让ftp支持ssl功能的话要安装如下两个包
#yum install openssl
#yum install openssl-devel
 
# tar zxvf  pam_mysql-0.7RC1.tar.gz
# cd  pam_mysql-0.7RC1
# ./configure --with-mysql=/usr/local/mysql --with-openssl 
--with-mysql 指定mysql的安装位置根据mysql的安装位置指定mysql的安装见我的文章"LNMP源码安装配置+discuz")
--with-openssl 使ftp启用ssl可选
 
# make
# make install
 
 
2配置
 
1.准备数据库及相关表
登录进mysql
#mysql -uroot -p
 
我们建立名为vsftpd的数据库来存放相关虚拟用户的帐号
mysql> create database vsftpd;
 
只给lee用户操作vsftpd数据库select的权限用户lee的密码为123456
mysql> grant select on vsftpd.* to lee@localhost identified by '123456';
mysql> grant select on vsftpd.* to lee@127.0.0.1 identified by '123456';
mysql>flush privileges;
 
mysql> use vsftpd;
mysql> create table users (
    -> id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
    -> name char(20) NOT NULL UNIQUE KEY,
    -> password char(48) NOT NULL
    -> );
查看表的结构
mysql>DESC users
 
添加虚拟用户jia,其密码采取加密存放的方式
mysql> insert into users(name,password) values('jia',password('123456'));
 
查看结果
mysql> select * from users;
 
2建立PAM认证所需的文件
为了我们ftp服务器的安全性一般不允许我们的系统用户直接登录ftp服务器
#vi /etc/pam.d/vsftpd.mysql
添加如下两行内容此时不允许系统用户登录
auth required pam_mysql.so user=lee passwd=123456 host=localhost db=vsftpd table=users  usercolumn=name passwdcolumn=password crypt=2
 
account required pam_mysql.so user=lee passwd=123456 host=localhost db=vsftpd table=users  usercolumn=name passwdcolumn=password crypt=2
 
 
如果想要系统用户用自己的账号密码也能访问我们的ftp服务器则修改/etc/pam.d/vsftpd.mysql文件改为为如下六行内容
auth sufficient pam_mysql.so user=lee passwd=123456 host=localhost db=vsftpd table=users  usercolumn=name passwdcolumn=password crypt=2
 
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
 
auth required pam_shells.so
 
auth include system-auth
 
account sufficient pam_mysql.so user=lee passwd=123456 host=localhost 
db=vsftpd table=users  usercolumn=name passwdcolumn=password crypt=2
 
account include system-auth
注意此时系统用户访问的时候也是被映射为我们的虚拟用户vsftp来访问的也就是说系统用户访问的时候也只能访问/var/ftproot这个目录
 
3修改vsftpd的配置文件使其适应mysql认证
 
建立虚拟用户映射的系统用户vsftp及对应的目录/var/ftproot就是虚拟用户登录ftp服务器的所在目录
#useradd -s /sbin/nologin -d /var/ftproot vsftp
#chmod go+rx /var/ftproot
 
请确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
 
为/etc/vsftpd/vsftpd.conf添加以下选项
chroot_local_user=YES
guest_enable=YES
guest_username=vsftp
 
修改/etc/vsfptd/vsftpd.conf中的pam_service_name=vsftpd为如下内容
pam_service_name=vsftpd.mysql
 
启动服务
#service vsftpd restart
 
4设置虚拟用户的权限
先建立一个目录用来存放与虚拟用户名对应的文件
#mkdir /etc/vsftpd/virusers
#cd /etc/vsftpd/virusers
 
在这个目录中建立的文件的名字必须和虚拟用户的名字相同
#vim lee
使虚拟用户lee有上传下载新建文件的权限则添加如下内容
anon_upload_enable=YES
anon_mkdir_write_enable=YES
 
#vim /etc/vsftpd/vsftpd.conf
添加如下行目录文件的名字和建立的目录路径相对应
user_config_dir=/etc/vsftpd/virusers
 
重启服务
#service vsftpd restart
 
5启用iptables跟踪功能
 
我们的服务器通常要有防火墙的而我们的ftp服务一般工作在被动模式如果我们设置ftp服务器(ip:1.1.1.1)的防火墙规则而工作在被动模式的ftp服务可能会被挡掉可以启用iptables的跟踪功能解决
 
安装模块
#modprobe ip_conntrack_ftp
#modprobe ip_nat_ftp
 
是这些模块能自动装载
#vim /etc/sysconfig/iptables-config
修改:
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
 
例设置ftp服务器的规则可以如下使用RELATED选项
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -A INPUT -d 1.1.1.1 -p tcp --dport 20:21 -j ACCEPT
#iptables -A OUTPUT -s 1.1.1.1 -p tcp --sport 20:21 -j ACCEPT
#iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
 
好了我们可以用虚拟用户可以正常访问ftp服务器了。
 
八启用ssl建立安全的传输可选
由于ftp传输是明文的非常不安全我们可以启用ssl功能建立安全加密的传输
#vim /etc/vsftpd/vsftp.conf
添加如下内容
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
 
重启服务
#service vsftpd restart
 
然后建立我们自己的CA然后创建证书vsftpd.crt和密码vsftpd.key放在/etc/vsftpd/ssl目录中CA建立过程见我的博客“数据加密及CA的创建”
 
这时候只有我们使用专用的ftp客户端工具才可以使用加密的传输因为要指定使用哪种ssl类型进行传输。