一、FTP的概述
  文件传输协议(FTP)是TCP/IP提供的标准机制,用来将文件从一个主机复制到另一个主机。FTP使用TCP的服务。
FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道。

 

 

 

控制通道:控制通道是和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的, PI称为控制连接。
数据通道:数据通道是和FTP服务器进行文件传输或者列表的通道。
FTP协议中,控制连接均有客户端发起。
数据连接有两种工作方式:PORT(主动)方式和PASV(被动)方式。
主动方式:
1.客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,源端口为随机端口x,在客户端,远程端口为21,在服务器。   
2.客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。   
3.服务器打开20号源端口并且建立和客户端数据端口的连接。此时,源端口为20,远程数据端口为(x+1)。   
4.客户端通过本地的数据端口建立一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经建立好了一个连接。
被动方式:
当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
FTP的优点:   
1.促进文件的共享  
2.鼓励间接或者隐式的使用远程计算机   
3.向用户屏蔽不同主机中各种文件存储系统的细节   
4.可靠和高效的传输数据   
FTP的缺点:   
1.密码和文件内容都使用明文传输,可能产生不希望发生的窃听。   
2.因为必须开放一个随机的端口以建立连接,当防火墙存在时,客户端很难过滤处于主动模式下的FTP流量。这个问题通过使用被动模式的FTP得到了很大解决。   
3.服务器可能会被告知连接一个第三方计算机的保留端口。
登录FTP服务器有三种方式
匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous。
本地用户登录:使用/etc/passwd中的系统用户登录。
虚拟用户登录:有两种方式实现虚拟用户:本地数据文件(DB)和数据库服务器(MySQL)。FTP虚拟用户是FTP服务器的专有用户,使用虚拟用户登录FTP,只能访问FTP服务器提供的资源,大大增强了系统的安全。
FTPS简介
一种多传输协议,相当于加密版的FTP。当你在FTP服务器上收发文件的时候,你面临两个风险。第一个风险是在上载文件的时候为文件加密。第二个风险是,这些文件在你等待接收方下载的时候将停留在FTP服务器上,这时你如何保证这些文件的安全。你的第二个选择(创建一个支持SSL的FTP服务器)能够让你的主机使用一个FTPS连接上载这些文件。这包括使用一个在FTP协议下面的SSL层加密控制和数据通道。一种替代FTPS的协议是安全文件传输协议(SFTP)。这个协议使用SSH文件传输协议加密从客户机到服务器的FTP连接。   FTPS是在安全套接层使用标准的FTP协议和指令的一种增强型FTP协议,为FTP协议和数据通道增加了SSL安全功能。
FTPS也称作“FTP-SSL”和“FTP-over-SSL”。SSL是一个在客户机和具有SSL功能的服务器之间的安全连接中对数据进行加密和解密的协议。
实验安全机密的访问机制
拓扑图

 

 

 

二、配置步骤
1、安装vsftpd软件包
yum install -y vsftpd-2.0.5-16.el5.i386.rpm
启动vsftpd服务
service vsftpd start
安装抓包工具
yum -y install wireshark-1.0.8-1.el5_3.1.i386.rpm
创建账号user1
useradd user1
passwd user1
user1登陆ftp服务器

 

 

 

