大纲

一、ftp相关概念

二、ftp配置文件指令详解

三、vsftpd基于pam_mysql 实现虚拟用户访问

一、ftp相关概念

(1)、ftp

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

(2)、RPC(Remote Procedure Call)

能让位于不同主机上的两个进程之间基于二进制的方式进行数据通信

(3)、FTP两个连接

命令连接(21/tcp):传输一些控制指令的连接,如get、put等等

数据连接:专门用来传输数据文件的连接

主动模式:ftp服务器端主动使用自己的20号端口去连接客户端的端口

被动模式:再发出控制指令之后,ftp服务器端通过命令连接通知客户端自己已打开某个端口来等待客户端主动连接,此种模式被称为被动连接

(4)、ftp数据传输模式

文本格式:如html、text等

二进制格式:如mp3、jpeg等

(5)、数据的类型

结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据

半结构化数据:介于完全结构化数据(如关系型数据库、面向对象数据库中的数据)和完全无结构的数据(如声音、图像文件等)之间的数据,HTML文档就属于半结构化数据

非结构化数据:包括所有格式的办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等等

(6)、服务器端程序

    wu-ftpd

    vsftpd

    proftpd

    pureftpd

    filezilla

    Ser-U:windows

客户端程序

    CLI:ftp、lftp

    GUI:gfpd、FlashFXP、Cuteftp、FileZilla

(7)、ftp用户

匿名用户:anonymous

虚拟用户:

系统用户:

(8)、主动模式工作过程

①客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,该tcp连接的源端口为客户端指定的随机端口x,目的地端口(远程端口)为服务器上的21号端口。

②客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。

③服务器打开20号源端口并且创建和客户端数据端口的连接。此时,源端口为20,远程数据(目的地)端口为(x+1)。

④客户端通过本地的数据端口创建一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经创建好了一个连接。

(9)、被动模式工作过程

①客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,该tcp连接的源端口为客户端指定的随机端口x,目的地端口(远程端口)为服务器上的21号端口。

②当客户端发起get等控制命令时,服务器端会向客户端发送一个包含自己准备用来建立数据连接的随机端口Y(<1023<Y<65535)的报文。

③客户端接收到报文,就知道了服务器端准备打开哪个端口用于建立传输通道连接。然后客户端通过本地的x+1端口创建一个和服务器Y端口的连接。

④服务器打开Y源端口并且创建和客户端x+1端口此时,源端口为Y,远程数据(目的地)端口为(x+1)。然后向客户端发送一个应答,告诉客户端它已经创建好了一个连接。 

二、ftp配置文件指令详解

1、首先得安装vsftpd并启动vsftpd服务

[root@soysauce ~]# yum install -y vsftpd

2、配置文件指令详解

anonymous_enable=YES                      # 是否允许匿名用户登录,改为NO即不允许匿名用户登录anon_upload_enable=YES                    # 是否允许匿名用户上传文件anon_mkdir_write_enable=YES               # 是否允许匿名用户创建目录anon_mkdir_other_write_enable=YES         # 是否允许匿名用户删除文件local_enable=YES                          # 是否允许本地系统用户登录,注释此项即不允许系统用户登录write_enable=YES                          # 是否允许执行ftp写入操作(put、mput等)dirmessage_enable=YES                     # 是否在进入新目录时显示.message文件中的内容xferlog_enable=YES                        # 是否打开日志功能xferlog_file=/var/log/xferlog             # 定义日志的记录位置xferlog_std_format=YES                    # 定义日志是否记录为标准格式chown_uploads=YES                         # 定义用户上传文件之后是否更改属主chown_username=whoever                    # 定义用户上传文件之后属主更改为谁idle_session_timeout=600                  #  空闲会话连接时长,超时将断开连接data_connection_timeout=120               # 数据传输的连接时长,超时将断开连接chroot_local_user=YES                     # 是否禁锢系统用户,一旦启用,那么chroot_list中的用户不被禁锢chroot_list_enable=YES                    # 是否禁锢chroot_list中的用户chroot_list_file=/etc/vsftpd/chroot_list  # chroot_list文件保存位置listen=YES                         		  # 是否作为一个独立守护进程运行pam_service_name=vsftpd					  # vsftpd使用的pam服务名称user_list_enable=YES					  # 是否启用user_list文件配合userlist_deny=YES|NO控制用户登录userlist_deny=YES						  # 值为YES时,user_list为黑名单;值为NO时,user_list为白名单max_clients=N						      # 最多允许N个客户端同时连接ftpmax_per_ip=N 							  # 最多允许N个来自同一ip的客户端连接请求

三、vsftpd基于pam_mysql 实现虚拟用户访问

1、安装所需要程序

[root@soysauce ~]# yum install -y "vsftpd" "mysql-devel" "mysql-server" "pam_mysql"注意:pam_mysql由epel源提供,请自行配置epel源,我博文中有

2、创建虚拟用户账号及授权

