虚拟用户验证登录是ftp中常用的一种策略,因为ftp服务古老而且不安全,使用匿名用户不能有效的控制权限,而本地用户可以登录操作系统,极为不安全,所以引入了虚拟用户的概念,其原理是将多个虚拟用户映射为一个本地用户
,从而加强了系统的安全性,本文主要介绍基于mysql的虚拟用户。 其原理图如下:
测试环境:
ftp服务器A : CenOS 6.9 IP:192.168.159.11
mysql服务器B : CenOS 6.9 IP:192.168.159.12
一、安装所需要程序
1、安装ftp服务
yum -y install ftp #客户端
yum -y install vsftpd #服务器
2、安装mysql服务
yum -y install mysql-server mysql-devel
安装pam_mysql模块(只需在A主机安装)
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum install pam_mysql
注意:pam_mysql由epel源提供
service vsftpd start
二、在B主机mysql数据库中创建虚拟用户账号
1.准备数据库及相关表
启动mysql服务
service mysqld start
ss -ntl #mysqld服务已启用并监听在3306默认端口
确保mysql服务已经正常启动。而后,按需要建立存储虚拟用户的数据库,这里将其创建为vsftpd数据库。
mysql> create database vsftpd;
mysql> grant select on vsftpd.* to vsftpd@192.168.159.12 identified by ‘8520’;
mysql> flush privileges;
如果不能,数据库问题请看这里
在数据库中加用户表:
mysql> use vsftpd;
mysql> create table users (
id int AUTO_INCREMENTNOT NULL,
name char(20) binary NOT NULL,
password char(48) binary NOT NULL,
primary key(id) );
2、添加测试的虚拟用户
mysql> insert into users(name,password)values(‘tom’,password(‘8520’));
mysql> insert into users(name,password) values(‘maria’,password(‘8520’));
三、配置vsftpd
1.建立pam认证所需文件
vim /etc/pam.d/vsftpd.mysql
添加如下两行:
auth required pam_mysql.so user=vsftpd passwd=8520 host=192.168.159.12 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account pam_mysql.so user=vsftpd passwd=8520 host=192.168.159.12 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
tips:
auth 检查用户名密码
acccount (审查)检查用户是否在有限期内
注意:由于mysql的安装方式不同,pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。
2.修改vsftpd的配置文件,使其适应mysql认证
建立虚拟用户映射的系统用户及对应的目录
useradd -s /sbin/nologin -d /var/ftproot vuser #创建一个只能ftp登陆的用户
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
chroot_local_user=YES
而后添加以下选项
guest_enable=YES
guest_username=vuser
并确保pam_service_name选项的值如下所示
pam_service_name=vsftpd.mysql
tips:默认为pam_service_name=vsftp 修改后系统用户将无法登陆
四、启动vsftpd服务
service vsftpd start
chkconfig vsftpd on
查看端口开启情况
netstat -tnlp |grep 21
使用虚拟用户登录,验正配置结果,以下为本机的命令方式测试,你也可以在其它Win 上用IE或者FTP客户端工具登录验证。
ftp 192.168.159.11
五、配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。
1、配置vsftpd为虚拟用户使用配置文件目录
vim /etc/vsftpd/vsftpd.conf
添加如下选项:
user_config_dir=/etc/vsftpd/vusers_config #指定虚拟用户配置目录
2、创建所需要目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/vusers_config/
cd /etc/vsftpd/vusers_config/
touch tom maria
3、配置虚拟用户的访问权限
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。比如,如果需要让tom用户具有上传文件的权限,可以修改/etc/vsftpd/vusers_config/tom文件,在里面添加如下选项即可。
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
现象0:
ftp: connect :连接被拒绝
原因: 服务没启动
解决: # chkconfig vsftpd on
现象1:
500 OOPS: cannot open user list file
原因: 不存在文件“/etc/vsftpd.user_list”或文件中不存在该帐户
解决: # echo username >> /etc/vsftpd.user_list
现象2:
530 Permission denied.
Login failed.
原因: “/etc/vsftpd.user_list”文件中不存在当前登陆用户
解决: # echo username >> /etc/vsftpd.user_list
现象3:
500 OOPS: cannot open chroot() user list file
Login failed.
原因: 不存在文件“/etc/vsftpd.chroot_list”
解决: # echo username >> /etc/vsftpd.chroot_list
现象4:
500 OOPS: missing value in config file
Connection closed by remote host.
原因: “=”等号前值有问题,或只有一个空格
解决: 修正相应的值即可,可能过 diff 来比较查找
现象5:
500 OOPS: bad bool value in config file
Connection closed by remote host.
原因: “=”等号后值有问题
解决: 将“=”等号后值确认修改
现象6:
500 OOPS: unrecognised variable in config file
Connection closed by remote host.
原因: 参数前有空格
解决: 将参数前空格删除
现象7、
确认存在“local_enable=YES”,但本地用户无法登陆
原因: 验证参数被误删除
解决: 添加“pam_service_name=vsftpd”现象8、
500 OOPS: chdir
500 OOPS: child died
Connection closed by remote host.
原因: 用户主目录没有权限或没有主目录
解决: 正确设置用户主目录权限