Vsftp精解之安装配置及原理(一)

简介

    Vsftp(Very Secure FTP)是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,是一款小巧而又易用FTP服务器程序,Vsftpd 在安全性、高性能及稳定性三个方面有很好的表现。它提供的主要功能包括虚拟IP设置、虚拟用户、Standalone、inetd操作模式、强大的单用户设置能力及带宽限流等。在安全方面,它从原理上修补了大多数Wu-FTP、ProFTP,乃至BSD-FTP的安装缺陷,使用安全编码技术解决了缓冲溢出问题,并能有效避免“globbing”类型的拒绝服务攻击。

Windows下常用Ftp服务器软件: Serv-U、IIS、Filezilla

Linux下Ftp服务器软件:Filezilla、Vsftpd、wuftpd、proftpd 、pureftp

Vsftp的特点:

1、它是一个安全、高速、稳定的FTP服务器
2、它可以做基于多个IP的虚拟FTP主机服务器
3、匿名服务设置十分方便
4、匿名FTP的根目录不需要任何特殊的目录结构,或系统程序或其它的系统文件
5、不执行任何外部程序,从而减少了安全隐患
6、支持虚拟用户,并且每个虚拟用户可以具有独立的属性配置
7、可以设置从inetd中启动,或者独立的FTP服务器两种运行方式
8、支持两种认证方式(PAP或xinetd/ tcp_wrappers)

   9、支持带宽限制

 


目录  

    一.Ftp原理与vsftpd安装

    二.配置文件介绍

    三.配置用户支持上传和下载限制用户连接数及速率   用户类型:

        匿名用户:在默认安装后,系统只提供匿名用户访问(服务器端自动映射的一个系统用户)

        本地用户:/etc/passwd中的用户名为认证方式(默认root和id号小于500的用户都禁止访问)

        虚拟用户:支持将用户名和口令保存在数据库文件或数据库服务器中。事实上多个虚拟用户同时被映射为同一个系统用户,但不同的虚拟用户可以具有不同的访问权限 

    四.搭建支持SSL加密传输的vsftpd

 


一、Ftp原理

1、FTP Transfer Protocol 件传输协议的缩写,FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道;如下图:

 

    控制通道:控制通道是和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的, PI称为控制连接

    数据通道:数据通道是和FTP服务器进行文件传输或者列表的通道。

    FTP协议中,控制连接均有客户端发起,而数据连接有两种工作方式:PORT方式和PASV方式,DTP称为数据连接

 PASV模式(被动方式)

 在建立控制通道的时候和PORT模式类似,当客户端通过这个通道发送 PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接传送数据。

PORT模式(主动方式)

FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口(一个大于1024的端口)接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

  如果从C/S模型这个角度来说,PORT对于服务器来说是OUTBOUND,而PASV模式对于服务器是INBOUND,这一点请特别注意,尤其是在使用防火墙的企业里,这一点非常关键,如果设置错了,那么客户将无法连接。

2、安装Vsftp软件包

   这里我们采用rpm安装方式,系统版本:CentOS6.4_x86_64   软件版本vsftpd.x86_64-2.2.2-11.el6_3.1

1
2
3
4
5
[root@localhost ~]# rpm -q vsftpd                  #查询是否安装Vsftp
package vsftpd is not installed                    #提示没有安装
[root@localhost ~]# yum list|grep vsftpd           #使用Yum安装,需要配置好Yum才能使用,当然也可以从光盘映像安装
[root@localhost ~]# rpm -q vsftpd                  #再查看是否安装成功
vsftpd-2.2.2-11.el6_3.1.x86_64                     #已经安装成功

 


