ftp+ssl
环境:
VMware workstation 10
centos6.4操作系统
作为一种传输控制协议,和http类似,FTP是一个面向连接的一个协议,它有点区别于http的地方就是,它用两个端口进行工作一个是20一个是21,这两个端口一个用于进行传输数据文件一个用于控制信息的传输。他只提供你文件的浏览方式,并不是以网页的形式打开,以网页的形式打开是以http协议进行浏览的。FTP可以支持用户名和密码,也可以进行匿名登陆,这要看网站是否进行了权限设置,对于内网来说还有一个内网的问题,如果你是内网用户话那么就不需要用户名和密码了,就可以直接登陆..是外网的话,就取决那个网站是否支持匿名登陆.
FTP属于应用层的协议,它基于传输层,为用户服务,它们负责进行文件的传输。FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unicode一样。但是,FTP有着极高的延时,这意味着,从开始请求到第一次接收需求数据之间的时间会非常长,并且不时的必需执行一些冗长的登陆进程。
FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流,并且是命令通向ftp服务器的进口。当数据通过数据流传输时,控制流处于空闲状态。而当控制流空闲很长时间后,客户端的防火墙会将其会话置为超时,这样当大量数据通过防火墙时,会产生一些问题。此时,虽然文件可以成功的传输,但因为控制会话会被防火墙断开,传输会产生一些错误。
三次握手示意:
安全性问题:
1.密码和文件内容都使用明文传输,可能产生不希望发生的窃听。
2.因为必须开放一个随机的端口以建立连接,当防火墙存在时,客户端很难过滤处于主动模式下的FTP流量。这个问题通过使用被动模式的FTP得到了很大解决。
3.服务器可能会被告知连接一个第三方计算机的保留端口。
FTP虽然可以被终端用户直接使用,但是它是设计成被FTP客户端程序所控制。
运行FTP服务的许多站点都开放匿名服务,在这种设置下,用户不需要帐号就可以登录服务器,默认情况下,匿名用户的用户名是:“anonymous”。这个帐号不需要密码,虽然通常要求输入用户的邮件地址作为认证密码,但这只是一些细节或者此邮件地址根本不被确定,而是依赖于FTP服务器的配置情况。
本次实验的目的就是让ftp结合ssl进行安全的文件传输,简易拓扑如下:
pc1
[root@localhost ~]# uname -r
2.6.32-358.el6.i686
[root@localhost ~]# mount /dev/cdrom /media/cdrom
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# yum --disablerepo=\* --enablerepo=c6-media install wireshark
安装抓包工具
[root@localhost Packages]# tshark -ni eth0 -R "tcp.port eq 21"
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
pc2
[root@localhost ~]# mount /dev/cdrom /media/cdrom
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# cd /media/cdrom/Packages/
[root@localhost Packages]# rpm -ivh vsftpd-2.2.2-11.el6_3.1.i686.rpm
Preparing... ########################################### [100%]
1:vsftpd ########################################### [100%]
[root@localhost Packages]# service vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@localhost certs]# netstat -tupln |grep ftp
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 4084/vsftpd
[root@localhost Packages]# useradd user1 #添加用于登录的测试账号(本地账号即可)
[root@localhost Packages]# passwd user1
Changing password for user user1.
New password:
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
客户机登录测试:
在pc1的抓包机上我们可以看到很清楚的通信过程及通信内容,包括账号密码
[root@localhost Packages]# tshark -ni eth0 -R "tcp.port eq 21"
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
2867.480301 192.168.2.177 -> 192.168.2.188 TCP 3576 > 21 [SYN] Seq=0 Win=65535 Len=0
MSS=1460 WS=0
2867.480462 192.168.2.177 -> 192.168.2.188 TCP 3576 > 21 [ACK] Seq=1 Ack=1 Win=65535
Len=0
2867.480466 192.168.2.188 -> 192.168.2.177 TCP 21 > 3576 [SYN, ACK] Seq=0 Ack=1
Win=14600 Len=0 MSS=1460 WS=4
2867.486036 192.168.2.188 -> 192.168.2.177 FTP Response: 220 (vsFTPd 2.2.2)
2867.623804 192.168.2.177 -> 192.168.2.188 TCP 3576 > 21 [ACK] Seq=1 Ack=21
Win=65515 Len=0
2871.655143 192.168.2.177 -> 192.168.2.188 FTP Request: USER user1
2871.655465 192.168.2.188 -> 192.168.2.177 TCP 21 > 3576 [ACK] Seq=21 Ack=13
Win=14608 Len=0
2871.655629 192.168.2.188 -> 192.168.2.177 FTP Response: 331 Please specify the
password.
2871.848555 192.168.2.177 -> 192.168.2.188 TCP 3576 > 21 [ACK] Seq=13 Ack=55
Win=65481 Len=0
2874.528677 192.168.2.177 -> 192.168.2.188 FTP Request: PASS 123
2874.563743 192.168.2.188 -> 192.168.2.177 FTP Response: 230 Login successful.
2874.664870 192.168.2.177 -> 192.168.2.188 TCP 3576 > 21 [ACK] Seq=23 Ack=78
Win=65458 Len=0
解决办法,利用ssl层的数据加密功能进行两者的结合,ftp+ssl
证书的产生及应用可参阅《Apache的安全方案与证书实施》
pc2
在利用openssl进行证书的有关工作之前,我们可以修改/etc/pki/tls/openssl.cnf 下的有关默认工作参数,以便于下面的证书的产生进度(当然,你也可以不修改,进行手动输入)
[root@localhost tls]# cd /etc/pki/tls/openssl.cnf
具体修改内容如图
[root@localhost certs]# cd /etc/pki
[root@localhost pki]# openssl genrsa 1024 >./CA/private/cakey.pem
Generating RSA private key, 1024 bit long modulus
...++++++
...................++++++
e is 65537 (0x10001) #产生CA私钥
[root@localhost pki]# pwd
/etc/pki
[root@localhost certs]# chmod 600 /etc/pki/CA/private/cakey.pem #严格保管私钥
[root@localhost CA]# openssl req -new -key private/cakey.pem -x509 -out cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [BEIJING]:
Locality Name (eg, city) [BEIJING]:
Organization Name (eg, company) [Default Company Ltd]:abc
Organizational Unit Name (eg, section) []:tec
Common Name (eg, your name or your server's hostname) []:rootca.org
Email Address []: #基于私钥产生证书
[root@localhost certs]# openssl genrsa 1024 >vsftpd.key
Generating RSA private key, 1024 bit long modulus
............................++++++
....++++++
e is 65537 (0x10001)
[root@localhost certs]# chmod 600 vsftpd.key #产生vsftpd的私钥
然后利用私钥产生请求文件
[root@localhost certs]# ll
total 4
-rw-------. 1 root root 887 Feb 19 00:37 vsftpd.key
[root@localhost certs]# openssl req -new -key vsftpd.key -out vsftpd.req
#产生请求文件,并放置在证书机构rootca.org的证书请求文件存放目录下
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [BEIJING]:
Locality Name (eg, city) [BEIJING]:
Organization Name (eg, company) [Default Company Ltd]:cde
Organizational Unit Name (eg, section) []:tec
Common Name (eg, your name or your server's hostname) []:ftp.cde.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
#签署证书
在发放证书之前,我们要先准备还CA机构要用的发放序列(并赋值)文件和指针文件
[root@localhost certs]# touch /etc/pki/CA/index.txt
[root@localhost certs]# touch /etc/pki/CA/serial
[root@localhost certs]# echo "01" >/etc/pki/CA/serial
[root@localhost certs]# openssl ca -in vsftpd.req -out vsftpd.cert
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Feb 19 08:48:44 2014 GMT
Not After : Feb 19 08:48:44 2015 GMT
Subject:
countryName = CN
stateOrProvinceName = BEIJING
organizationName = cde
organizationalUnitName = tec
commonName = ftp.cde.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
6D:E5:90:5E:33:E6:57:B1:4D:B0:5A:66:94:3F:1D:E6:03:78:69:DD
X509v3 Authority Key Identifier:
keyid:62:57:12:8C:E3:C6:48:82:2D:84:CC:6A:81:A6:A9:EE:5B:A1:68:1D
Certificate is to be certified until Feb 19 08:48:44 2015 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
#发放证书
在证书产生之后要完成和ftp的绑定工作,主要是修改/etc/vsftpd/vsftpd.conf配置文件
因为在传输过程中要出示证书,所以要指明证书的存放路径
在加密的信息传到对端之后,对端要用私钥进行解密,所以还要指明私钥文件的存放位置
ssl在实现加密时是对称加密
默认是支持tlsv1版本的,2,3版本不支持(可以手动添加)
还要把ssl支持打开,以支持ftps
默认本地用户在进行数据传输,以及本地用户登录时也是要进行ssl加密的
默认匿名登录不加密(不需要)
[root@localhost certs]# vim /etc/vsftpd/vsftpd.conf
修改的具体对应内容如下
重启服务:
[root@localhost certs]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
在操作系统中靠命令行是实现不了ftps的,我们需要专业的客户端工具
如图,安装Flashfxp工具,在站点管理器下新建并保存我们的连接
这时在登录服务器后就会出现有关的证书提示,因为我们是在实验环境下自己产生并签发的证书,所以在这里我们完全可以选择信任
然后就能进行正常的登录
在另一台测试机器上进行抓包测试,如图,已经看不到之前所能看到的用户名密码等相关信息,只有
auth ssl的相关信息
实验达到预期效果,测试正常.