一、ftp基础知识

(一)、文件共享服务按照工作的平台可分为三种:


① 工作于应用层:ftp

② 工作于内核:nfs (network file system,Sun公司开发,无法跨平台,只能在linux和linux之间、linux与unix之间共享文件,不能在linux和windows之间共享)

③ 跨平台:samba

在Linux中CIFS(一开始叫SMB协议,service message block,但名字冲突没法注册)协议的实现

Common Internet File System



(二)、ftp: File Transfer Protocol

提供本地主机和远程主机之间传送文件服务。包括上传、下载、文件权限修改,比http更复杂。

1、应用层协议:

tcp, 默认21/tcp,即使处于同一主机,客户端和服务器端也是通过套接字进行联系的。

2、属于C/S架构:

Client: 程序

Server: 程序


3、连接类型:

① 命令连接:文件管理类命令,始终在线的连接,直到用户退出

② 数据连接:数据传输,按需创建及关闭的连接


ftp数据传输格式有两种格式:

①文本传输,也即ASCII码传输格式

②二进制传输

具体采用哪种格式是根据传输内容来确定的,除非配置中明确指定。

而且数据的传输都是明文的,非常不安全。


4、连接方式有两种:

① 主动连接:由服务器创建连接

命令连接:

客户端以随机端口号发起,去连接服务器端的21号端口

Client:50000 --> Server: 21

数据连接:

要传输数据时,服务器端主动发起连接请求,以自己的20号端口去连接客户端原来(命令端口号+1)的端口,建立通信。

Server: 20/tcp --> Client: 50000+1

(虽然发起数据连接的是20号端口,但因为可能有多个并发连接,所以同20号建立数据连接后就会转为其他端口进行实际的数据传输。)

主动连接对于客户端来说不是安全的,当客户端开了防火墙时就建立不了数据连接了。


② 被动连接:由客户端主动发并创建连接,现在基本上都是这种模式。

命令连接:

Client:50000 --> Server: 21

数据连接:

客户端发送要建立数据连接的请求后,服务器端就会告诉客户端一个端口号一组数字,由这组数字计算端口号。

如 121,23,则随机端口号就是 121*256+23

Client:50000+1 --> Server: 随机端口

当服务器端开启了防火墙时,防火墙就需要使用连接追踪(connect track)功能使得数据连接能建立。


5、响应码:response code

1xx: 信息

2xx: 成功类的状态码

3xx: 提示需进一步提供补充类信息的状态码

4xx: 客户端错误

5xx: 服务端错误


6、ftp用户认证方式有三种:

(1) 虚拟用户:

与操作系统没有关系,但是是程序软件能自我识别的一个文件或者一个表当中存放的帐号和密码的用户。

仅用于访问某特定服务中的资源

是为了隔离与操作系统用户交叉混淆而提供的。


两种实现虚拟用户功能的方法:

① nsswitch: network service switch, 名称解析框架

配置文件:/etc/nsswitch.conf

模块:/lib64/libnss*, /usr/lib64/libnss*

② pam: pluggable authentication module, 用户认证框架,SUN公司研发

模块:/lib64/security/

