在vsftp中实现基于pam_mysql的虚拟用户机制

FTP简介

在介绍vsftp相关内容前,简单描述下FTP。FTP全称File Transfer Protocol,文件传输协议。
它是一个C/S架构的协议,在Linux中其服务端实现主要有vsftpd,pureftpd,proftpd,Filezilla,本文主要介绍的是vsftp。客户端实现主要是ftp和lftp两种工具。
其工作方式:主要分为两个层面的连接:命令连接数据连接。通过ftp客户端向服务端发送相关指令,然后服务器对客户端的请求进行响应,这是命令连接。在数据连接层面则主要负责完成数据传输会话的建立,维持和断开。

数据连接的工作模式又分为两种类型:

  • 主动模式(PORT)
    服务器向客户端发起数据传输请求,连接建立后开始传输数据。但是客户端可能有防火墙设置,而不让服务器主动向其端口发送连接请求,从而连接无法建立,数据传输失败。在这种模式中服务器端使用tcp的20端口连接客户端的端口,客户端端口为命令连接发起端口+1的端口,依次往后找找,直到找到一个可用的端口。

  • 被动模式(Passive)
    客户端向服务器发送数据传输请求,服务器侧的端口半随机选择。在命令连接建立后的回复消息中,服务器会将数据连接要使用的端口以两个数字的形式告诉客户端,一般形为(123,221),客户端通过公式:123*256+221得到31709,从而与服务器的31709端口建立数据连接开始传输数据。这一端口信息在Linux中通过ftp工具连接服务器时即可看到,形如:227 Entering Passive Mode (192,168,1,200,103,163),这里的服务器侧的端口即为26531。

数据传输格式一般有ASCII和Binary两种,但一般最好让客户端和服务端自协商确实,不要在客户端强制设置,除非确定要传输的数据的格式,避免数据传输过程中出现乱码。

FTP的用户类型
FTP是给不同的用户提供文件传输服务的,每一个或每一类用户都可以设置不同的权限,他们的资源默认也都存储在他们各自的家目录中。FTP的用户分为以下三种类型:

  • 匿名用户
    这类用户在ftp上可以统称为anonymous,只要FTP允许匿名登录,在登录时输入用户名:anonymous,提示输入密码时留空,然后即可登录到FTP服务器上。FTP默认允许匿名用户登录。匿名用户一般被映射至某固定的系统用户,如ftp,其家目录为/var/ftp,登录后pwd显示为/,非系统的根,而是指ftp资源的根。

  • 本地用户
    本地用户即是指/etc/passwd中存在的用户。他们登录系统以后会位于自己的家目录中。默认情况下除了列于/etc/vsftpd/user_list中的用户之外的本地用户都可以登录ftp。

  • 虚拟用户
    虚拟用户的用户名不存在于/etc/passwd中,它的实现需要借助于pam_mysql这一模块,让vsftpd可以去mysql数据库中读取ftp用户的信息(用户名和密码)。默认情况下虚拟用户的权限等同于匿名用户。

vsftp的安装(CentOS 7)

  • vsftp安装前准备

    • 关闭系统防火墙:(不关闭的话,若懂得如何放行ftp通信也完全可以_)
      systemctl stop firewalld.service
      systemctl disable firewalld.service #关闭防火墙开机自启

    • 确认SELinux的状态
      getenforce,非enforcing即可。
      setenforce 0 #立即关闭SELinux,重启失效

  • 安装vsftp
    yum -y install vsftpd

  • 检查安装结果
    rpm -ql vsftpd
    列出vsftpd包安装后系统中生成的文件,包含文件的执行程序(如/usr/sbin/vsftpd),配置文件(如/etc/vsftpd/vsftpd.conf),参考手册,还有用于匿名用户访问的/var/ftp及/var/ftp/pub目录等。
    systemctl start vsftpd.service 启动vsftpd服务
    ss -tnlp 查看21端口是否处于监听状态,且占用进程为vsftpd。

  • 验证匿名用户是否可登录
    使用ftp或者lftp指令匿名登录,ftp工具在(ftp127.0.0.1)后出现提示询问用户名时输入:anonymous,密码留空即可。lftp工具指令( lftp -u anonymous, 127.0.0.1)即不用单独在输入用户名和密码。

