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服务器的进口。当数据通过数据流传输时,控制流处于空闲状态。而当控制流空闲很长时间后,客户端的防火墙会将其会话置为超时,这样当大量数据通过防火墙时,会产生一些问题。此时,虽然文件可以成功的传输,但因为控制会话会被防火墙断开,传输会产生一些错误。


三次握手示意:

ftp+ssl(证书)_ssl


ftp+ssl(证书)_ftp_02



安全性问题:

1.密码和文件内容都使用明文传输,可能产生不希望发生的窃听。

2.因为必须开放一个随机的端口以建立连接,当防火墙存在时,客户端很难过滤处于主动模式下的FTP流量。这个问题通过使用被动模式的FTP得到了很大解决。

3.服务器可能会被告知连接一个第三方计算机的保留端口。

FTP虽然可以被终端用户直接使用,但是它是设计成被FTP客户端程序所控制。

运行FTP服务的许多站点都开放匿名服务,在这种设置下,用户不需要帐号就可以登录服务器,默认情况下,匿名用户的用户名是:“anonymous”。这个帐号不需要密码,虽然通常要求输入用户的邮件地址作为认证密码,但这只是一些细节或者此邮件地址根本不被确定,而是依赖于FTP服务器的配置情况。


本次实验的目的就是让ftp结合ssl进行安全的文件传输,简易拓扑如下:

ftp+ssl(证书)_ftp_03



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.


客户机登录测试:

ftp+ssl(证书)_安全_04


在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

具体修改内容如图

ftp+ssl(证书)_ftp_05


ftp+ssl(证书)_服务器_06


ftp+ssl(证书)_服务器_07

[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

修改的具体对应内容如下


ftp+ssl(证书)_安全_08

重启服务:

[root@localhost certs]# service vsftpd restart

Shutting down vsftpd:                                      [  OK  ]

Starting vsftpd for vsftpd:                                [  OK  ]


在操作系统中靠命令行是实现不了ftps的,我们需要专业的客户端工具

ftp+ssl(证书)_服务器_09

如图,安装Flashfxp工具,在站点管理器下新建并保存我们的连接

ftp+ssl(证书)_安全_10


这时在登录服务器后就会出现有关的证书提示,因为我们是在实验环境下自己产生并签发的证书,所以在这里我们完全可以选择信任

ftp+ssl(证书)_ftp_11


然后就能进行正常的登录


ftp+ssl(证书)_服务器_12



在另一台测试机器上进行抓包测试,如图,已经看不到之前所能看到的用户名密码等相关信息,只有


auth ssl的相关信息

ftp+ssl(证书)_安全_13


实验达到预期效果,测试正常.