VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,编制者的初衷是代码的安全。

特性

 1、它是一个安全、高速、稳定的FTP服务器;

 2、它可以做基于多个IP的虚拟FTP主机服务器;

 3、匿名服务设置十分方便;

 4、匿名FTP的根目录不需要任何特殊的目录结构,或系统程序或其它的系统文件;

 5、不执行任何外部程序,从而减少了安全隐患;

 6、支持虚拟用户,并且每个虚拟用户可以具有独立的属性配置;

 7、可以设置从inetd中启动,或者独立的FTP服务器两种运行方式;

 8、支持多种认证方式

 9、支持带宽限制;

本文介绍通过pam.d模块基于mysql现实vsftp虚拟用户认证

安装环境

wKioL1YJ-WiBi0XbAAA8glU5O6I936.jpg

先安装、配置vsftp

[root@vsftp ~]# yum install -y vsftpd
[root@vsftp ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd #vsftp日志轮询
/etc/pam.d/vsftpd #pam.d的vsftpd
/etc/rc.d/init.d/vsftpd #启动服务脚本
/etc/vsftpd
/etc/vsftpd/ftpusers #用户控制文件
/etc/vsftpd/user_list #用户控制文件
/etc/vsftpd/vsftpd.conf  #配置文件
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/sbin/vsftpd
/usr/share/doc/vsftpd-2.2.2
##此处省略帮助文件##
/usr/share/doc/vsftpd-2.2.2/TUNING
/usr/share/doc/vsftpd-2.2.2/vsftpd.xinetd
/usr/share/man/man5/vsftpd.conf.5.gz
/usr/share/man/man8/vsftpd.8.gz
/var/ftp
/var/ftp/pub #匿名用户共享文件目录

查看默认配置文件启用选项

[root@vsftp vsftpd]# cat  vsftpd.conf |grep -v "^#"
anonymous_enable=YES #允许匿名用户
local_enable=YES #允许本地用户
write_enable=YES #允许本地用户可写
local_umask=022  #本地创建文件的umask
dirmessage_enable=YES #创建目录时消息提示
xferlog_enable=YES 
connect_from_port_20=YES 
xferlog_std_format=YES
listen=YES #监听端口

pam_service_name=vsftpd #pam模块
userlist_enable=YES #用户控制
tcp_wrappers=YES

其他一些重要选项

anonymous_enable=YES    开始匿名用户

anon_upload_enable=YES  允许匿名用户上传文件

anon_mkdir_write_enable=YES  允许匿名用户创建目录

anon_other_write_enable=YES  允许匿名用户其他权限,如删除,重命名文件

chown_uploads=YES #是否改变属主

chown_username=user #上传文件修改成属主

chroot_local_user={Yes|No}    #限制本地用户禁锢其在家目录中

chroot_list_enable={Yes|No}   #限制chroot_list列表中用户禁锢其在家目录中

chroot_list=/etc/vsftp/chroot_list #用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录

xferlog_file=/var/log/vsftp.log  # 配置日志目录

ftpd_banner=Welcome to blah FTP service. #登录提示信息

banned_file=/etc/vsftpd/banned_file 

ls_recurse_enable=YES #用户是否能够使用ls命令

连接限制

max_clients 最大并发链接数

max_per_ip  每IP最大并发数

限制速率

anon_max_rate

local_max_rate

上传文件umask

anon_umask 022

local_umask 022

虚拟用户设置

guest_enable= YES/NO  #启用虚拟用户。默认值为NO。

guest_username=ftp   #这里用来映射虚拟用户。默认值为ftp

user_config_dir=/etc/vsftpd/vusers_config  #为虚拟用户提供配置文件


配置文件里面启用下面选项

ls_recurse_enable=YES

添加测试用户

ls_recurse_enable=YES
[root@vsftp ~]# useradd -s /sbin/nologin test #添加测试用户
[root@vsftp ~]# password test
[root@vsftp ~]# touch /home/test/abc.txt #下创建个测试文件
[root@vsftp ~]#service vsftpd start
[root@vsftp ~]# lftp test@192.168.0.11
lftp test@192.168.0.11:/> ls     
-rw-r--r--    1 0        0               0 Sep 29 01:44 abc.txt
#test账户可用。

在本地上安装msyql-devel包、pam_mysql包

[root@vsftp vsftpd]# yum install -y mysql-devel pam_mysql

在192.168.0.55mysql上给vsftp授权

MariaDB [(none)]> create database vsftpd;
MariaDB [(none)]> grant all on vsftpd.* to vsftpd@192.168.0.55 identified by 'www.magedu.com';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> use vsftpd;
MariaDB [vsftpd]> create table users (
 id int AUTO_INCREMENT NOT NULL,
 name char(20) binary NOT NULL,
password char(48) binary NOT NULL,
 primary key(id)
 );
MariaDB [vsftpd]> insert into users(name,password) values('tom',password('magedu'));
MariaDB [vsftpd]> insert into users(name,password) values('test',password('magedu'));
MariaDB [vsftpd]> show tables;
+------------------+
| Tables_in_vsftpd |
+------------------+
| users            |
+------------------+
1 row in set (0.03 sec)

回到vsftpd主机,查看是否能够链接到mysql

[root@vsftp vsftpd]# mysql -uvsftpd -h192.168.0.55 -p
Enter password: 

mysql> use vsftpd;

mysql> select * from users;
+----+---------+-------------------------------------------+
| id | name    | password                                  |
+----+---------+-------------------------------------------+
|  1 | tom     | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 |
|  2 | test    | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 |
+----+---------+-------------------------------------------+
4 rows in set (0.01 sec)

已OK

vi /etc/pam.d/vsftpd.mysql  #添加如下两行

auth required /lib64/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=192.168.0.55 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

account required /lib64/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=192.168.0.55 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

再次编译配置文件/etc/vsftpd/vsftpd.conf 

确保下面选项是OK

anonymous_enable=NO

local_enable=YES

write_enable=YES

chroot_local_user=YES

pam_service_name=vsftpd.mysql

vi /etc/vsftpd/vusers_config/tom

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

给test家目录授权,有些虚拟用户都会到test家目录执行读写,所以要给test家目录读写权限。

root@vsftp vsftpd]# chmod 777 /home/test/
[root@vsftp vsftpd]# cd /etc/
[root@vsftp etc]# lftp tom@192.168.0.11  #tom不是本地用户,是在mysql创建的一个虚拟用户
Password: 
lftp tom@192.168.0.11:/> ls
-rw-r--r--    1 0        0               0 Sep 29 01:44 abc.txt
lftp tom@192.168.0.11:~> put issue   
47 bytes transferred                     
lftp tom@192.168.0.11:/> ls
-rw-r--r--    1 0        0               0 Sep 29 01:44 abc.txt
-rw-------    1 500      500            47 Sep 29 02:31 issue
[root@vsftp etc]# cd /home/test/
[root@vsftp test]# ll
total 4
-rw-r--r-- 1 root root  0 Sep 29 09:44 abc.txt
-rw------- 1 test test 47 Sep 29 10:31 issue #tom用户以test身份执行put