构建基于mysql数据库存储虚拟用户账号密码的vsftpd服务。

实验环境:

centos6:安装vsftpd服务、lftp客户端、pam_mysql

注意:pam_mysql包由epel源提供

centos7:安装mariadb-servermariadb-devel

[root@localhost yum.repos.d]# yum install mysql-devel

步骤一:准备数据库。

在数据库中添加mysql的用户和实验用的存储的用户和密码

[root@localhost ~]# mysql -uroot -h 127.0.0.1 -p

Enter password: 

MariaDB [(none)]> 

创建用户ftp服务器连接mariadb服务器的用户和专用数据库及表

MariaDB [(none)]> create database vsftpd;

Query OK, 1 row affected (0.00 sec)

 

MariaDB [(none)]> create user vsftpd;

Query OK, 0 rows affected (0.02 sec)

 

MariaDB [(none)]> grant select on vsftpd.* to vsftpd@172.16.249.236 identified by "111111";

Query OK, 0 rows affected (0.03 sec)

 

MariaDB [(none)]> flush privileges;

Query OK, 0 rows affected (0.01 sec)

创建表ftpuser

MariaDB [vsftpd]> create table ftpuser (id int AUTO_INCREMENT NOT NULL,name char(20) binary NOT NULL,password char(48) binary NOT NULL, primary key(id));

Query OK, 0 rows affected (0.08 sec)

为实验准备数据,在ftpuser表中插入两条记录

MariaDB [vsftpd]> insert into ftpuser(name,password) values ("lp1","111111");

Query OK, 1 row affected (0.03 sec)

 

MariaDB [vsftpd]> insert into ftpuser(name,password) values ("lp2","111111");

数据库环节准本完毕。

在另一台主机上安装vsftpd服务和pam-mysql。因为vsftpd是基于pam机制来认证的,所有要实现基于mysql来存储虚拟用户的的账号和密码,必须使用pam-mysql模块来完成。

[root@bogon ~]# rpm -q pam_mysql

pam_mysql-0.7-0.12.rc1.el6.x86_64

[root@bogon ~]# rpm -q vsftpd

vsftpd-2.2.2-11.el6_3.1.x86_64

 

首先测试本主机能够连接另一台mariadb服务器。(注意:测试环境中没有涉及到iptables防火墙策略,所有请确保数据库端的iptables能够通过。同时,请确保selinux处于关闭状态或者permissive状态)

 

 

步骤二:建立pam认证所需要的文件。

[root@bogon pam.d]# vim /etc/pam.d/vsftpd.mysql

auth required /lib64/security/pam_mysql.so user=vsftpd passwd=111111 host=172.16.249.209 db=vsftpd table=ftpuser

usercolumn=name passwdcolumn=password crypt=0

account required /lib64/security/pam_mysql.so user=vsftpd passwd=111111 host=172.16.249.209 db=vsftpd table=ftpus

er usercolumn=name passwdcolumn=password crypt=0

 

注意:这里的crypt的值有5种,0表示明文,13表示使用MD5加密,4表示使用sha1加密,2表示使用mysql数据库的password()函数加密,但是可能出现的问题就是此处的加密方式和数据库处的加密方式不同从而导致认证不会通过。此处的host有三种方式:

 1. absolute path to the unix socket (e.g. "/tmp/mysql.sock")  // vsftpdmysal在同一主机

 2. host name (e.g. "somewhere.example.com")  //vsftpdmysal不在同一主机

 3. host name + port number (e.g. "somewhere.example.com:3306")//vsftpdmysal不在同一主机

第三步:配置vsftpd

建立虚拟用户映射的系统账号以及对应的目录。

[root@bogon var]# useradd -d /var/ftproot -s /sbin/nologin vuser

默认创建的家目录其他用户是没有任何权限的,所以给其相应的权限

[root@bogon var]# ll -d /var/ftproot

drwx------. 3 vuser vuser 4096 9月  23 21:53 /var/ftproot

[root@bogon var]# chmod go+rx /var/ftproot

 

修改配置文件中的以下几项:

anonymous_enable=NO   //开启虚拟用户此项可以禁用

local_enable=YES     //此项必须开启,因为虚拟用户必须映射为一个本地用户来访问数据

write_enable=YES  //本地用户有写权限