因为传递是明文的,我们看是否能够抓到用户的账号信息
[root@mail Server]# tshark -ni eth0 -R "tcp.dstport eq 21"
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
203.336196 192.168.10.15 -> 192.168.10.10 TCP 50487 > 21 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=2
203.337266 192.168.10.15 -> 192.168.10.10 TCP 50487 > 21 [ACK] Seq=1 Ack=1 Win=8192 Len=0
203.545563 192.168.10.15 -> 192.168.10.10 TCP 50487 > 21 [ACK] Seq=1 Ack=21 Win=8172 Len=0
206.871753 192.168.10.15 -> 192.168.10.10 FTP Request: USER user1
207.071412 192.168.10.15 -> 192.168.10.10 TCP 50487 > 21 [ACK] Seq=13 Ack=55 Win=8136 Len=0
208.183262 192.168.10.15 -> 192.168.10.10 FTP Request: PASS 123
208.827546 192.168.10.15 -> 192.168.10.10 TCP 50487 > 21 [ACK] Seq=23 Ack=78 Win=8112 Len=0
我们得到用户名称user1,密码:123,显然这种明文传递的方式显然是存在安全隐患的,我们为了提高ftp访问的安全性,采取ftps加密的访问方式
2、CA的相关配置
[root@mail ~]# cd /etc/pki/
[root@mail pki]# vim tls/openssl.cnf
45 dir = /etc/pki/CA #证书路径
颁发证书机构与申请机构必须在同一地区,改为可选的
88 countryName = optional
89 stateOrProvinceName = optional
90 organizationName = optional
在CA目录下创建三个目录两个文件
[root@localhost CA]# mkdir crl certs newcerts
[root@localhost CA]# touch index.txt serial
颁发的证书的序列号码从01开始
[root@localhost CA]# echo "01" >serial
为证书颁发机构产生钥匙,并重定向到private目录下的cakey.pem文件中,钥匙长度为1024位
[root@localhost CA]# openssl genrsa 1024 >private/cakey.pem
修改文件权限,确保钥匙的安全,其他用户没有权限
[root@localhost CA]# chmod 600 private/*
产生密钥 #–new表示新的钥匙 –x509表示一种格式
[root@localhost CA]# openssl req -new -key private/cakey.pem -x509 -out cacert.pem -days 3650
Country Name (2 letter code) [CN]:
State or Province Name (full name) [BEIJING]:
Locality Name (eg, city) [BEIJING]:
Organization Name (eg, company) [My Company Ltd]:SECCENTER
Organizational Unit Name (eg, section) []:TEC
Common Name (eg, your name or your server's hostname) []:rootca.net.net
ftp服务器的配置
创建存放私有钥匙,证书等信息的目录
mkdir -pv /etc/ftpd/certs
产生钥匙
cd /etc/httpd/certs/
openssl genrsa 1024 >ftpd.key
向根机构请求证书,
[root@localhost certs]# openssl req -new -key ftpd.key -out ftpd.csr
Country Name (2 letter code) [CN]:
State or Province Name (full name) [BEIJING]:
Locality Name (eg, city) [BEIJING]:
Organization Name (eg, company) [My Company Ltd]:abc
Organizational Unit Name (eg, section) []:tec
Common Name (eg, your name or your server's hostname) []:ftp.abc.com
利用请求,得到证书
[root@localhost certs]# openssl ca -in ftpd.csr -out ftpd.cert
Web服务器申请证书信息
Subject:
countryName = CN
stateOrProvinceName = BEIJING
organizationName = abc
organizationalUnitName = tec
commonName = ftp.abc.com
修改钥匙证书所在目录的权限,保证信息的安全
[root@localhost certs]# chmod 600 *
3、配置vsftpd的配置文件
钥匙
119 rsa_cert_file=/etc/ftpd/certs/ftpd.cert #证书路径和名字
120 rsa_private_key_file=/etc/ftpd/certs/ftpd.key #私钥的位置
121 ssl_tlsv1=YES
122 ssl_ssl2=YES
123 ssl_ssl3=YES #支持ssl_tls的三个版本
124 force_local_logins_ssl=YES #本地账号登陆加密
125 force_local_data_ssl=YES #传递数据加密
126 ssl_enable=YES #开启ssl加密
三、客户端测试
安装ftp的客户端软件,新建站点

 

 

 

 

 

 

 

继续在eth0网卡的21端口抓包,我们看到验证方式为ssl,增加安全性
tshark -ni eth0 -R "tcp.dstport eq 21"
4890.084795 192.168.10.15 -> 192.168.10.10 FTP Request: AUTH SSL
4890.160493 192.168.10.15 -> 192.168.10.10 FTP Request: \200\310\001\003\001\000\237\000\000\000 \000\300\024\000\300
4890.276378 192.168.10.15 -> 192.168.10.10 FTP Request: \026\003\001\000\206\020\000\000\202\000\200\032g\314\373\006\360\236\360~\233\326\221\032\225\335\004\030^H\201~-\375\v<\025/z\237O;\002\301x\310\241\267\026\304@\217l\313=\031\000P\223\253\301\f\356^
4890.488872 192.168.10.15 -> 192.168.10.10 TCP 51921 > 21 [ACK] Seq=403 Ack=896 Win=64804 Len=0
案例二vsftpd虚拟账号的实现
1、产生账号库文件
cd /etc/vsftpd/
touch viruser.txt #加入如下内容,表示两个虚拟用户的名称和密码
guest
123
mike
123
2、把文本变成数据库文件
rpm -ivh db4-utils-4.3.29-10.el5.i386.rpm #安装db4工具用来把文本转化成数据库
db_load -T -t hash -f viruser.txt viruser.db
验证用户是否存在,pam验证和调用的模块
vim /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/viruser
account required pam_userdb.so db=/etc/vsftpd/viruser#账号是否过期
创建系统账号 user1,与虚拟账号的guest和mike形成映射
useradd user1
改变user1的权限
[root@mail home]# chmod a+rw user1
配置vsftpd的主配置文件vim /etc/vsftpd/vsftpd.conf
119 guest_enable=YES
120 guest_username=user1
用虚拟账号guest和mike访问ftp服务器

 

 

 

由于虚拟账号映射的是系统的user1账号,因此虚拟账号访问的是其对应的账号的家目录,虚拟账号是存在于系统之外的账号,这种方法也大大增强了系统的安全性。
4、我们可以对访问ftp服务器的用户某些限制,来提高服务器的高稳定性能
修改vsftpd的接口文件vim /etc/pam.d/vsftpd
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
auth required pam_shells.so
auth include system-auth
auth include system-auth
account include system-auth
session required pam_loginuid.so
编辑vsftpd的配置文件 vim /etc/vsftpd/vsftpd.conf
121 anon_max_rate=102400 #匿名账号下载速度100K
122 local_max_rate=1024000 #本地账号下载速度1M
123 max_clients=5 #同时在线的最大用户数量
124 max_per_ip=2 #每用户的最大连接数
在ftp上放置一个1M的f1文件,测试匿名账号下载速度约为100k/s

 

 

 

 

 

 

5、也可以对本地用户user1和user2设置不同的访问速度
vim /etc/vsftpd/vsftpd.conf 添加内容
user_config_dir=/etc/vsftpd/userdir #用户的配置的目录
cd /etc/vsftpd
mkdir userdir
cd userdir
vim user1 #添加访问速率local_max_rate=1024000
vim user2 #添加local_max_rate=10240
重启服务,就达到了不同用户访问ftp服务器不同速率的效果。