操作环境(虚拟机):
rhel5.8(光盘源),  IP: 192.168.88.131
vsftpd-2.0.5-24.el5  (yum安装)
openssl-0.9.8e-22.el5  (yum安装)
db4-utils-4.3.29-10.el5_5.2  (yum安装,{可选,待笔者操作时解})
MySQL5.5.28.tar.gz  (源码编译安装)
pam_mysql-0.7RC1.tar.gz  (源码安装,必须项)
setenforce 0  (selinux对vsftpd的管制很严格,本文暂不细说selinux.临时关闭之)

物理机(Win7 IP: 192.168.88.1),
测试软件: FlashFXP(windows软件...笔者就不细说了)

一.  安装vsftpd.及配置文件一些注释


1.1 基本功能实现

   
   
   
   
  1. yum install vsftpd –y  
  2. service vsftpd restart 


1.2 简单配置解说:

   
   
   
   
  1. grep –v ‘^#’ /etc/vsftpd/vsftpd.conf   #过滤vsftpd.conf的有效行  
  2. anonymous_enable=YES #允许匿名用户  
  3. local_enable=YES #允许系统有效用户登陆  
  4. write_enable=YES #允许用户写权限,全局  
  5. local_umask=022 #本地用户上传文件时的umask值  
  6. anon_upload_enable=YES #允许匿名用户上传  
  7. anon_mkdir_write_enable=YES #允许匿名用户创建目录  
  8. dirmessage_enable=YES   #登录时显示相关目录中,message_file文件的内容,自行创建  
  9. xferlog_enable=YES  #开启日志记录,默认日志文件/var/log/vsftpd.log  
  10. connect_from_port_20=YES #数据传输端口(vsftpd命令端口为21,此为数据传输端口.)  
  11. xferlog_std_format=YES  #使用标准日志记录格式  
  12. listen=YES #开启服务器后为监听状态(这不废话吗...)  
  13. chroot_local_user=YES  #开启此行,表示所有用户都限制在家目录  
  14. chroot_list_enable=YES  #控制用户锁定在家目录(同上行配可实现仅允许,仅限制)  
  15. chroot_list_file=/etc/vsftpd/chroot_list #上一行的控制用户写在此文件  
  16. pam_service_name=vsftpd #pam模块文件位置.(/etc/pam.d/vsftpd)  
  17. userlist_enable=YES  #写在/etc/vsftpd/user_list中的用户禁止登陆  
  18. tcp_wrappers=YES  #支持tcp_wrappers(就是/etc/hosts.{deny,allow} 的访问控制支持) 

1.3 不安全的vsftpd测试

   
   
   
   
  1. useradd mos1  #创建一个普通测试用户(名: mos1 密码: redhat)  
  2. echo “redhat” |passwd –stdin mos1  
  3. tcpdump -i eth1 -nn -X tcp port 21 and host 192.168.88.131 

#使用抓包工具,抓取知道网卡IP的指定协议的指定端口数据:
使用物理机登陆ftp时,抓到如下图:

vsftpd+TLS+MySQL_第1张图片

 

 

二.   实现加密的ftp

(PS:请先执行 ldd `which vsftpd`|grep libssl  保证有字符出现!若没有,安装openssl-0.9.8e-22.el5后在检查,这个必须有.)

    2.1 创建私有CA及其私有证书签发:

 证书的过程,笔者之前写过,不再罗嗦,超级传送门如下:

openssl个人笔记


   2.2 在配置文件vsftpd.conf中添加对tls的支持
 

   
   
   
   
  1. ssl_enable=YES #支持加密的ftp  
  2. allow_anon_ssl=NO   #匿名用户不使用加密连接  
  3. force_local_data_ssl=YES  #强制所有本地用户数据加密传输  
  4. force_local_logins_ssl=YES  #强制本地用户登陆时账号和密码加密传输  
  5. ssl_tlsv1=YES  #支持tlsv1版本  
  6. ssl_sslv2=NO  #不支持sslv2版本  
  7. ssl_sslv3=NO   #不支持sslv3版本  
  8. rsa_cert_file=/etc/vsfpd/ssl/vsftpd.crt  #CA签署csr后的证书,用于传递给客户端  
  9. rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key   #私钥文件 

2.3 重启vsftpd服务,在物理机做测试即可,若出现下图,则OK.

 

vsftpd+TLS+MySQL_第2张图片

 

vsftpd+TLS+MySQL_第3张图片 

'

vsftpd+TLS+MySQL_第4张图片

 

三.  vsftpd, tls和MySQL整合.

 

3.1 创建一个普通用户(用于做虚拟用户映射,指定特定目录,给shell为/sbin/nologin即可)

   
   
   
   
  1. mkdir –pv /var/testuser  
    • useradd -s /sbin/nologin -d /var/testuser guest 
  2. chown -R guest. /var/testuser  