xferlog_enable=YES   //开启日志功能

xferlog_file=/var/log/xferlog  //日志文件

log_ftp_protocol=YES  //这项也是日志功能,但要求xferlog_std_format=NO,这两个日志可以用来排错。

chroot_local_user=YES //禁锢用户家目录,

chroot_list_enable=YES  

chroot_list_file=/etc/vsftpd/chroot_list

pam_service_name=vsftpd.mysql  //vsftpd.mysqlpam认证的文件

userlist_enable=NO   //用默认值

userlist_deny=YES  //用默认值

guest_enable=YES   //虚拟用户登录方式必须添加的选项

guest_username=vuser   //虚拟用户登录方式必须添加的选项

 

此外,要想对每个虚拟用户都提供配置文件,只需要在配置文件中添加

user_config_dir=/etc/vsftpd/vusers_dir/

然后在在此目录下创建以用户名为文件名的文件,并写入响应的控制项即可。

 

 

构建基于文本文件认证的虚拟用户登录:

第一步:创建用于存储账号密码的文件。(此文件有特殊格式,奇数行为用户名,偶数行为密码)

[root@localhost vsftpd]# vim vuser.list

keke

111111

lili

111111

第二步:使用db_load命令将此文件格式化为数据库文件(pam认证必须的,而db_load命令是由db4utils包提供的)

[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db

注释The -T option allows non-Berkeley DB applications to easily load text files into databases选项-T允许应用程序能够将文本文件转译载入进数据库。由于我们之后是将虚拟用户的信息以文件方式存储在文件里的,为了让Vsftpd这个应用程序能够通过文本来载入用户数据,必须要使用这个选项。如果指定了选项-T,那么一定要追跟子选项-t

[root@localhost vsftpd]# file vuser.db

vuser.db: Berkeley DB (Hash, version 9, native byte-order)

为了安全更其权限

[root@localhost vsftpd]# chown 600 /etc/vsftpd/vuser.*

创建ftp根目录以及虚拟用户映射的用户

[root@bogon var]# useradd -d /var/ftproot -s /sbin/nologin vuser

默认创建的家目录其他用户是没有任何权限的,所以给其相应的权限

[root@bogon var]# ll -d /var/ftproot

drwx------. 3 vuser vuser 4096 9月  23 21:53 /var/ftproot

[root@bogon var]# chmod go+rx /var/ftproot

建立支持虚拟用户的pam认证文件

[root@localhost pam.d]# vim vuser

auth required  pam_userdb.so db=/etc/vsftpd/vuser

account required pam_userdb.so db=/etc/vsftpd/vuser

注意:文件中的db指向的是之前db_load命令创建的vuser.db,但在此处不能加.db后缀。

然后修改配置文件

anonymous_enable=NO

local_enable=YES

write_enable=YES

anon_umask=022

guest_enable=YES

guest_username=vuser

pam_service_name=vuser

user_config_dir=/etc/vsftpd/vusers_dir 

 

然后在/etc/vsftpd/vusers_dir 目录下创建以用户名为文件名的文件

[root@localhost vsftpd]# mkdir vuser_dir

[root@localhost vsftpd]# cd vuser_dir

[root@localhost vuser_dir]# touch keke

[root@localhost vuser_dir]# touch lili

[root@localhost vuser_dir]# vim keke

anon_upload_enable=YES

anon_mkdir_write_enable=YES

 

 

 

注意:如果在实验中遇到问题,可考虑下面的办法:

selinux控制ftp的选项有:

[root@bogon ~]# getsebool -a | grep ftp

allow_ftpd_anon_write --> off

allow_ftpd_full_access --> off

allow_ftpd_use_cifs --> off

allow_ftpd_use_nfs --> off

ftp_home_dir --> off

ftpd_connect_db --> off

ftpd_use_passive_mode --> off

httpd_enable_ftp_server --> off

tftp_anon_write --> off

 

设置其中的选项

[root@bogon ~]# setsebool ftp_home_dir on

[root@bogon ~]# setsebool ftpd_connect_db on

[root@bogon ~]# setsebool alow_ftpd_anon_write on

[root@bogon ~]# setsebool allow_ftpd_full_access on

 

排错可参看/var/log/secure文件的内容或者查看日志。