在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

相关推荐

  • 利用DNS和SAMBA实现web站点的简单高可用

    本文通过DNS绑定两台主机的IP地址到一个URL,然后后台samba服务器提供站点文件,此处以wordpress为例。这样当有一台服务器httpd服务出现故障的时候不至于造成站点无法访问,而且站点数据和mysql数据库数据位于后台samba服务器,另一台服务器直接从samba服务器获取站点文件和数据库数据,不会造成数据的不一致。 一、实验环境: 三台主机ip…

    2017-06-06
  • linux系统启动详解

    主要内容: 系统启动过程 init启动过程 chkconfig的增,删,查 Linux组成 Linux: kernel+rootfs  kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能  rootfs:程序和glibc 库:函数集合, function, 调用接口…

    Linux干货 2016-09-08
  • 计算机网络基础

    1、OSI, TCP/IP, 五层协议的体系结构, 以及各层协议 OSI分层(7层): 物理层, 数据链路层, 网络层, 传输层, 会话层, 表示层, 应用层 TCP/IP分层(4层): 网络接口层, 网际层, 传输层, 应用层 五层协议(5层): 物理层, 数据链路层, 网络层, 运输层, 应用层 每一层的协议: 物理层: RJ45, CLOCK, IEE…

    Linux干货 2016-09-19
  • IP地址之IPv4

    一、概述   IP地址有IPv4和IPv6两个版本,目前我们通常所说的IP地址是指IPv4。   IP地址由32位的二进制数组合而成,为了方便人类记忆,将二进制转换成4个十进制的数值。   在这32位数据中分为网络号与主机号两个部分。 二、IP的分级   IP网段分为五个等级,其定义如下:   A类:规定前面…

    Linux干货 2016-02-14
  • find查找

    find查找是生产中最常见的日志查找工具 下面看看它的用法 基本用法: find    查找路径    查找标准    查找到以后的处理动作 查找路径:需要被查找的文件所在的路径,一定是个目录,默认情况下为当前的目录 查找的标准:查找的时候用什么方式去查找 处理动作:文件查找完毕后,需要对查找出来的…

    Linux干货 2017-05-08
  • 高级文件系统管理(swap,RAID,LVM)

    交换分区wasp swap文件系统:     linux上的交换分区必须使用独立的文件系统;         其文件系统的system ID必须为82 创建swap设备,文件系统,使用mkswap命令 创建步骤:   &…

    Linux干货 2016-08-30