[root@soysauce ~]# cat vsftpd.sql                     # 创建此sql脚本,方便重复使用# Create database create database vsftpd; # Grant the select privileges to the vsftpd usergrant select on vsftpd.* to vsftpd@localhost identified by 'redhat';grant select on vsftpd.* to vsftpd@127.0.0.1 identified by 'redhat';flush privileges; # Create the virtual user table for the two user: tom and jerryuse vsftpd;create table user (id int AUTO_INCREMENT NOT NULL,name char(20) binary NOT NULL,password char(48) binary NOT NULL,primary key(id)); # Insert two user to the table for authentication,the passwd you can defined it by yourselfinsert into user(name,password) values('tom',password('redhat'));insert into user(name,password) values('jerry',password('redhat'));[root@soysauce ~]# service mysqld startStarting mysqld:                                           [  OK  ][root@soysauce ~]# mysql -uroot -p < vsftpd.sql Enter password: [root@soysauce ~]# mysql -uroot -pEnter password: Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 15Server version: 5.1.73-log Source distributionCopyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> SHOW DATABASES;+--------------------+| Database           |+--------------------+| information_schema || mysql              || test               || vsftpd             |+--------------------+4 rows in set (0.00 sec)mysql> SELECT User,Host,Password FROM mysql.user;+--------+-----------+-------------------------------------------+| User   | Host      | Password                                  |+--------+-----------+-------------------------------------------+| root   | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 || root   | soysauce  | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 || root   | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 || vsftpd | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 || vsftpd | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |+--------+-----------+-------------------------------------------+5 rows in set (0.00 sec)mysql> SELECT * FROM vsftpd.user;+----+-------+-------------------------------------------+| id | name  | password                                  |+----+-------+-------------------------------------------+|  1 | tom   | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 ||  2 | jerry | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |+----+-------+-------------------------------------------+2 rows in set (0.00 sec)mysql> exitBye

3、配置vsftpd

(1)、建立pam认证所需文件

[root@soysauce ~]# vim /etc/pam.d/vsftpd.mysql[root@soysauce ~]# cat /etc/pam.d/vsftpd.mysql                    # 添加如下两行至文件中auth required /lib/security/pam_mysql.so user=vsftpd passwd=redhat host=localhost db=vsftpd table=user usercolumn=name passwdcolumn=password crypt=2account required /lib/security/pam_mysql.so user=vsftpd passwd=redhat host=localhost db=vsftpd table=user usercolumn=name passwdcolumn=password crypt=2[root@soysauce ~]# rpm -ql pam_mysql | grep "lib"/lib64/security/pam_mysql.so[root@soysauce ~]# cp /lib64/security/pam_mysql.so /lib/security/

(2)、建立虚拟用户映射的系统用户及对应的目录

[root@soysauce ~]# useradd -s /sbin/nologin -d /var/ftpshared/ ftpviruser[root@soysauce ~]# chmod go+rx /var/ftpshared/[root@soysauce ~]# ll /var/ftpshared/ -ddrwxr-xr-x 2 ftpviruser ftpviruser 4096 Dec 17 17:15 /var/ftpshared/

(3)、修改vsftpd的配置文件,使其适应mysql认证

启用以下选项:anonymous_enable=YESlocal_enable=YESwrite_enable=YESanon_upload_enable=NOanon_mkdir_write_enable=NOchroot_local_user=YESpam_service_name=vsftpd.mysql而后添加以下选项:guest_enable=YESguest_username=ftpviruser[root@soysauce ~]# service vsftpd restartShutting down vsftpd:                                      [  OK  ]Starting vsftpd for vsftpd:                                [  OK  ][root@soysauce ~]# netstat -tnlp | grep :21tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      60117/vsftpd

4、配置虚拟用户具有不同的访问权限

(1)、配置vsftpd为虚拟用户使用配置文件目录

[root@soysauce ~]# vim vsftpd.conf                    # 添加如下选项user_config_dir=/etc/vsftpd/vusers

(2)、创建所需要目录,并为虚拟用户提供配置文件

[root@soysauce ~]# mkdir /etc/vsftpd/vusers[root@soysauce ~]# cd /etc/vsftpd/vusers/[root@soysauce vusers]# touch tom jerry

(3)、配置虚拟用户的访问权限,写入文件中即可

anon_upload_enable={YES|NO}                            # 用户是否可上传文件anon_mkdir_write_enable={YES|NO}                       # 用户是否可创建目录anon_other_write_enable={YES|NO}                       # 用户是否可删除文件或目录用户最终权限取决于2点:文件系统权限和服务权限的交集[root@soysauce vsftpd]# cd vusers/[root@soysauce vusers]# pwd/etc/vsftpd/vusers[root@soysauce vusers]# lsjerry  tom[root@soysauce vusers]# vim tom [root@soysauce vusers]# cat tom                     # tom只能上传和下载文件anon_upload_enable=YES  [root@soysauce vusers]# vim jerry [root@soysauce vusers]# cat jerry                   # jerry可上传、下载、创建目录、删除文件和目录anon_upload_enable=YESanon_mkdir_write_enable=YESanon_other_write_enable=YES

注:如果是编译的mysql,rpm包装的pam_mysql,则可能出现如下报错

Dec 17 20:02:24 node1 vsftpd[42075]: pam_mysql - MySQL error (Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2))

默认pan_mysql模块会去/var/lib/mysql/mysql.sock下找socket,而真正的socket文件位于/tmp/mysql.sock,所以建立软链接链到/var/lib/mysql/mysql.sock即可正常登陆。

扩展阅读: