VSFTP完整系列教程

基于mysql保存用户名密码实现vsftpd虚拟用户

  1. 安装并配置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/

  1. 编译并安装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
......
  1. 配置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()函数加密

  2. 创建映射账户

    [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                                  # 还记得为什么要去掉写权限吗?
  3. 启用虚拟用户功能

    # 完成配置如下:
    [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
  4. 验证

    # 重启服务并验证
    [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虚拟用户”章节的“权限优化”部分,实现:

  1. eric用户有上传权限;james用户没有上传权限

  2. eric用户的默认根目录在/data/eric_ftp_root下

小结:

  1. 登陆ftp的用户,该用户对ftp的根目录不能有写权限(文件系统层面)

  2. 虚拟用户登陆流程总结:

    1)用户登陆时,ftp先验证该用户在文件或数据库中是否存在并验证其密码是否正确;

    2)把登陆转换成系统用户

    3)验证系统用户对根目录是否有写权限,如果有写权限,则禁止登陆;否则,登陆成功

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值