zoukankan      html  css  js  c++  java
  • 实现基于pam认证的vsftpd

    1 需求

    使用指定虚拟用户Allen与Barry登录ftp,认证的源是mysql服务器;
    Allen可以上传文件,Barry不可以上传文件;
    

    2 环境

    [root@centos7 ~]# cat /etc/redhat-release 
    CentOS Linux release 7.4.1708 (Core)
    [root@centos7 ~]# uname -r
    4.18.14-1.el7
    vsftpd-3.0.2-22.el7.x86_64
    pam-1.1.8-22.el7.x86_64
    mariadb-libs-5.5.60-1.el7_5.x86_64
    pam_mysql-0.7RC1.tar.gz
    
    mysql服务器:10.207.51.40
    vsftp服务器:10.207.51.31
    

    3 安装开发环境与编译所需的依赖

    yum -y groupinstall "Development Tools" "server Platform Development"
    yum -y install mariadb-devel openssl-devel pam-devel
    

    4 配置vsftp服务器

    4.1 安装vsftp服务器

    yum install -y vsftpd

    4.2 修改配置文件

    有很多默认参数,不用去管,有标注的参数为本次实验关键参数
    anonymous_enable=NO
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_file=/var/log/xferlog
    xferlog_enable=YES
    xferlog_std_format=YES
    dual_log_enable=YES
    vsftpd_log_file=/var/log/vsftpd.log  
    use_localtime=YES
    ascii_upload_enable=YES
    ascii_download_enable=YES
    listen=YES
    listen_ipv6=NO
    userlist_enable=YES
    tcp_wrappers=YES
    
    当chroot_list_enable=NO,chroot_local_user=YES时,所有的用户均不能切换到其他目录。
    chroot_list_enable=NO
    chroot_local_user=YES
    
    local_enable=YES								##允许本地用户登录,虽然使用的虚拟用户,但是虚拟用户适合本地用户vuser关联了的
    write_enable=YES								##允许写入
    local_root=/var/ftp							##指定本地用户登录后的目录
    pam_service_name=vsftpd.mysql					##指定pam文件,这是相对路径,等于/etc/pam.d/vsftpd.mysql,这里也可以写全路径
    guest_enable=YES								##允许虚拟用户登录
    guest_username=vuser							##指定虚拟用户要映射成哪个本地用户
    allow_writeable_chroot=YES					##默认情况下ftp根目录的ogt都不能有w权限,开启其选项后可以设置w权限;
    user_config_dir=/etc/vsftpd/vusers.conf.d	##指定虚拟用户配置文件目录,目录中的每个配置文件的名字对应一个虚拟用户的名字;
    

    4.3 创建虚拟用户配置文件

    文件名称要与虚拟用户命名完全一致
    mkdir /etc/vsftpd/vusers.conf.d 
    echo ' anon_upload_enable=YES' > /etc/vsftpd/vusers.conf.d/Allen
    echo ' anon_upload_enable=NO' >  /etc/vsftpd/vusers.conf.d/Barry
    

    4.4 编译安装pam_mysql模块

    也可以通过epel源安装
    tar xf pam_mysql-0.7RC1.tar.gz
    cd pam_mysql-0.7RC1
    ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
    make
    make install
    

    4.5 创建vsftp连接mysql使用的pam文件

    vim /etc/pam.d/vsftpd.mysql 
    auth required pam_mysql.so user=vsftpd passwd=123123 host=jzbg db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 verbose=1
    account required pam_mysql.so user=vsftpd passwd=123123 host=jzbg db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 verbose=1
    
    配置字段说明:
    auth 表示认证;
    required 用于认证登录mysql数据库;
    account 用于验证登录ftp使用的虚拟账号的密码;
    pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数;
    user=vsftpd为 登录mysql的用户;
    passwd=mageedu 登录mysql的的密码;
    host=localhost 在mysql中定义的允许连接的主机名或ip地址;
    db=vsftpd 连接msyql的哪一个库;
    table=users 连接库里的哪一个表;
    usercolumn=name 当做用户名的字段
    passwdcolumn=password 当做用户名字段的密码
    crypt=2 密码的加密方式为mysql password()函数加密;
    verbose=1 会打印详细的日志,可以再/var/log/secure中看到;
    

    4.6 重启服务

    systemctl restart vsftpd.service

    5 mysql服务器配置

    5.1 安装mariadb服务器

    yum -y install mariadb_server

    5.2 启动mariadb

    systemctl enable mariadb.service && systemctl start mariadb.service

    5.3 更改mariadb配置文件

    在/etc/my.cnf文件的[mysqld]中增加skip-name-resolve=ON
    [mysqld]
    skip-name-resolve=ON
    

    5.4 创建并配置数据库

    mysql
    CREATE DATABASE vsftpd;
    use vsftpd;
    CREATE TABLE users (id int AUTO_INCREMENT NOT NULL PRIMARY KEY, name char(30) NOT NULL, password char(48) binary NOT NULL);
    INSERT INTO users(name,password) VALUES ('Allen',password('123123'));
    INSERT INTO users(name,password) VALUES ('Barry',password('123123'));
    
    很有可能,pam-mysql模块支持的加密方式,与mysql或 mariadb加密方式不兼容;如果不兼容,则需要把密码改为明文格式:
    INSERT INTO users(name,password) VALUES ('tom',123123);
    INSERT INTO users(name,password) VALUES ('jerry',123123);
    
    允许vsftp服务器使用vsftpd用户读取vsftpd数据库到的表
    如果将vsftp与mysql安装在一台机器上,则可以将地址改为127.0.0.1
    GRANT SELECT ON vsftpd.* TO vsftpd@'10.207.51.31' IDENTIFIED BY '123123';
    
    刷新权限
    FLUSH PRIVILEGES;
    

    6 访问测试

    Allen用户可以上传文件,结果为正确
    [root@~]$ftp 10.207.51.31
    Connected to 10.207.51.31 (10.207.51.31).
    220 (vsFTPd 3.0.2)
    Name (10.207.51.31:root): Allen
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> put all.csv
    local: all.csv remote: all.csv
    227 Entering Passive Mode (10,207,51,31,67,156).
    150 Ok to send data.
    226 Transfer complete.
    6406155 bytes sent in 0.483 secs (13255.36 Kbytes/sec)
    
    
    Barry用户不可以上传文件,结果为正确
    [root@~]$ftp 10.207.51.31
    Connected to 10.207.51.31 (10.207.51.31).
    220 (vsFTPd 3.0.2)
    Name (10.207.51.31:root): Barry
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> ls 
    227 Entering Passive Mode (10,207,51,31,238,18).
    150 Here comes the directory listing.
    -rw-------    1 1002     1002      6406155 Dec 20 14:38 all.csv
    226 Directory send OK.
    ftp> put all2.csv
    local: all.csv remote: all2.csv
    227 Entering Passive Mode (10,207,51,31,190,67).
    550 Permission denied.
    
  • 相关阅读:
    My SQL
    弹窗
    DBDA
    ThinkPHP验证码与文件上传
    ThinkPHP表单验证
    ThinkPHP增删改
    ThinkPHP模型(查询)
    ThinkPHP跨控制器调用方法
    Superset安装
    Presto资源组配置
  • 原文地址:https://www.cnblogs.com/jzbgltb/p/10172500.html
Copyright © 2011-2022 走看看