借助pam_mysql实现虚拟用户机制

ftp的虚拟用户机制实际是指给不同的用户创建不同的用户名,他们有各自的密码,但这些用户名统一映射为一个自定义的虚拟用户,这个虚拟用户实际存在于/etc/passwd中但无需配置密码,针对这些不同的用户的认证都借助于存储在mysql数据库中的用户名和密码来实现。具体实现步骤如下:

  • 先下载pam_mysql源码安装包
    pam_mysql-0.7RC1.tar.gz 常用搜索引擎即可找到其下载页面。

  • 准备编译安装的环境
    yum groupinstall "Development Tools" "Server Platform Development" #这些是系统全局编译需要安装的包
    yum -y install mariadb-server mariadb-devel openssl-devel pam-devel#这些是编译pam_mysql源码依赖的包

  • 在mariadb中创建用于存储虚拟用户账户的数据库及表
    systemctl status mariadb.service #启用mariadb server服务
    systemctl enable mariadb.service #设置mariadb server开机自启
    create database vsftpd; #创建名为vsftpd的数据库
    use vsftpd #切换到vsftpd数据库中
    create table users ( id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
    name char(30) NOT NULL, password char(48) binary NOT NULL ); #指定表的内容包含id(整形数字,自动递增,不能为空,设为主键),name(长度不超过30且不区分大小写,非空字符),password(长度不超过48的区分大小写的非空字符)。

    创建完成后可使用如下指令,查看表的结构:
    desc users;

  • 在表中创建若干虚拟用户
    INSERT INTO users(name,password) VALUES ('tom',password('mageedu')) #添加用户tom,密码为mageedu
    INSERT INTO users(name,password) VALUES ('jerry',password('mageedu.com')); #添加用户jerry,密码为mageedu.com
    select * from users; #查看表中的所有信息
    GRANT select ON vsftpd.* TO vsftpd@'localhost' IDENTIFIED BY 'mageedu'; #授权“vsftpd@localhost”,可以使用密码mageedu访问数据库vsftpd的所有表
    GRANT select ON vsftpd.* TO vsftpd@'127.0.0.1' IDENTIFIED BY 'mageedu'; #授权“vsftpd@127.0.0.1”,可以使用密码mageedu访问数据库vsftpd的所有表
    flush privileges; #刷新mariadb的权限表
    然后使用刚授权的vsftpd用户直接在mariadb上登录,然后查看users表的内容,以确认mariadb部分的配置无误。

  • 编译安装pam_mysql模块
    这里是源码安装的通用三步,只是在configure时需要指定一些选项,以便编译成功。
    ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
    make && make install
    编译安装成功后会在/lib64/security中生成pam_mysql.sopam_mysql.la文件。

  • 在系统中创建用于虚拟用户映射的用户
    useradd -s /sbin/nologin -d /ftproot vuser #创建一个名为vuser的用户,并指定其shell为nologin,家目录为/ftproot,这样所有的虚拟用户登录ftp后系统中都将其映射为vuser这一用户,初始都位于/ftproot目录中。

  • 去掉刚创建的用户家目录的写权限
    chmod -w /ftproot #如果不做这一步后面在登录ftp时会出现如下错误提示:
    500 OOPS: vsftpd: refusing to run with writable root inside chroot() #去掉相应用户家目录的写权限即可。

  • 创建pam_mysql的配置文件
    这一文件的目的是告诉vsftp在验证用户信息时使用pam_mysql模块去mariadb数据库中查找用户信息以及查找方法。
    这一配置文件需要新建,它应放置于/etc/pam.d/目录下,直接vim vsftpd.mysql 在文件中放置如下两行内容,注意把以下内容放到两行
    auth required /usr/lib64/security/pam_mysql.so user=vsftpd
    passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

    account required /usr/lib64/security/pam_mysql.so user=vsftpd
    passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

    auth开头的是一行,它表示认证需要使用后面的内容,/usr/lib64/security/pam_mysql.so指定pam_mysql.so文件的位置;通过userpasswd两项指定连接数据库的用户名和密码;host指定连接数据库的主机,localhost即表示本机之意;dbtable一起指定去哪个数据库哪个表中查找用户信息,usercolumnpasswdcolumn指定表中哪列数据对应用户名,哪列数据对应密码;crypt指明表中密码的加密方式,2表示使用的mysql自带的password函数加密的。
    account开头的是另一行,它和auth一起完成用户的认证和审计工作。

  • 在vsftpd中启用基于pam_mysql的虚拟用户机制
    在vsftpd默认的配置文件/etc/vsftpd/vsftpd.conf中增加如下内容:
    guest_enable=YES #允许此项,所有非匿名用户都被视作来宾,来宾用户被重新映射为一个guest username
    guest_username=vuser #指定guest username的名称,之前我们已新建了vuser,用来将所有虚拟用户映射成为vuser
    pam_service_name=vsftpd.mysql #指定vsftp要使用哪种类型的pam服务,此前我们已安装和建立了名为vsftpd.mysql的服务类型
    systemctl restart vsftpd.service #修改了服务配置文件后重启服务,以使改动生效。
    修改服务配置文件前先做好备份,任何配置错误都将导致服务重启失败

实现不同用户使用不同的配置文件

在vsftp中支持给不同的用户使用不同的配置文件,从而实现不同的用户具有不同的权限,如有的用户能上传,有的用户不能上传,特别是在使用虚拟用户时,虽然它们都映射成同一账户但依然支持使用基于用户的配置文件。
实现方式:

  • 全局启用针对用户配置目录的配置
    /etc/vsftpd/vsftpd.conf中加入如下一项:
    user_config_dir=/etc/vsftpd/users.conf.d/ #将所有需要特别定制的用户配置文件放置于此目录中,若某用户在此目录中没有针对他的配置文件,则使用全局配置,有则相应配置文件中的条目最终生效。

  • 创建针对用户的配置文件
    /etc/vsftpd/users.conf.d/目录中创建和虚拟用户名一致的配置文件,vim username,按全局配置文件的格式将相应的指令添加进去,如全局启用了anon_upload_enable=YES但不想某用户具备上传的权限则可以在文件中直接写上anon_upload_enable=NO然后保存退出。
    最后重新启动vsftpd服务,登录验证是否符合需求即可。

原创文章,作者:N24_lantian,如若转载,请注明出处:http://www.178linux.com/66062

(0)
N24_lantianN24_lantian
上一篇 2017-01-07
下一篇 2017-01-07

相关推荐

  • iptables 入门

    iptables简单介绍    其实就是大家所熟知的基于命令行的防火墙工具,它使用规则链来允许或是阻止收发报文。当一条网络连接试图在你的系统中建立连接时,iptablels会查找其对应的匹配规则。如果找不到,iptables将对其采取默认的规则。  iptables基本的用法和常用代码 # iptables -vnL …

    Linux干货 2017-03-15
  • vim必掌握用法

    vim最入门用法大全

    Linux干货 2017-12-03
  • Linux进程及作业控制

    inux进程 进程的概念 当一个系统启动时,刚开机是第一个运行的是内核代码!先把内核放到cpu上运行,等内核控制和掌管了一切,有内核启动进程!然后创建第一个进程 init进程  内核空间 用户空间也都已被创建成功!后期的一切管理工作都由init来负责 init不能代表系统完成一些内核特权的执行!但由他负责向内核提交 他…

    Linux干货 2016-09-10
  • 用户管理简述

    组内用户管理汇总 基于组来管理用户 相关命令:gpasswd groupmems 添加用户 gpasswd -a wangcai group :向group里添加用户 wangcai gpasswd -M wangcai,xiaoqiang group :向group里批量添加xiaoqiang wangcai ,不过这个方式会覆盖之前的组员 groupme…

    2017-02-23
  • 0805随堂练习

    文本处理练习: 1.找出本机ip地址  [root@localhost ~]# ifconfig |head -2 |tail -1 |tr -s ' ' ':' |cut -d: -f3  10.1.252.221 2.查看本机分区最大的利用率  [root@localhost ~]# …

    Linux干货 2016-08-07
  • RPM的使用

    概述 RPM 是 Red Hat PackageManager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理;在Fedora 、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用; RPM包里面都包含什么?里面包含可执行的二进制程序,这个程序和W…

    Linux干货 2016-02-14