Linux 下 FTP+SSL 实现 FTPS

Linux系统 gongyj 1591℃ 已收录 0评论

许多 INTERNET 爱好者最先接触的东西就是 FTP,在当时 HTTP 还未出现,人们还停留在命令行阶段(即使在 WIN95 里面也内置 FTP 命令),但人们乐此不返,直到 WWW 的出现。但 FTP 在现实中仍然扮演着重要的角色──特别是 FTP 服务器在提供公用服务方面。同时,FTP 服务器也成为网络安全的一个潜在的漏洞。

FTP.png

FTP 使用的明文登录协议验证用户名和密码,当你在 FTP 服务器上收发文件的时候,你面临两个风险。第一个风险是在上传文件的时候为文件加密。第二个风险是,这些文件在你等待接收方下载的时候将停留在 FTP 服务器上,这时你如何保证这些文件的安全。

1、抓包分析

在没有实现 ssl 加密之前,先安装一个抓包 wireshark抓包工具软件,查看抓包情况,VSFTP 搭建过程就不在讲述了。

yum install -y wireshark libpcap

启动 FTP 服务器后,使用 tshark 命令对 21 端口进行抓包,然后开始用客户端连接 FTP,抓包过程如下:

tshark -ni eth0 -R "tcp.dstport eq 21"
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
1.041493737 192.168.100.101 -> 192.168.100.254 TCP 66 57992 > 21 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=4 SACK_PERM=1
1.041669870 192.168.100.101 -> 192.168.100.254 TCP 60 57992 > 21 [ACK] Seq=1 Ack=1 Win=262140 Len=0
1.044637100 192.168.100.101 -> 192.168.100.254 FTP 66 Request: USER test1       #当前连接使用的用户名
1.045469215 192.168.100.101 -> 192.168.100.254 FTP 67 Request: PASS 123456      #当前连接的用户密码
1.055758095 192.168.100.101 -> 192.168.100.254 FTP 60 Request: SYST
1.056049993 192.168.100.101 -> 192.168.100.254 FTP 60 Request: FEAT

可以看到 IP 为 192.168.100.101 的主机,使用账号:test1,密码:123456 登录服务器,显然这样有很大的隐患。 FTP 默认的传输数据是明文,弄个抓包软件就可以通过数据包来分析到账号和密码。

2、FTPS 工作方式

为了提高安全性,我们有 2 种选择,FTPS: 一种多传输协议,相当于加密版的FTP;SFTP:这个协议使用 SSH 文件传输协议加密从客户机到服务器的 FTP 连接,是一种替代 FTPS 的协议是安全文件传输协议(SFTP)。

我们这里选用 FTPS 方案来提高安全性,FTPS 是在安全套接层使用标准的 FTP 协议和指令的一种增强型 FTP 协议,为 FTP 协议和数据通道增加了SSL 安全功能。FTPS 也称作“FTP-SSL”和“FTP-over-SSL”。SSL 是一个在客户机和具有 SSL 功能的服务器之间的安全连接中对数据进行加密和解密的协议。

SSL/TLS 协议在传输层(TCP/IP)之上、但是在应用层之下工作的。因此,它可以很容易在诸如 HTTP,Telnet,POP3,IMAP4,SMTP 和 FTP 等应用层协议上实现。SSL 安全扩展至少有两种不同的初始化方法:显式安全和隐式安全。

显示安全(Exmplicit):为了建立 SSL 连接,显式安全要求 FTP 客户端在和 FTP 服务器建立连接后发送一个特定的命令("AUTH SSL" 或者 "AUTH TLS")显式的告诉 FTP 服务器来初始化相应的安全连接。此时使用的是默认的 FTP 端口 21。 
隐式安全(Implicit): 当 FTP 客户端连接到 FTP 服务器时,隐式安全将会自动和 SSL 连接一起开始运行自动建立安全连接。对应端口 21(可修改成990),隐式 FTPS 是过期的 FTP 标准,需要所有客户端都使用 SSL 或 TLS 连接。为了保持兼容性,隐式 FTPS 控制连接使用990端口,数据连接使用 989 端口。

FTPS.png

当通过 SSL/TLS 来使用 FTP 时,FTP客户端和FTP服务器之间的控制连接就被加密了,因此除了它们之外谁也不能读懂它们之间的控制连接的信息。

3、配置SSL加密FTP数据传输

查看 Vsftpd 是否支持SSL:

从2.0.0版本开始,vsftpd 支持命令连接和数据连接的加密传输,ldd `which vsftpd` | grep libssl,如果输出类似与libssl.so.10 => /usr/lib/libssl.so.10 (0x00dfb000),那么支持。

用 openssl 生成证书:

我们可以生成自签名证书,无需购买付费的证书。

生成顶级 CA 的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认):

openssl req -new -x509 -nodes -out vsftpd.crt -keyout vsftpd.key
Generating a 2048 bit RSA private key
..........................+++
................................................+++
writing new private key to 'ftp.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) [XX]:CN                               #国家
State or Province Name (full name) []:BEIJING                      #省份或州
Locality Name (eg, city) [Default City]: BEIJING                   #城市
Organization Name (eg, company) [Default Company Ltd]:EXAMPLE      #单位名称
Organizational Unit Name (eg, section) []: SA                      #部门
Common Name (eg, your name or your server's hostname) []:WWW       #域名或主机名
Email Address []:123@163.com                                       #邮箱
cp vsftpd.pem /etc/vsftpd
chmod 400 /etc/vsftpd/vsftpd.pem


Vsftpd 配置SSL支持:

vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES                                      #是否启用 SSL 功能,默认为 NO
#implicit_ssl=YES                                   #是否启用隐式功能,默认为 NO
allow_anon_ssl=YES                                  #是否允许匿名用户使用 SSL ,默认为 NO
force_local_logins_ssl=YES                          #非匿名用户登陆时是否加密,默认为 YES
force_local_data_ssl=YES                            #非匿名用户传输数据时是否加密,默认为 YES
force_anon_logins_ssl=YES                           #匿名用户登录时是否加密,默认为 NO
force_local_data_ssl=YES                            #匿名用户数据传输时是否加密,默认为 NO
rsa_cert_file=/etc/vsftpd/vsftpd.crt                # rsa 证书的位置
rsa_private_key_file=/etc/vsftpd/vsftpd.key         # rsa 私钥文件位置
#dsa_cert_file=/path/to/file                        # dsa 证书的位置
#dsa_private_key_file=/path/to/file                 # dsa 证书的位置
ssl_tlsv1=YES                                       #是否激活 tls v1 加密,默认 YES
ssl_sslv2=YES                                       #是否激活 sslv2 加密,默认 NO
ssl_sslv3=YES                                       #是否激活 sslv3 加密,默认 NO

VSFTP 默认启动时用的是显式 ssl,如果需要,我们也可以开启隐式 ssl,现在配置文件就改好后,就可以重启 vsftpd 服务后,就可以使用了。

生成证书的时候,我们还可以把证书与公钥放到一个文件里,这样也可以使用。

openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3650

这时,配置文件中,只需要设置证书路径参数 rsa_cert_file=/etc/vaftpd/vsftpd.pem 就可以了,无需在配置私钥文件路径。

我们再次抓包查看一下,是否还能获取到用户名和密码。使用 Flash FXP 测试一下,连接类型选择 FTP using Explicit SSL (Auth SSL),然后输入账号和密码登陆。

tshark -ni eth0 -R "tcp.dstport eq 21"
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
5.688428490 192.168.100.101 -> 192.168.100.254 TCP 66 58520 > 21 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=4 SACK_PERM=1
5.688528325 192.168.100.101 -> 192.168.100.254 TCP 60 58520 > 21 [ACK] Seq=1 Ack=1 Win=262140 Len=0
5.692271643 192.168.100.101 -> 192.168.100.254 FTP 64 Request: AUTH SSL         #ssl 指令
5.734184394 192.168.100.101 -> 192.168.100.254 FTP 396 Request: \026\003\001\001Q\001\000\001M\003\003\270\334\247\313\263I|!\003\023\315\271P(\207\316\205\314\346\324\214m\334\256\335\310(\301\362\340\3759\000\000\240\3000\300,\300(\300$\300\024\300
5.735799780 192.168.100.101 -> 192.168.100.254 FTP 392 Request: \026\003\003\000\a\v\000\000\003\000\000\000\026\003\003\001\006\020\000\001\002\001\000\035\267\237N\252\331m6p\301gn'D\262\343\202\271\307\270\261N\016Jm9\354\202=\005\037o\241By\354\2125=\256\233!\033}\326\v@\251^\375\354\037\276\212,\225\235\377q\324jv\325<\326\263\253K\031\016;\335L\022i\020\200[\307\022.\026\016\357"rt\321\033\226]\006(\214\025\225\275\027\376mb#\026s>\251\347\237\311Vt\312\022S\255\264\215.,\245\\257\315\235\032\336\346\245\206\236\fQ\347\312\2702l\177\346I\364-\345\236\200\232\200p\321_\360\225\000\274\000V\232\201\314J\215\0331\373\243\037\353P\225j?/\216\273%\362\327\001\237\302i,\271m9\361!\360'\037'\351\223#l{\313X\361\227^(\211M&\032vLf\377\370\022k4\247\033b\235\220\a\252\273O\257\247Z\331\342\035\307\320\200s|\240\274\001bm\347\336\367\2064\fI\242(7\307\333j\235#\226\355\024\003\003\000\001\001\026\003\003\0000Pn(\3011|\323me\344\276\351\243H'\347\347@\201\262at\211\322<np\213\362\367"K\366\324M\255\255\237/\016g\206g\017\341\tSF
5.937956206 192.168.100.101 -> 192.168.100.254 TCP 60 58520 > 21 [ACK] Seq=691 Ack=1442 Win=262140 Len=0
7.130513179 192.168.100.101 -> 192.168.100.254 FTP 99 Request: \027\003\003\000(\317p\212c\271|\234\365A\224\037\233\303\320\226\365\313\3106:1\017;\274\261\270\336\202\223\246\033_\213\301v'
7.131075801 192.168.100.101 -> 192.168.100.254 FTP 107 Request: \027\003\003\000078\214k\341\323cFH\242\202\240\200\033a\023F\276&b\355\261vO\004V\333\271b\001\315v\264\204r\260>1\312\335\000X!\264\346\366\311&
7.131512927 192.168.100.101 -> 192.168.100.254 FTP 107 Request: \027\003\003\0000\242>+\370C\354\3121\261\325\241\354\364\357\244\303\363\250>\226qW\272\311aQ\213\212\312\270\002\002\260\016\310g\276\223\354B\302\034\273\260\262\261\251q
7.141239168 192.168.100.101 -> 192.168.100.254 FTP 99 Request: \027\003\003\000(\357\340q\315\262\275\354F\344:\331d\037-\370\316\032\206
7.142297222 192.168.100.101 -> 192.168.100.254 FTP 99 Request: \027\003\003\000(\326\362\006\260\316\374\be\2163l\261\033\211\264\016\212\2549\332\3736\343\323\226\207\220 `.\240\352\225\345\303\371\201\337D\324
7.142852825 192.168.100.101 -> 192.168.100.254 TCP 60 58520 > 21 [ACK] Seq=932 Ack=1784 Win=262140 Len=0
7.143245075 192.168.100.101 -> 192.168.100.254 TCP 60 58520 > 21 [ACK] Seq=932 Ack=1874 Win=262140 Len=0
7.143658866 192.168.100.101 -> 192.168.100.254 TCP 60 58520 > 21 [ACK] Seq=932 Ack=1964 Win=262140 Len=0
7.144119762 192.168.100.101 -> 192.168.100.254 TCP 60 58520 > 21 [ACK] Seq=932 Ack=2054 Win=262140 Len=0
7.144479742 192.168.100.101 -> 192.168.100.254 TCP 60 58520 > 21 [ACK] Seq=932 Ack=2152 Win=262140 Len=0
7.144815314 192.168.100.101 -> 192.168.100.254 TCP 60 58520 > 21 [ACK] Seq=932 Ack=2242 Win=262140 Len=0
7.145158786 192.168.100.101 -> 192.168.100.254 TCP 60 58520 > 21 [ACK] Seq=932 Ack=2332 Win=262140 Len=0

查看抓包结果:现在不会明文传输了,无法获得用户名和密码。无论过登陆与数据传输,都没有明文的信息显示了,现在很安全了。

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://blog.chopmoon.com/favorites/229.html
喜欢 (1)
发表我的评论
取消评论

表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
正在加载中……