一,安装环境以及安装的软件:

1,CentOS release 6.4 (Final) [IP:192.168.1.110]

2,vsftpd-2.2.2-13.el6_6.1.x86_64

3,pam_mysql-0.7-0.12.rc1.el6.x86_64

4,mysql-5.6.16(编译安装)

二,在数据库上创建登录ftp的账号和密码

1,创建对应的database,远程授权登录账号并创建表用来存储登录ftp账号密码。

mysql>  create  database  vsftpd;
mysql>  grant  select  on  vsftpd.*  to  'vsftpd' @‘192.168.1.110’ identified  by  'vsftpd' ;
 
mysql> flush  privileges ;
mysql> use vsftpd;
mysql>  create  table  users (id  int  AUTO_INCREMENT  NOT  NULL , name  char (20)  binary  NOT  NULL , password  char (48)  binary  NOT  NULL , primary  key (id));

2,添加虚拟用户

  mysql> insert into users(name,passwordvalues('test',password('test'));

  注意:此处对应的加密方法是基于PASSWORD函数加密后存储

三,配置vsftpd

1,创建vsftpd通过PAM模块和mysql认证时所需要的文件:

vim /etc/pam.d/vsftpd.mysql

auth required  /lib64/security/pam_mysql .so user=vsftpd  passwd =vsftpd host=192.168.1.110 db=vsftpd table= users  usercolumn=name passwdcolumn=password crypt=2
account required  /lib64/security/pam_mysql .so user=vsftpd  passwd =vsftpd host=192.168.1.110 db=vsftpd table= users  usercolumn=name passwdcolumn=password crypt=2

此处可能会遇到的问题:

1)pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,,授权一个远程连接的mysql并访问vsftpd数据库的用户会避免此问题出现。

通过查看日志文件/var/log/secure可能出现如下问题:server vsftpd[20453]: pam_mysql - MySQL error (Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' 

2)crypt=Num中 Num=0:表示不加密;Num=1:表示incrypt;Num=2:表示基于mysql的PASSWORD函数;Num=3:表示基于MD5认证。

此处创建虚拟用户时基于PASSWORD函数,所以crypt=2;

否则通过查看日志文件/var/log/secure可能出现如下问题:vsftpd[23068]: pam_mysql - SELECT returned no result. 密码匹配不正确,查询不到结果。


2,修改vsftpd的配置文件,使其适应mysql认证,建立虚拟用户映射的系统用户及对应的目录

useradd -s /sbin/nologin -d /var/homeftp vuser

chmod go+rx /var/homeftp   #确保属组用户和其他用户对vuser目录有r,x权限

确保/etc/vsftpd.conf中已经启用了以下选项

local_enable=YES                           #此处必须为YES,否则登录失败

write_enable=YES

chroot_local_user=YES                      #将用户禁锢在其家目录中

添加以下选项

guest_enable=YES                           #启用后所有的非匿名登入者都视为guest_username定义的用户登录

guest_username=vuser                       #虚拟用户通过映射到vuser用户登录

user_config_dir=/etc/vsftpd/vusers_config  #虚拟用户的配置文件在此目录下定义

pam_service_name=vsftpd.mysql              #pam模块连接mysql时认证文件


3,配置虚拟用户具有不同的访问权限

    vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名和虚拟用户的用户名必须相同。配置文件目录可以是任意未使用目录,需要在vsftpd.conf中指定其路径及名称。

1)创建所需要目录,并为虚拟用户提供配置文件

# mkdir /etc/vsftpd/vusers_config/

# cd /etc/vsftpd/vusers_config/

# touch test

2)配置虚拟用户的访问权限

    虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。比如,如果需要让test用户具有上传文件的权限,可以修改/etc/vsftpd/vusers_config/test文件,在里面添加anon_upload_enable=YES

选项如下:

anon_upload_enable={YES|NO}        #虚拟用户是否具有上传权限

anon_mkdir_write_enable={YES|NO}  #虚拟用户是否具有创建权限

anon_other_write_enable={YES|NO}  #虚拟用户是否具有除上传,创建之外的其他权限

anon_umask=022                        #虚拟用户上传文件权限(文件:666-022)(目录:777-022)


遇到的问题:

因为vsftp默认情况是工作在passive 模式下,连接进去后,敲命令后,出现227 然后卡在那边。

wKiom1UvczGDIyY3AAC9ojcsWLU468.jpg

这是因为iptables把服务器开发给客户端的端口禁了,可以用passive关闭被动模式,进入主动模式。

还有一种方法就是在vsftpd.conf中增加分配传输数据的随机端口:

pasv_min_port=50000

pasv_max_port=50999

然后增加iptables规则:

iptables -I INPUT 3 -p tcp  --dport 50000:50999 -j ACCEPT