VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,编制者的初衷是代码的安全。
特性
1、它是一个安全、高速、稳定的FTP服务器;
2、它可以做基于多个IP的虚拟FTP主机服务器;
3、匿名服务设置十分方便;
4、匿名FTP的根目录不需要任何特殊的目录结构,或系统程序或其它的系统文件;
5、不执行任何外部程序,从而减少了安全隐患;
6、支持虚拟用户,并且每个虚拟用户可以具有独立的属性配置;
7、可以设置从inetd中启动,或者独立的FTP服务器两种运行方式;
8、支持多种认证方式
9、支持带宽限制;
本文介绍通过pam.d模块基于mysql现实vsftp虚拟用户认证
安装环境
先安装、配置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