二、配置文件介绍及详解主配置文件

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# rpm -qc vsftpd           #查询vsftpd的配置文件
/etc/logrotate.d/vsftpd                      #日志文件
/etc/pam.d/vsftpd                            #PAM认证文件
/etc/rc.d/init.d/vsftpd                      #服务启动脚本
/etc/vsftpd                                  #Vsftpd配置文件存放路径
/etc/vsftpd/ftpusers                         #禁止使用Vsftpd的用户列表文件
/etc/vsftpd/user_list                        #禁止或允许使用Vsftpd的用户列表文件
/etc/vsftpd/vsftpd.conf                      #主配置文件
/etc/vsftpd/vsftpd_conf_migrate.sh           #vsftpd操作的一些变量和设置
/usr/sbin/vsftpd                             #Vsftpd执行程序
/var/ftp                                     #匿名用户目录
/var/ftp/pub                                 #默认匿名用户存放文件目录

下面主要对主配置文件的一些指令做详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
anonymous_enable=YES                         #是否允许匿名用户访问
local_enable=YES                             #是否允许本地用户访问
write_enable=YES                             #全局配置是否对Ftp服务器有可写权限
local_umask=022                              #用户上传的文件权限
anon_upload_enable=YES                       #是否允许匿名用户上传文件,须开启全局配置可写权限
anon_mkdir_write_enable=YES                  #是否允许匿名用户创建目录
anon_other_write_enable=YES                  #是否允许匿名用户有写入权限
dirmessage_enable=YES                        #当使用者切换目录,会显示该目录下的.message文件中内容
xferlog_enable=YES                           #记录使用者所有上传下载信息
connect_from_port_20=YES                     #确定端口连接是20端口
chown_uploads=YES                            #是否允许改变上传文件的属主,与下面配合使用
chown_username=whoever                       #上传文件的属主,whoever任何人
xferlog_file=/var/log/xferlog                #将上传下载信息记录到日志
xferlog_std_format=YES                       #日志使用标准格式
idle_session_timeout=600                     #数据传输结束后,保持连接的超时时间
data_connection_timeout=120                  #数据连接超时时间
nopriv_user=ftpsecure                        #运行Vsftp需要非特权系统用户
async_abor_enable=YES                        #如果Ftp_client会下达“async abor”这个指令需要开启
ascii_upload_enable=YES                      #是否以ASCII方式传输数据
ascii_download_enable=YES
ftpd_banner=Welcome to blah FTP service.     #Ftp欢迎信息
deny_email_enable=YES                        #黑名单设置
banned_email_file=/etc/vsftpd/banned_emails  #当上面一个选项开启,可以设置哪些邮箱地址不能登录Ftp服务器
chroot_local_user=YES                        #设置是否禁锢用户目录,与下面一项配合使用
chroot_list_enable=YES                       #如果开启三个chroot选项,chroot_list文件相当于白名单
chroot_list_file=/etc/vsftpd/chroot_list     #在些文件中的用户登录后只能在指定的目录中活动
ls_recurse_enable=YES                        #是否允许递归
listen=YES                                   #是否监听
listen_ipv6=YES                              #是否监听Ipv6
pam_service_name=vsftpd                      #设置PAM模块提供的认证服务所使用的配置文件名
userlist_enable=YES                          #是否允许user_list用户文件中的用户登录
tcp_wrappers=YES                             #是否使用些方式作为访问控制方式
anon_max_rate=0                              #匿名用户传输速度限制单位字节,0为不限制
local_max_rate=0                             #本地用户传输速度限制单位字节,0为不限制
max_clients=100                              #同一时间允许客户端最大连接数
max_per_ip=10                                #允许同一IP在同一时间最大连接
connect_timeout=60                           #客户端尝试连接命令通道超过60秒强制断开
pasv_enable=YES                              #是否启动被动式联机
accept_timeout=60                            #当使用被动式进行数据传输时,如果主机启用passive port并等待客户端60秒无响应强制断开
#下面是指定连接Ftp使用ssl加密方式
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key

 


三、配置用户支持上传、下载功能 

   服务器地址: 172.16.14.1   客户端地址: 172.16.14.2

启动Vsftp服务端,启动前请关闭防火墙与SELinux

1
2
3
4
[root@localhost ~]# setenforce 0                        #关闭SELinux
[root@localhost ~]# service iptables stop               #关闭防火墙
[root@localhost ~]# service vsftpd start                #启动成功
为 vsftpd 启动 vsftpd:                                    [确定]

