基于mysql保存用户名密码实现vsftpd虚拟用户
-
安装并配置mysql:
# 开始安装(注意版本,如果是5.X的版本,后续插入用户信息的时候,下面insert info那些语句会报错) [root@vsftpd ~]# yum -y install mariadb-server mariadb [root@vsftpd ~]# rpm -qa mariadb* mariadb-server-5.5.68-1.el7.x86_64 mariadb-libs-5.5.68-1.el7.x86_64 mariadb-5.5.68-1.el7.x86_64 [root@vsftpd ~]# systemctl start mariadb [root@vsftpd ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 5.5.68-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> create database vsftpd; # 创建数据库 Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> use vsftpd # 切换数据库 Database changed MariaDB [vsftpd]> create table users ( # 创建表 -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -> name CHAR(50) BINARY NOT NULL, -> password CHAR(50) BINARY NOT NULL -> ); Query OK, 0 rows affected (0.00 sec) MariaDB [vsftpd]> insert into users (name,password) values("eric", password("123456")); # 向表中加入登陆vsftpd的用户 Query OK, 1 row affected (0.01 sec) MariaDB [vsftpd]> insert into users (name,password) values("james", password("111111")); Query OK, 1 row affected (0.00 sec) # 创建可以访问数据库的用户并授权,供vsftpd程序使用。 MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'10.0.0.%' identified by '123456'; Query OK, 0 rows affected (0.01 sec) MariaDB [vsftpd]> flush privileges ; Query OK, 0 rows affected (0.00 sec)
使用mysql作为管理用户名、密码的工具,就需要用到pam-mysql模块,但是这个模块在centos7及以后的版本中不再支持了。所以我们需要手动安装一下:
下载地址:http://pam-mysql.sourceforge.net/
-
编译并安装pam-mysql:
# 在centos7上进行,如果是centos8及以后版本不可以 [root@vsftpd ~]# yum -y install gcc gcc-c++ make mariadb-devel pam-devel # 把下载的pam_mysql-0.7RC1.tar.gz包拷贝到Linux上并解压、编译 [root@vsftpd ~]# tar -zxvf pam_mysql-0.7RC1.tar.gz [root@vsftpd ~]# cd pam_mysql-0.7RC1 [root@vsftpd pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security [root@vsftpd pam_mysql-0.7RC1]# make install ...... Libraries have been installed in: /lib64/security # 已经安装到/lib64/security目录了 ...... See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- make[1]: Nothing to be done for `install-data-am'. make[1]: Leaving directory `/root/pam_mysql-0.7RC1' [root@vsftpd pam_mysql-0.7RC1]# ll /lib64/security/ -t # 查看新生成的文件 ... -rwxr-xr-x 1 root root 882 Aug 23 17:23 pam_mysql.la -rwxr-xr-x 1 root root 141712 Aug 23 17:23 pam_mysql.so ......
-
配置pam
[root@vsftpd vsftpd]# cat /etc/pam.d/vsftpd_mysql auth required /lib64/security/pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.3 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required /lib64/security/pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.3 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
配置说明:
auth:表示认证
account:表示验证账号密码正常使用
required:表示必须认证通过
/lib64/security/pam_mysql.so:这个时模块的路径,也可以写相对路径:pam_mysql.so(即只写文件名)
user:vsftpd程序登陆mysql的用户
passwd:vsftpd程序登陆mysql的用户密码
host:mysql服务器的主机名或ip地址
db:指定连接mysql服务器的数据库名
table:指令连接数据库中的哪个表
usercolumn:保存vsftpd用户名的字段
passwdcolumn:保存vsftpd的用户的用户密码的字段
crypt加密:用户密码的加密方式。0表示不加密,1表示crypt(3)加密,2表示使用mysql的password()函数加密
-
创建映射账户
[root@vsftpd vsftpd]# useradd -s /sbin/nologin -d /data/ftproot_dir2/ -r v_map_user2 [root@vsftpd vsftpd]# mkdir /data/ftproot_dir2 [root@vsftpd vsftpd]# chmod u-w /data/ftproot_dir2 # 还记得为什么要去掉写权限吗?
-
启用虚拟用户功能
# 完成配置如下: [root@vsftpd vsftpd]# cat vsftpd.conf | grep -v ^# anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd_mysql tcp_wrappers=YES guest_enable=YES guest_username=v_map_user2
-
验证
# 重启服务并验证 [root@vsftpd vsftpd]# systemctl restart vsftpd # 从另一个节点验证一下 [root@cloudstudy ~]# ftp 10.0.0.3 Connected to 10.0.0.3 (10.0.0.3). 220 (vsFTPd 3.0.2) Name (10.0.0.3:root): eric # 输入用户名 331 Please specify the password. Password: # 输入密码 230 Login successful. # 登陆成功
练习:
仿照“基于文件保存用户名密码实现vsftpd虚拟用户”章节的“权限优化”部分,实现:
-
eric用户有上传权限;james用户没有上传权限
-
eric用户的默认根目录在/data/eric_ftp_root下
小结:
-
登陆ftp的用户,该用户对ftp的根目录不能有写权限(文件系统层面)
-
虚拟用户登陆流程总结:
1)用户登陆时,ftp先验证该用户在文件或数据库中是否存在并验证其密码是否正确;
2)把登陆转换成系统用户
3)验证系统用户对根目录是否有写权限,如果有写权限,则禁止登陆;否则,登陆成功