构建基于mysql数据库存储虚拟用户账号密码的vsftpd服务。
实验环境:
centos6:安装vsftpd服务、lftp客户端、pam_mysql包
注意:pam_mysql包由epel源提供
centos7:安装mariadb-server和mariadb-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 [email protected] 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表示明文,1和3表示使用MD5加密,4表示使用sha1加密,2表示使用mysql数据库的password()函数加密,但是可能出现的问题就是此处的加密方式和数据库处的加密方式不同从而导致认证不会通过。此处的host有三种方式:
1. absolute path to the unix socket (e.g. "/tmp/mysql.sock") // vsftpd和mysal在同一主机
2. host name (e.g. "somewhere.example.com") //vsftpd和mysal不在同一主机
3. host name + port number (e.g. "somewhere.example.com:3306")//vsftpd和mysal不在同一主机
第三步:配置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.mysql是pam认证的文件
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命令是由db4―utils包提供的)
[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文件的内容或者查看日志。