1、配置虚拟用户

 所谓的匿名用户实际就是被映射为系统用户ftp,如下图:

 我们在这个目录下的pub下新建一个文件(ftp.txt)写入内容来查看一下:

 如果想让匿名用户上传文件需要修改主配置文件,如下:

1
2
3
4
5
anonymous_enable=YES                         #开启允许匿名访问(默认开启)
write_enable=YES                             #全局配置写入要开启
anon_upload_enable=YES                       #开启允许匿名用户上传文件,须开启全局配置可写权限
anon_mkdir_write_enable=YES                  #开启允许匿名创建文件夹
anon_other_write_enable=YES                  #如果想要删除文件须开启些项

 修改完主配置文件保存退出,要重启vsftp:

1
2
3
[root@localhost ftp]# service vsftpd restart
关闭 vsftpd:                                              [确定]
为 vsftpd 启动 vsftpd:                                    [确定]

 在客户端重新登录测试是否有权限上传文件、删除文件,如下图:

Ftp协议码:   大致分类如:

1开头:表示服务器信息    2开头:正确响应的信息    3开头:正常响应,但某一操作尚未完成,需进一步补充完成

4开头:表示客户端错误    5开头:表示服务器端错误

120

服务在nnn分钟内准备好

125

数据连接已打开,准备传送

150

文件状态良好,打开数据连接

200

命令成功

202

命令未实现

211

系统状态或系统帮助响应

212

目录状态

213

文件状态

214

帮助信息,信息仅对人类用户有用

215

名字系统类型

220

对新用户服务准备好

221

服务关闭控制连接,可以退出登录

225

数据连接打开,无传输正在进行

226

关闭数据连接,请求的文件操作成功

227

进入被动模式

230

用户登录

250

请求的文件操作完成

257

创建"PATHNAME" 

331

用户名正确,需要口令

332

登录时需要帐户信息

350

请求的文件操作需要进一步命令

421

连接用户过多

425

不能打开数据连接

426

关闭连接,中止传输

450

请求的文件操作未执行

451

中止请求的操作:有本地错误

452

未执行请求的操作:系统存储空间不足

500

格式错误,命令不可识别

501

参数语法错误

502

命令未实现

503

命令顺序错误

504

此参数下的命令功能未实现

530

账号或密码错误

532

存储文件需要帐户信息

550

未执行请求的操作

551

请求操作中止:页类型未知

552

请求的文件操作中止,存储分配溢出

553

未执行请求的操作:文件名不合法

因为我们的服务器端ftp家目录/var/ftp/pub这个目录没有权限,只有文件系统权限与ftp权限的交集才是ftp登录用户的权限

使用客户端登录到服务器再验证,如下图:

2、配置本地用户支持上传下载功能,在服务器上创建一个用户,如下图:

查看centos用户信息,如下图:

编辑服务端主配置文件,允许本地用户访问和写入文件,关闭匿名用户访问:

1
2
3
4
5
6
anon_other_write_enable=NO                 #不允许匿名用户有写入权限
anon_mkdir_write_enable=NO                 #不允许匿名用户创建目录
anon_upload_enable=NO                      #不允许匿名用户上传文件
write_enable=YES                           #开启全局配置有写入权限
local_enable=YES                           #允许本地用户访问,写入权限需开启全局写入权限
[root@localhost ~]# service vsftpd restart #重启Ftp服务器

使用客户端用centos用户登录到Ftp服务验证,如下图:

使用Windows验证,如下图:

使用匿名用户登录Ftp服务器验证,如下图:

这里我们用本地用户登录到Ftp服务器,还遇到一个问题,用户可以在Ftp服务器随意切换目录,这样对服务器很不安全,如下图:

 

为了安全我们需要把用户禁锢在自己家目录,只允许访问指定的目录,而其他任何目录都不能访问:

1
2
chroot_local_user=YES                      #开启禁锢目录选项
[root@localhost ~]# service vsftpd restart #重启Ftp服务器

