FTP的安全扩展
在传统的ftp通讯和传输过程中可以看出,ftp协议提供了一种简单实用的网络文件传输方法,但是缺陷也是显而易见的。传统ftp服务缺乏对数据的机密性和完整性保护,对通讯双方也没有可靠的认证措施,同时还存在着明文信息传输的弱点——在同一个网络上的任何用户都可能窃取到重要的信息。虽然近年来出现了很多种ftp的替代服务,例如ssh加密通道的sftp/scp,或使用IPSEC协议的VPN通道等等,但是在大多数情况下,ftp的通用性和易用性使得它在很长一段时间内必然无法被完全取代。所以如同其他一系列古董服务(例如SMTP/HTTP)一样,近年来也出现了一些不需要对ftp协议自身做完全更改的协议扩展模块,能够良好的完成兼容性和功能扩展。ftp SSL/TLS Extension就是其中一种方式。
FTP安全扩展: http://www.ietf.org/rfc/rfc2228.txt http://www.ietf.org/rfc/rfc2246.txt FTP安全扩展,SSL接口草案: http://www.ietf.org/internet-drafts/draft-murray-auth-ftp-ssl-13.txt
1、SSL/TLS简介
先说一下SSL/TLS协议,SSL(Secure Socket Layer)最早是netscape公司设计的用于HTTP协议加密的安全传输协议,SSL工作于TCP协议的传输层(TCP层)和应用程序之间。作为一个中间层,应用程序只要采用SSL提供的一套SSL套接字API来替换标准的Socket套接字,就可以把程序转换为SSL化的安全网络程序,在传输过程中将由SSL协议实现数据机密性和完整性的保证。SSL协议的当前版本为3.0,当SSL取得大规模成功后,IETF(www.ietf.org)将SSL作了标准化,规范为RFC2246,并将其称为TLS(Transport Layer Security)。从技术上讲,TLS1.0与SSL3.0的差别非常微小,SSL由于其历史应用的原因在当 前的商业应用程序之中使用得更多一些。
TLS协议,RFC 2246: http://www.ietf.org/rfc/rfc2246.txt
2 、数据机密性和完整性
前面多次提到了数据的机密性和完整性两个方面,在此略微解释一下。数据的机密性确保数据信息机密可靠,不会被没有权限的对象所访问和浏览到,基本的机密性保护手段就是数据加密;而数据的完整性则是指数据在传输和存储过程中将保证数据的唯一和完整,不会被恶意篡改着所修改,保证数据完整性的基本手段主要有数字签名。
这里就牵扯到数据加密领域的两类算法,加密算法和散列算法。加密算法从数学原理上看可以分为对称加密和非对称加密,从数据处理方法上可以分为流加密和分组加密,本文重点不在此,不再赘述,只举例几种常用的加密算法: DES, 3DES, AES, BlowFish,RC2-RC6等等。数据签名算法是加密领域的另一套方法,又叫数据散列算法,用于对数据进行处理生成一个唯一的等长签名字符串,原数据的长度可能是任意的,而任意两个相似但哪怕只有少许细微差别的数据集,都将产生差别非常大的等长签名字符串,这个字符串在一般意义下被认为是极少会发生空间冲突(重复)的,因此数据散列算法对于确保数据的唯一性是一种必要的手段;常见的数字散列算法有MD5,SHA-1,CAST-256等等。
可以看出,面对如此多种类的加密算法,应用程序处理起来是很繁琐的。SSL在这个层次中就提供了一种自动的算法协商,密钥交换和数据加密过程。SSL协议分为两部分:Handshake Protocol和Record Protocol,HandShake部分用于处理通讯双方的算法协商和密钥交换过程,Record部分用于对数据进行加密传输。
整个的SSL基本通讯过程如下: /====================================================================\ | | | [ SSL Client ] [ SSL Server ] | | | | (TCP三步握手) | | (SSL套结字连接) | | . | | . SSLSocket() | | . Bind() | | SSLSocket() -------------------> | | <------------------- Connect | | (连接加密算法协商) | | ClientHello() -------------------> | | (服务器端算法确认和证书发送)| | ServerHello | | Certificate* | | ServerKeyExchange* | | CertificateRequest* | | <------------------- ServerHelloDone | | (客户端证书验证与密钥交换) | | Certificate* | | ClientKeyExchange | | CertificateVerify* | | [ChangeCipherSpec] | | Finished -------------------> (数据加密算法协商) | | [ChangeCipherSpec] | | <------------------- Finished | | (应用数据加密传输) | | Application Data <------------------> Application Data | | ... | \====================================================================/
SSL套结字通讯过程如下:
1, Client和Server双方程序通过ssl socket系列函数替换BSD Socket系列函数;
2, Client通过TCP协议连接到Server端应用程序;
3, Client发起连接质询,发送自身所能实现的"安全集合",其中包含加密和签名算法协商;
4, Server回应连接,包含本次通讯所使用的算法集合,以及Server端证书;
5, Client收到证书后,使用Server端协商的算法,用Server端证书中包含的Server公钥加密一个随机序列,作为一个挑战质询发回Server;
6, Server收到加密密文,使用自身的私钥进行数据解密,如果成功,代表SA协商匹配,可以开始通讯;
7, 可选过程,继续发起Client端验证过程,Client端发出Client证书,进行Client端验证过程;
8, 可选过程,数据传输过程加密算法协商;
9, 协商完毕,开始加密数据传输;
可以看出,SSL Socket通讯过程相比正常的BSD Socket,只不过多了一个安全集合交换协商的过程,这个过程由SSL实现自身来完成,相对于应用程序,只要采用了SSL Socket,其他的过程都是 透明的。SSL通讯过程中的第3-6步是必须操作,包含了Server端验证过程和加密算法协商,类似于TCP协议的三步握手过程,这个过程中通过公钥加密算法加密密钥(公钥)和解密秘钥(私钥)不同的功能,巧妙地实现了密钥交换和算法协商,并且由于解密秘钥不需要在网络上传输,这样就同时实现了数据通讯过程的保密性和内部应用程序协议的保密性。在第7步进行Client端证书的验证过程中,由于当前网络环境下PKI和CA体系尚不完善,并且由于SSL设计的工作环境相对对Client端的安全需求并不很高,所以Client端验证一般作为一种可选手段来实现,取决于应用程序的安全等级需求。
SSL数据通讯的机密性特性就是由上面的过程完成的,在算法协商过程中除了加密算法的协商外还会交换一个数据签名算法,用于对数据生成一个唯一的散列校验码,防止在传输过程中数据被篡改,数据签名过程实现了通讯过程的完整性保证。
对应于SSL所提供的两种安全特性,机密性和保密性,ssl定义了四个安全级别,分别是这两种特性的状态组合:
'C' - Clear - 没有任何保护
'S' - Safe - 完整性实现,但是没有机密性
'E' - Confidential - 机密性实现,但是没有完整性
'P' - Private - 同时实现机密性和完整性
ftp的ssl扩展使用了其中的两种状态
1)Clear (requested by 'PROT C')
2)Private (requested by 'PROT P') 在连接过程中通过ftp扩展指令PROT来完成状态的切换。
3 、ssl FTP扩展
在RFC 2228中,ftp协议扩展了如下指令:
AUTH (Authentication/Security Mechanism), ADAT (Authentication/Security Data), PROT (Data Channel Protection Level), PBSZ (Protection Buffer Size), CCC (Clear Command Channel), MIC (Integrity Protected Command), CONF (Confidentiality Protected Command), and ENC (Privacy Protected Command).
其中和SSL扩展相关的主要指令有以下几条:
AUTH (协商扩展验证): 指定扩展认证方法,SSL或TLS; PBSZ (协商保护缓冲区): 制定保护缓冲区,SSL/TLS模式中必须为0; PROT (切换保护级别): 切换保护级别,可以为"C"无保护,或"P"保护级别;
在一个典型的ftp ssl通讯过程中指令序列如下: /====================================================================\ | Client Server | | control data data control | |====================================================================| | | | socket() | | bind() | | socket() | | connect() -------------------------------------------> accept() | | <------------------------------------------- 220 | | AUTH TLS -------------------------------------------> | | <------------------------------------------- 234 | | TLSneg() <------------------------------------------> TLSneg() | | PBSZ 0 -------------------------------------------> | | <------------------------------------------- 200 | | PROT P -------------------------------------------> | | <------------------------------------------- 200 | | USER elly -------------------------------------------> | | <------------------------------------------- 331 | | PASS **** -------------------------------------------> | | <------------------------------------------- 230 | | | \====================================================================/
一个SSL FTP的连接过程实例: /====================================================================\ | | | WinSock 2.0 -- OpenSSL 0.9.7d 17 Mar 2004 | | [R] Connecting to 192.168.21.3 -> IP=192.168.21.3 PORT=2121 | | [R] Connected to 192.168.21.3 | | [R] 220 Please enter your login name now. | | [R] AUTH TLS (认证方法)| | [R] 234 AUTH Command OK. Initializing SSL connection. | | [R] Connected. Negotiating SSL/TLS session.. | | [R] SSL/TLS negotiation successful... (协商关联)| | [R] TLSv1/SSLv3 encrypted session using cipher AES256-SHA (256 bits) | [R] PBSZ 0 (PBSZ设置)| | [R] 200 PBSZ Command OK. Protection buffer size set to 0. | | [R] USER elly (ftp传统认证)| | [R] 331 Password required for elly . | | [R] PASS (hidden) | | [R] 230 User elly logged in. | | [R] SYST | | [R] 215 UNIX Type: L8 , CP:936 | | [R] FEAT (扩展指令测试)| | [R] 211-Extensions supported: | | [R] SIZE | | [R] MDTM | | [R] MDTM YYYYMMDDHHMMSS filename | | [R] LIST -laT | | [R] STAT -laT | | ... | | [R] AUTH SSL | | [R] AUTH TLS | | [R] PROT | | [R] PBSZ | | [R] SSCN | | [R] UTF8 | | [R] 211 END | | [R] CLNT FlashFXP 2.2.985 | | [R] 213 client type set to FlashFXP 2.2.985. | | [R] PWD (传统通讯过程)| | [R] 257 "/" is current directory | | [R] TYPE A | | [R] 200 Type set to ASCII. | | [R] PROT P (切换到保护模式)| | [R] 200 PROT P accepted. | | [R] PASV | | [R] 227 Entering Passive Mode (192,168,21,3,5,122) | | [R] Opening data connection IP: 192.168.21.3 PORT: 1402 | | [R] LIST -al | | [R] Connected. Negotiating SSL/TLS session.. (加密通讯过程)| | [R] 150 Opening ASCII data connection for ls / using SSL/TLS. | | [R] SSL/TLS negotiation successful... | | [R] TLSv1/SSLv3 encrypted session using cipher AES256-SHA (256 bits) | [R] 226-free disk space under this directory : 101 mb | | [R] 226 Transfer finished successfully. Data connection closed . | | [R] List Complete: 181 bytes in 0.14 seconds (1.26 KBps) | | | \====================================================================/
在ssl ftp中,有以下几个特殊点:
1, AUTH是可选指令,因为ssl ftp实现的方式不同而存在,详见下一节explicit SSL与implicit SSL;
2, PBSZ和PROT是必须指令,用于切换到保护通道模式;
3, AUTH,PBSZ和PROT指令是实现SSL认证方式的必须方法,但可以与传统的User/Password 模式共存,或只取其一;
4, SSL认证方法的SSL认证过程(AUTH/PBSZ)和传统模式认证并无严格的先后顺序关联,可能在用户名和密码之前,也可能在之后;但出于安全因素,最好在User/Password传输之前切换到安全模式,可以确保User/Password的传输安全;
5, 在explicit SSL模式中,可以在任何时间切换到保护模式,如第四条所述;在implicit SSL模式中,初始化连接将直接采用SSL Socket建立,不需要AUTH指令切换。
4 、Explicit SSL和Implicit SSL
由于历史和软件兼容性因素,ssl FTP的实现有两种方式,分别是Explicit SSL和Implicit SSL,上面的大部分数据都是以explicit SSL为范例。
Explicit SSL(外部SSL),又被称为AUTH SSL方式;Explicit SSL保持了与传统ftp服务的良好兼容性,以一个ftp服务扩展指令的方式存在。初始化连接可以采用与传统ftp兼容的连接模式,当需要传输加密信息时使用AUTH SSL指令切换到保护模式。使用Explicit SSL时 Server必须完整地实现AUTH/PBSZ/PROT等指令。
Implicit SSL(隐含SSL),是一个全新的ftp实现方式,在TCP三步握手完成之后就直接使用SSL Socket进行协商和通讯,之后将全程采用SSL加密连接。在这种模式中一般ftp server将监听在一个新的服务端口,IANA指定ftps:tcp:990为implicit SSL ftp的默认端口。因为在连接初始阶段就自动由SSL实现完成了协商,因此implicit模式中AUTH指令是可选的。
在不考虑兼容性的因素下,在服务期端最好优先使用implicit SSL模式,可以获得更好的保密特性。
比较两种ssl ftp实现模式区别如下: /======================================================================\ | explicit implicit | | client server client server | |======================================================================| | | | | connect() ------> -+-明文 | sslConnect() ------> 加密 | | <------ 220 | | <------ 220 -+ | | AUTH SSL ------> | | USER *** ------> | | | <------ 234 -+ | <------ 331 | | | TLSneg() <-----> TLSneg() -+-加密 | PASS *** ------> | | | <------ 200 | | <------ 230 | | | USER *** ------> | | LIST <-----> ... | | | <------ 331 | | RETR <-----> ... | | | PASS *** ------> | | ... | | | <------ 230 | | | | | LIST/RETR <-----> ... | | sslClose() <-----> ... -+ | | close() <-----> ... -+ | | | | | \======================================================================/
5 、一些杂乱图示 在3中引用了一个Explicit SSL连接指令序列,这里是对应的Implicit SSL连接过程: /======================================================================\ | WinSock 2.0 -- OpenSSL 0.9.7d 17 Mar 2004 | | [R] Connecting to 192.168.21.3 -> IP=192.168.21.3 PORT=9909 | | [R] Connected to 192.168.21.3 | | [R] Connected. Negotiating SSL/TLS session.. | | [R] SSL/TLS negotiation successful... | | [R] TLSv1/SSLv3 encrypted session using cipher AES256-SHA (256 bits) | | [R] 220 Please enter your login name now. | | [R] PBSZ 0 | | [R] 200 PBSZ Command OK. Protection buffer size set to 0. | | [R] USER elly | | [R] 331 Password required for elly . | | [R] PASS (hidden) | | [R] 230 User elly logged in. | | [R] SYST | | [R] 215 UNIX Type: L8 , CP:936 | | [R] PROT P | | [R] 200 PROT P accepted. | | [R] PASV | | [R] 227 Entering Passive Mode (192,168,21,3,5,122) | | [R] Opening data connection IP: 192.168.21.3 PORT: 1402 | | [R] LIST -al | | [R] Connected. Negotiating SSL/TLS session.. | | [R] 150 Opening ASCII data connection for ls / using SSL/TLS. | | [R] SSL/TLS negotiation successful... | | [R] TLSv1/SSLv3 encrypted session using cipher AES256-SHA (256 bits) | | [R] List Complete: 181 bytes in 0.17 seconds (1.04 KBps) | \======================================================================/
Explicit SSL模式下ftp client <-- server的通讯数据,可以看到AUTH SSL之后的指令全部都已经加密,无法看到。对应2.3节中的传统通讯过程,这确保了传输过程中数据无法被窃听到。 在Implicit SSL模式中,从初始化连接开始的数据将全部加密,无法分析,因此此处不摘录。 /======================================================================\ 21:34:22.095241 IP 192.168.0.1.2279 > 192.168.0.3.999: S 1727744887:1727744887(0) win 65535 <mss 1460,nop,nop,sackOK> (DF) 0x0000 4500 0030 e6b7 4000 8006 92bb c0a8 0001 E..0..@......... 0x0010 c0a8 0003 08e7 03e7 66fb 4b77 0000 0000 ........f.Kw.... 0x0020 7002 ffff 428a 0000 0204 05b4 0101 0402 p...B........... 21:34:22.095576 IP 192.168.0.3.999 > 192.168.0.1.2279: S 3598555607:3598555607(0) ack 1727744888 win 65535 <mss 1460,nop,nop,sackOK> (DF) 0x0000 4500 0030 8d9e 4000 8006 ebd4 c0a8 0003 E..0..@......... 0x0010 c0a8 0001 03e7 08e7 d67d 99d7 66fb 4b78 .........}..f.Kx 0x0020 7012 ffff d223 0000 0204 05b4 0101 0402 p....#.......... 21:34:22.095639 IP 192.168.0.1.2279 > 192.168.0.3.999: . ack 1 win 65535 (DF) 0x0000 4500 0028 e6b8 4000 8006 92c2 c0a8 0001 E..(..@......... 0x0010 c0a8 0003 08e7 03e7 66fb 4b78 d67d 99d8 ........f.Kx.}.. 0x0020 5010 ffff fee7 0000 P....... 21:34:22.108439 IP 192.168.0.3.999 > 192.168.0.1.2279: P 1:115(114) ack 1 win 65535 (DF) 0x0000 4500 009a 8da4 4000 8006 eb64 c0a8 0003 E.....@....d.... 0x0010 c0a8 0001 03e7 08e7 d67d 99d8 66fb 4b78 .........}..f.Kx 0x0020 5018 ffff 5cb5 0000 3232 302d 5468 6973 P...\...220-This 0x0030 2073 6572 7665 7220 6973 2066 6f72 2070 .server.is.for.p 0x0040 7269 7661 7465 2075 7365 206f 6e6c 790d rivate.use.only. 0x0050 0a32 .2 21:34:22.257722 IP 192.168.0.1.2279 > 192.168.0.3.999: . ack 115 win 65421 (DF) 0x0000 4500 0028 e6c1 4000 8006 92b9 c0a8 0001 E..(..@......... 0x0010 c0a8 0003 08e7 03e7 66fb 4b78 d67d 9a4a ........f.Kx.}.J 0x0020 5010 ff8d fee7 0000 P....... 21:34:22.257941 IP 192.168.0.3.999 > 192.168.0.1.2279: P 115:154(39) ack 1 win 65535 (DF) 0x0000 4500 004f 8da7 4000 8006 ebac c0a8 0003 E..O..@......... 0x0010 c0a8 0001 03e7 08e7 d67d 9a4a 66fb 4b78 .........}.Jf.Kx 0x0020 5018 ffff 96b3 0000 3232 3020 506c 6561 P.......220.Plea 0x0030 7365 2065 6e74 6572 2079 6f75 7220 6c6f se.enter.your.lo 0x0040 6769 6e20 6e61 6d65 206e 6f77 2e0d 0a gin.name.now... 21:34:22.264587 IP 192.168.0.1.2279 > 192.168.0.3.999: P 1:11(10) ack 154 win 65382 (DF) 0x0000 4500 0032 e6c2 4000 8006 92ae c0a8 0001 E..2..@......... 0x0010 c0a8 0003 08e7 03e7 66fb 4b78 d67d 9a71 ........f.Kx.}.q 0x0020 5018 ff66 e88e 0000 4155 5448 2053 534c P..f....AUTH.SSL 0x0030 0d0a .. 21:34:22.371140 IP 192.168.0.3.999 > 192.168.0.1.2279: P 154:205(51) ack 11 win 65525 (DF) 0x0000 4500 005b 8dac 4000 8006 eb9b c0a8 0003 E..[..@......... 0x0010 c0a8 0001 03e7 08e7 d67d 9a71 66fb 4b82 .........}.qf.K. 0x0020 5018 fff5 9a03 0000 3233 3420 4155 5448 P.......234.AUTH 0x0030 2043 6f6d 6d61 6e64 204f 4b2e 2049 6e69 .Command.OK..Ini 0x0040 7469 616c 697a 696e 6720 5353 4c20 636f tializing.SSL.co 0x0050 6e6e nn 21:34:22.374945 IP 192.168.0.1.2279 > 192.168.0.3.999: P 11:141(130) ack 205 win 65331 (DF) 0x0000 4500 00aa e6c6 4000 8006 9232 c0a8 0001 E.....@....2.... 0x0010 c0a8 0003 08e7 03e7 66fb 4b82 d67d 9aa4 ........f.K..}.. 0x0020 5018 ff33 f99a 0000 8080 0103 0100 5700 P..3..........W. 0x0030 0000 2000 0016 0000 1300 000a 0700 c000 ................ 0x0040 0066 0000 0700 0005 0000 0405 0080 0300 .f.............. 0x0050 8001 .. 21:34:22.375857 IP 192.168.0.3.999 > 192.168.0.1.2279: P 205:10
71(866) ack 141 win 65395 (DF) 0x0000 4500 038a 8dad 4000 8006 e86b c0a8 0003 E.....@....k.... 0x0010 c0a8 0001 03e7 08e7 d67d 9aa4 66fb 4c04 .........}..f.L. 0x0020 5018 ff73 e356 0000 1603 0100 4a02 0000 P..s.V......J... 0x0030 4603 0140 8283 7da1 8821 775e 7765 a9ee F..@..}..!w^we.. 0x0040 18ca e0ab 1b17 461e bf71 515f 6837 5c1a ......F..qQ_h7\. \======================================================================/
The END
|