3.2 先做一个简单的不通过mysql认证的测试,不做可直接跳过3.2所有操作.
    3.2.1 安装文件数据库生成工具,并生成数据库文件

   
   
   
   
  1. yum install db4-utils –y  
  2. echo -e 'demo1\n123\ndemo2\n456' > /etc/vsftpd/ulist.txt #数据库模板,奇数行用户名,偶数行密码  
  3. db_load -T -t hash -f /etc/vsftpd/ulist.txt /etc/vsftpd/ulist.db #生成数据库文件 


    3.2.2 修改配置pam认证文件(里面的文件不用指定扩展名).

   
   
   
   
  1. vim /etc/pam.d/vsftpd  
  2. #%PAM-1.0  
  3. auth required pam_userdb.so db=/etc/vsftpd/ulist  
  4. account required pam_userdb.so db=/etc/vsftpd/ulist 


    3.2.3 修改vsftpd.conf支持虚拟用户

   
   
   
   
  1. vim /etc/vsftpd/vsftpd.conf #追加如下两行  
  2. guest_enable=YES  
  3. guest_username=guest 


     Ps:   重启服务,使用用户demo1,密码123 和用户demo2,密码456 登陆测试即可

 


3.3 使用基于MySQL的认证
  

    3.3.1 安装MySQL
  
这里笔者偷个懒.笔者的里面第一个就是mysql的编译安装,而且笔者测试时也是使用的这个MySQL,因此,笔者便不再罗嗦啦,超级传送门如下:

LAMPX-AMPX编译安装篇:

 

   3.3.2 在MySQL中创建虚拟用户的数据

 

   
   
   
   
  1. mysql>create database vsftpd;  
  2. mysql>GRANT SELECT ON vsftpd.* TO 'ftpuser'@'localhost' IDENTIFIED BY '123';  
  3. mysql>use vsftpd;
  4. mysql>CREATE TABLE vusers (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEYName VARCHAR(30) NOT NULLPassword CHAR(48) NOT NULL);  
  5. mysql>INSERT INTO vusers (Name,PasswordVALUES ('demo1',password('123')),('demo2',password('123'));  
  6. mysq>FLUSH PRIVILEGES;  
  7. mysql>\q 

Ps:对上面几条数据库命令做个注释,按顺序:

创建名为 vsftpd 的数据库

创建一个用户ftpuser,允许其通过localhost使用123密码访问

创建一个名字为vusers的表,id为主键,自增,不得为空,其后是Name和密码,都不得为空

插入俩数据(测试用户),分别是demo1和demo2,密码123加密存放.

刷新权限

退出mysql

 

   3.3.3编译生成pam_mysql.so模块.
    (Ps: 笔者不推荐使用yum安装MySQL,笔者肯定不会说在其它虚拟机测试时使用yum安装的mysql,编译这个模块一直失败的......笑话,这种事儿能说吗.)

 

   
   
   
   
  1. mkdir –pv /root/work 
  2. wget http://down1.chinaunix.net/distfiles/pam_mysql-0.7RC1.tar.gz   
  3. tar xf pam_mysql-0.7RC1.tar.gz  
  4. cd pam_mysql-0.7RC1  
  5. ./configure –with-mysql=/usr/local/mysql  
  6. make && make install #编译后请确认/lib/security/pam_mysql.so这个文件存在. 


  
3.3.4 编辑pam认证文件

   
   
   
   
  1. vim /etc/pam.d/vsftpd  
  2. auth required pam_mysql.so user=ftpuser passwd=123 host=localhost db=vsftpd table=vusers usercolumn=Name passwdcolumn=Password crypt=2  
  3. account required pam_mysql.so user=ftpuser passwd=123 host=localhost db=vsftpd table=vusers usercolumn=Name passwdcolumn=Password crypt=2 

Ps: 这两行中前面都好说,末尾的crypt加个注释:

crypt=0: 明文密码
crypt=1: 使用crpyt()函数(对应SQL数据里的encrypt(),encrypt()随机产生salt)
crypt=2: 使用MYSQL中的password()函数加密<-笔者插入数据时使用的这个
crypt=3: 表示使用md5的散列方式

 

3.3.5 修改vsftpd.conf支持虚拟用户

   
   
   
   
  1. vim /etc/vsftpd/vsftpd.conf #追加如下两行  
  2. guest_enable=YES  
  3. guest_username=guest 

Ps:重启服务,使用用户demo1,密码123 和用户demo2,密码123 登陆测试即可

 

3.4  给每个虚拟用户做单独的权限控制(事先得知道要限制的用户名,又废话了)

 

   
   
   
   
  1. mkdir –pv /etc/vsftpd/limit  
  2. touch /etc/vsftpd/limit/{demo1,demo2}  
  3.   vim /etc/vsftpd/limit/demo1 #用户单独限制,仅demo1不能写入  
  4. write_enable=NO #写权限关闭  
  5.   vim /etc/vsftpd/vsftpd.conf  #修改主配置文件.添加如下行.  
  6. user_config_dir=/etc/vsftpd/limit    

 

  本次配置到此完成...重启vsftpd,测试即可..

如果认证不通过,请检查mysql库文件是否已载入,如果没有,请检查mysql安装目录是否有lib目录,并将其路径写入/etc/ld.so.conf.d/mysql.conf,并使用ldconfig重启载入,当出现如下信息,则为正常,具体操作方法,参见 LAMPX-AMPX编译安装篇:

[root@stu35 ~]# ldconfig -v|grep mysql
/usr/local/mysql/lib:
 libmysqlclient.so.18 -> libmysqlclient_r.so.18.0.0