配置文件:/etc/pam.conf, /etc/pam.d/*


(2) 系统用户:

早期ftp是使用的系统用户,现在可以使用虚拟用户了,但默认是使用系统用户。

所以,直接找/etc/passwd下的用户也能访问的。

(3) 匿名用户:

比如用ftp直接登录,不需要密码

上面三种用户,虽然各有各的不同,但最终都需要映射成系统上的某个用户才能使用系统文件的。

ftp不支持模块化编译,也无法自我管理,要使用这些功能,就需要都编译进来,或者借助别的统一框架实现,如pam、nsswitch。

7、C/S:

Server常用的程序有:

wu-ftpd :华盛顿大学研发的

proftpd : 专业的ftp,开源

pureftp : 纯粹的ftp,开源

vsftpd  :  Very Secure ftp ,开源

ServU : 在windows上使用的


Client常用工具:

     开源的有:

ftp

lftp, lftpget

wget, curl

filezilla :对应的服务器端有linux的,也有windows的,可以跨平台

gftp(Linux GUI)

      商业的有:

flashfxp

cuteftp

二、vsftp基础知识

CentOS 6.5: vsftpd-2.2.2-12.el6_5.1.x86_64

用户认证配置文件:/etc/pam.d/vsftpd

默认是使用系统用户帐号来认证的

如果需要改变认证方式,就需要修改这个配置文件

服务脚本:/etc/rc.d/init.d/vsftpd

配置文件目录:/etc/vsftpd

主配置文件:/etc/vsftpd/vsftpd.conf

(也只有这一个配置文件)

其他文件是跟用户配置有关的:

/etc/vsftpd/ftpusers

/etc/vsftpd/user_list

/etc/vsftpd/vsftpd_conf_migrate.sh

主应用程序: /usr/sbin/vsftpd

家目录的设置:

① ftp用户的家目录为:  /var/ftp

② 匿名用户(映射为ftp用户)共享资源位置:  /var/ftp

③ 系统用户通过ftp访问的资源的位置:  用户自己的家目录

④ 虚拟用户通过ftp访问的资源的位置:  给虚拟用户指定的映射成为的系统用户的家目录


        主配置文件常用配置介绍

        /etc/vsftpd/vsftpd.conf

注:要想一条设置其效用,除了需要去掉行首的#号,还需要整行顶格,不能有任何空白字符在行首

1、 匿名用户的配置:

匿名用户的上传权限、创建权限、删除权限是分开的,需要分别授权

①anonymous_enable=YES : 控制是否允许匿名用户访问

②anon_upload_enable=YES : 控制能发上传文件

(启用这个后,如果需要其效用,必须得先启用write_enable=YES)

③anon_mkdir_write_enable=YES :控制能否创建目录

④anon_ohter_write_enable=YES :控制能否删除文件

对应用户上传的网络共享文件的权限,取决于共享权限与文件系统权限的交集

2、系统用户的配置:

系统用户(即本地用户)的上传权限、创建权限、删除权限是直接跟系统一样的,只需一个设置即可。

local_enable=YES


write_enable=YES

local_umask=022 :控制通过ftp创建文件时的文件权限


禁锢所有的ftp本地用户于其家目录中:

chroot_local_user=YES


禁锢文件中指定的ftp本地用户于其家目录中:

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list


3、日志:

xferlog_enable=YES  :是否启动传输日志

xferlog_std_format=YES :传输日志是否使用标准格式

xferlog_file=/var/log/xferlog :指定日志记录地址,没有启用是不会记录日志的


4、改变上传文件的属主:

chown_uploads=YES :是否允许改变上传文件的属主属组

chown_username=whoever : 改变上传文件的属主属组为whoever(这个词需要改为自己想要的那个用户名)

5、通知消息

diemessage_enable=YES :是否给登录的远程用户在进入某个目录时显示设置好的信息

启动后只需要在这个目录下建一个隐藏文件 .message 文件,里面写上需要显示的信息即可。

6、时间

idle_session_timeout=600 :空闲回话超时时长

data_connection_timeout=120 : 数据下载上传连接的超时时长

ftpd_banner=Welcome to blah FTP service.:用户登录时显示的欢迎信息


7、vsftpd使用pam完成用户认证,其用到的pam配置文件:

pam_service_name=vsftpd :使用pam认证的配置文件为/etc/pam.d/vsftpd 

8、是否启用控制用户登录的列表文件

userlist_enable=YES :是否启用/etc/vsftpd/user_list

userlist_deny=YES|NO :YES表示是黑名单,在名单上的不能远程ftp登录;NO表示是白名单,不在名单上的不允许ftp登录


默认文件为/etc/vsftpd/user_list


9、连接限制:

max_clients: 最大并发连接数;

max_per_ip: 每个IP可同时发起的并发请求数;


10、传输速率:

anon_max_rate: 匿名用户的最大传输速率, 单位是“字节/秒”;

local_max_rate: 本地用户。。。



虚拟用户账号的存储方式:

①文件:编辑文件

奇数行为用户名

偶数行为密码


②关系型数据库中的表中:

即时查询数据库完成用户认证;

一般是用mysql库,

因为vsftp一般是用pam做认证的,而pam要依赖于pam_mysql才能与mysql打交道,所以,需要事先安装pam_mysql。


三、vsftpd+pam+mysql

目的:

1、配置vsftp服务,

2、配置不同权限的虚拟用户帐号访问

3、虚拟用户的帐号密码存储于mysql数据库中


(一)、安装所需要程序


安装mysql和pam_mysql

配置好yum源

[root@aunt-s ~]# yum -y install vsftpd mysql-server mysql-devel pam_mysql


总共安装的程序包如下:

Installed:
  mysql-devel.x86_64 0:5.1.73-3.el6_5  mysql-server.x86_64 0:5.1.73-3.el6_5 
  pam_mysql.x86_64 1:0.7-0.12.rc1.el6  vsftpd.x86_64 0:2.2.2-12.el6_5.1     
Dependency Installed:
  keyutils-libs-devel.x86_64 0:1.4-5.el6                                     
  krb5-devel.x86_64 0:1.10.3-33.el6                                          
  libcom_err-devel.x86_64 0:1.41.12-21.el6                                   
  libselinux-devel.x86_64 0:2.0.94-5.8.el6                                   
  libsepol-devel.x86_64 0:2.0.41-4.el6                                       
  mysql.x86_64 0:5.1.73-3.el6_5                                              
  openssl-devel.x86_64 0:1.0.1e-30.el6                                       
  perl-DBD-MySQL.x86_64 0:4.013-3.el6                                        
  zlib-devel.x86_64 0:1.2.3-29.el6
[root@holding ~]# rpm -q vsftpd mysql-server mysql-devel pam_mysql
vsftpd-2.2.2-12.el6_5.1.x86_64
mysql-server-5.1.73-3.el6_5.x86_64
mysql-devel-5.1.73-3.el6_5.x86_64
pam_mysql-0.7-0.12.rc1.el6.x86_64



注意:pam_mysql由epel源提供。


(二)、创建虚拟用户账号


1.准备数据库及相关表


首先请确保mysql服务已经正常启动。而后,按需要建立存储虚拟用户的数据库即可,这里将其创建为vsftpd数据库。

[root@aunt-s ~]# chkconfig | grep mysql
mysqld         0:off1:off2:off3:off4:off5:off6:off
[root@aunt-s ~]# chkconfig --add mysqld
[root@aunt-s ~]# chkconfig mysqld on
[root@aunt-s ~]# chkconfig | grep mysql
mysqld         0:off1:off2:on3:on4:on5:on6:off
[root@aunt-s ~]# ss -tnlp | grep mysql ——无显示结果,表示还没有启动
[root@aunt-s ~]# service mysqld start
[root@aunt-s ~]# mysql
mysql> create database vsftpd;


创建虚拟用户的帐号数据库


mysql> GRANT SELECT ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'vsftpd';
mysql> GRANT SELECT ON vsftpd.* TO 'vsftpd'@'172.0.0.1' IDENTIFIED BY 'vsftpd';
授权本机的vsftpd用户凭密码vsftpd访问vsftpd数据库,且只有查询权限
mysql> flush privileges; 
mysql> use vsftpd;
mysql> CREATE TABLE users(id int AUTO_INCREMENT NOT NULL,name char(20) binary NOT NULL,password char(48) binary NOT NULL,primary key(id));


创建用户帐号密码数据表,其中id是整型,主键,自动增加,非空;名字是定长20字节的字符型数据,二进制格式,非空;密码是48字节定长字符,二进制,非空


2、添加测试的虚拟用户


根据需要添加所需要的用户,需要说明的是,这里将其密码为了安全起见应该使用PASSWORD函数加密后存储。


mysql> insert into users(name,password) values('tom',password('123456'));
mysql> insert into users(name,password) values('kate',password('123456'));


(三)、配置vsftpd


1.建立pam认证所需文件


#vim /etc/pam.d/vsftpd.mysql

添加如下两行

auth required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
[root@aunt-s ~]# rpm -ql pam_mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7
/usr/share/doc/pam_mysql-0.7/COPYING
/usr/share/doc/pam_mysql-0.7/CREDITS
/usr/share/doc/pam_mysql-0.7/ChangeLog
/usr/share/doc/pam_mysql-0.7/NEWS
/usr/share/doc/pam_mysql-0.7/README
[root@aunt-s ~]# less /usr/share/doc/pam_mysql-0.7/README

wKiom1VRWwbiasZfAAKkugzx-2M167.jpg


注:1、32位和64位的pam_mysql.so位置不一样,用# rpm -ql pam_mysql 查询

      2、由于mysql的安装方式不同,pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。


2.修改vsftpd的配置文件,使其适应mysql认证


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

[root@aunt-s ~]# useradd -s /sbin/nologin -d /var/ftproot vuser
[root@aunt-s ~]# chmod go+rx /var/ftproot

确保 /etc/vsftpd/vsftpd.conf中已经启用了以下选项

[root@aunt-s ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES  启用匿名用户登录
local_enable=YES 启用本地系统用户登录
write_enable=YES 本地系统用户可写
anon_upload_enable=NO 匿名用户不能上传
anon_mkdir_write_enable=NO 匿名用户不可写
chroot_local_user=YES 锁定系统用户帐号在其家目录



而后添加以下选项

guest_enable=YES  来宾帐号启用
guest_username=vuser 来宾帐号名字为vuser

并确保pam_service_name选项的值如下所示

pam_service_name=vsftpd.mysql


(四)、启动vsftpd服务


[root@aunt-s ~]# chkconfig vsftpd on
[root@aunt-s ~]# chkconfig | grep vsftp
vsftpd         0:off1:off2:on3:on4:on5:on6:off
[root@aunt-s ~]# service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]



查看端口开启情况


[root@aunt-s ~]# ss -tnlp | grep vsftp
tcp    LISTEN     0      32                     *:21                    *:*      users:(("vsftpd",2287,3))

使用虚拟用户登录,验正配置结果,以下为本机的命令方式测试,你也可以在其它Win Box上用IE或者FTP客户端工具登录验正

[root@aunt-s ~]# yum install -y ftp
Installed:
  ftp.x86_64 0:0.17-54.el6
Complete!

wKiom1VRWsLBd_mYAAXwtxucPQ8842.jpg


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


vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。


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


[root@aunt-s vsftpd]# vim /etc/vsftpd/vsftpd.conf

添加如下选项

user_config_dir=/etc/vsftpd/vusers_config


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


[root@aunt-s vsftpd]# mkdir /etc/vsftpd/vusers_conf
[root@aunt-s vsftpd]# cd /etc/vsftpd/vusers_conf
[root@aunt-s vusers_conf]# ls
[root@aunt-s vusers_conf]# touch tom kate



3、配置虚拟用户的访问权限


虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。比如,如果需要让tom用户具有上传文件的权限,可以修改/etc/vsftpd/vusers_config/tom文件,在里面添加如下选项即可。

[root@aunt-s vusers_conf]# vim /etc/vsftpd/vusers_conf/tom
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

让kate只有读权限

[root@aunt-s vusers_conf]# vim /etc/vsftpd/vusers_conf/kate
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

wKiom1VRWuCBetvXAAVN7***fBI488.jpg