在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)
上一篇 2017-01-07 14:22
下一篇 2017-01-07 16:43

相关推荐

  • 计算机基础知识及基本命令(20170214)

    计算机基础知识 操作系统相关 linux分区介绍 安装linux linux基本命令    一、计算机基础知识       计算机(computer):计算机(Computer):俗称电脑,是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速地处理,然后把处理结果输出的现代化智能电子设备 …

    Linux干货 2017-02-14
  • 上古神器之vim

    sed 前言:前面学到了文本处理三剑客之一grep,但是grep在有些时候显得力不从心,我们需要一款针对行操作的处理工具,没错,这就是sed流编辑器。 sed用法提炼: sed 's/(text1)(text2)(text3)/\1\2\3/'  vim 前言:强大的Linux如果没有一款疯狂的编辑器,常用的编辑操作会…

    Linux干货 2016-08-12
  • Linux系统用户、组

    1、资源分派:          Authentication  认证        Authorization   授权     &nbs…

    Linux干货 2016-08-04
  • FHS文件系统各目录功能

        FHS文件系统各目录功能 前言                  FHS (Files system Hiserarchy Standard)…

    Linux干货 2016-10-17
  • LINUX下用户管理命令简述

    LINUX下用户管理命令简述 添加用户并设置密码 useradd [用户名] 创建用户 [root@localhost ~]# useradd jack [root@localhost ~]# cat /etc/shadow | grep jack jack:!!:17257:0:99999:7::: passwd [用户名] 设置密码 [root@loca…

    Linux干货 2017-04-05
  • 第三周学习总结之简单文本处理

    写在最前 通过前面的学习,我们已经知道Linux是一个一切皆文件的系统,因此对文件的处理就显得尤为重要,到目前为止,对于新手来说可能连鼎鼎大名的三剑客也未必听过,不过在这之前我们也可以使用一些非常好用的文本处理工具来完成一些简单文件的处理。本次内容就是讲讲如何使用几个简单文本处理工具的组合完成一些实用的功能。 文本处理工具 文本处理工具,用我的理解就是能够对…

    2017-12-19