使用本地用户登录到Ftp服务器验证,如下图:

也可以禁止一个用户列表 ,如:

1
2
3
4
5
[root@localhost ~]# cat > /etc/vsftpd/chroot_list << EOF
> centos                #把这几个用户添加到指定文件中
> redhat
> suse
> EOF

 

1
2
3
4
chroot_local_user=NO                       #如果这项启用,下面chroot_list文件中的用户就可以切换目录,相当于白名单
chroot_list_enable=YES                     #开启禁锢列表访问
chroot_list_file=/etc/vsftpd/chroot_list   #开启禁锢列表文件
[root@localhost ~]# service vsftpd restart #重启Ftp服务器

我们用redhat用户验证,如下图:

我们也可以针对某个用户单独设置权限如限制速率

1
2
3
4
5
6
7
8
修改Ftp服务器主配置文件,加入如下行:
user_config_dir=/etc/vsftpd/debian                #为指定单独设置用户权限的目录
[root@localhost ~]# useradd debian;echo 123456 | passwd --stdin debian
[root@localhost ~]# mkdir /etc/vsftpd/debian      #创建存放限制指定用户权限的目录
[root@localhost ~]# cat > /etc/vsftpd/debian/debian << EOF #在指定的目录创建与限制用户权限同名的文件
> local_max_rate=81920                            #限制debian用户下载速率为80KB/s
> EOF
[root@localhost ~]# service vsftpd restart        #重启Ftp服务器

验证本地用户debian是否能切换目录及下载速率:

 


四、配置支持SSL加密传输的Ftp服务器

 自己需要建立一台CA服务器,我们就与Ftp服务器在同一台服务器上来实现

1、为服务器生成一个私钥文件如下图:

注释:图中"()"代表只在当前子Shell进程中有效

    openssl:生成私钥关键字

    genrsa:使用rsa加密方式生成私钥

    -out:指定输出文件

    ftp.key:指定输出生成私钥的文件名称,文件名可以自己定义

    2048:表示生成私钥加密的长度(默认为512)

2、从私钥文件中提取公钥制作一个证书签署请求,如下图:

注释: req:证书申请签名管理

     -new:制作证书申请

     -key:指定私钥文件

3、为CA服务器生成一个私钥文件,如下图:

4、使用刚生成的私钥为自己再生成一个自签证书,如下图:

注释:-x509:表示制作一个自签证书

-days:表示证书申请后可以使用的天数

3、为Ftp服务器签署证书

 4、修改Ftp服务器主配置文件加入如下行:

1
2
3
4
5
6
7
8
9
10
ssl_enable=YES                                #是否启用SSL
ssl_tlsv1=YES                                 #是否使用TLS v1
ssl_sslv2=YES                                 #是否使用SSl v2
ssl_sslv3=YES                                 #是否使用SSL v3
allow_anon_ssl=NO                             #是否允许匿名用户使用SSL
force_local_data_ssl=YES                      #百匿名用户传输数据是否加密
force_local_logins_ssl=YES                    #非匿名用户登录时是否加密
rsa_cert_file/etc/pki/CA/caftp.crt            #rsa证书文件位置
rsa_private_key_file=/etc/pki/CA/ftp.key      #ftp私钥文件位置
[root@localhost ~]# service vsftpd restart    #重启Ftp服务器

5、使用FlashFXP客户端验证,如下图:

打开FlashFXP客户端: 站点-->站点管理

成功连接后,会提示保存证书,点接受并保存.如下图:

测试从Ftp服务器下载数据,如下图:

总结:由于Ftp传输方式是明文的,在互联网上不安全.使用明文很容易被窃取数据.本博客刚好是为了解析明文传输而写的,希望能帮助到大家.谢谢...

    本博文到此先告一段落,后续会更新Ftp虚拟用户及Mysql做用户验证.敬请期待...

 

 

posted on 2014-01-22 12:30  gentleman_hai  阅读(331)  评论(0编辑  收藏  举报

导航