FTP协议简介
1.  什么是FTP协议
FTP协议(File Transfer Protocol)即远程文件传输协议,是一个用于简化IP网络上系统之间文件传送的协议,FTP是TCP/IP的一种具体应用,它工作在OSI模型的第7层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,FTP建立的就是一个可靠的连接。采用FTP协议可使 Internet用户高效地从网上的FTP服务器下载大信息量的数据文件,将远程主机上的文件拷贝到自己的计算机上。以达到资源共享和传递信息的目的。由于FTP的使用使得Internet上出现大量为用户提供的下载服。Internet成为了一个巨型的软件仓库。
2.  FTP工作原理
FTP有两个过程一个是控制连接,一个是数据传输。FTP协议不像HTTP协议一样需要一个端口作为连接(默认时HTTP端口是80,FTP端口是21)。FTP协议需要两个端口,一个端口是作为控制连接端口,也就是FTP的21端口,用于发送指令给服务器以及等待服务器响应;另外一个端口用于数据传输端口,端口号为20(仅用PORT模式),是用建立数据传输通道的,主要作用是从客户向服务器发送一个文件,从服务器向客户发送一个文件,从服务器向客户发送文件或目录列表。
3.   FTP的传输模式
FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。假设两台计算机通过ftp协议对话,并且能访问Internet, 你可以用ftp命令来传输文件。每种操作系统使用上有某一些细微差别,但是每种协议基本的命令结构是相同的。
FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式。

ASCII传输方式
假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。
二进制传输模式
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。
4. FTP的工作方式FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。
下面介绍一个这两种方式的工作原理:

Port模式

FTP 客户端首先动态的选择一个端口(一般是1024以上的)和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

Passive模式
在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。
很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。


文件传输协议(File Transfer Protocol,FTP)是一个被广泛应用的协议,它使得我们能够在网络上方便地传输文件。早期FTP并没有涉及安全问题,随着互连网应用的快速增长,人们对安全的要求也不断提高。本文在介绍了FTP协议的基本特征后,从两个方面探讨了FTP安全问题的解决方案:协议在安全功能方面扩展;协议自身的安全问题以及用户如何防范之。
1. 简介
1.1 FTP的一些特性
    早期对FTP的定义指出,FTP是一个ARPA计算机网络上主机间文件传输的用户级协议。其主要功能是方便主机间的文件传输,并且允许在其他主机上进行方便的存储和文件处理。[BA72]而现在FTP的应用范围则是Internet。
  根据FTP STD 9定义,FTP的目标包括:[PR85]
  1) 促进文件(程序或数据)的共享
    2) 支持间接或隐式地使用远程计算机
3) 帮助用户避开主机上不同的
4) 可靠并有效地传输数据
  关于FTP的一些其他性质包括:FTP可以被用户在终端使用,但通常是给程序使用的。FTP中主要采用了传输控制协议(Transmission Control Protocol,TCP)[PJ81],和Telnet 协议[PJ83]。
1.2 重要历史事件[PR85]
  1971年,第一个FTP的RFC(RFC 114)由A.K. Bhushan在1971年提出,同时由MIT与 Harvard实验实现。
  1972年,RFC 172 提供了主机间文件传输的一个用户级协议。
  1973年2月,在长期讨论(RFC 265,RFC 294,RFC 354,RFC 385,RFC 430)后,出现了一个官方文档RFC 454。
  1973年8月,出现了一个修订后的新官方文档 RFC 542。确立了FTP的功能、目标和基本模型。当时数据传输协议采用NCP。
  1980年,由于底层协议从NCP改变为TCP,RFC 765 定义了采用TCP的FTP。
  1985年,一个作用持续至今的官方文档RFC 959(STD 9)出台。
1.3 FTP模型[PR85]
  就模型而言,从1973年以来并没有什么变化。下图是FTP使用模型:
                      -------------
                      |/---------\|
                      ||  User ||  --------
                      ||Interface|<--->| User |
                      |\----^----/|  --------
         ----------        |   |   |
         |/------\| FTP Commands |/----V----\|
         ||Server|<---------------->|  User ||
         || PI ||  FTP Replies ||  PI  ||
         |\--^---/|        |\----^----/|
         |  |  |        |   |   |
   --------  |/--V---\|   Data   |/----V----\|  --------
   | File |<--->|Server|<---------------->| User  |<--->| File |
   |System|  || DTP ||  Connection  ||  DTP  ||  |System|
   --------  |\------/|        |\---------/|  --------
         ----------        -------------

         Server-FTP          USER-FTP

   注: 1. data connection 可以双向使用(双工)
     2. data connection 不需要一直存在.
           图一  FTP使用模型

  术语
    User PI(user-protocol interpreter): 用户协议解释器
    Server PI(Server-protocol interpreter): 服务协议解释器
    control connection:控制连接
    Data connection:数据连接
    FTP Commands:FTP命令。描述Data connection的参数,文件操作类型
    FTP Replies:FTP命令
  在图一描述的模型中,User PI创建control connection。control connection遵从Telnet协议。在用户初始化阶段,标准FTP命令被User PI生成并通过control connection 传到服务器处理。Server PI将相应的标准FTP应答通过control connection回传给User PI。数据传输由Data connection完成。
  User DTP 在特定端口监听,由Server DTP 用指定参数初始化连接。
  另一种情形是用户希望在两台非本地的主机上传递文件。用户与两个服务器建立control connection,安排两个服务器间的文件传输。下图描述了这样的模型。
          Control   ------------  Control
          ---------->| User-FTP |<-----------
          |     | User-PI |      |
          |     |  "C"  |      |
          V     ------------      V
      --------------            --------------
      | Server-FTP |  Data Connection   | Server-FTP |
      |  "A"   |<---------------------->|  "B"   |
      -------------- Port (A)   Port (B) --------------
               图二 服务器间交互模型
2.FTP协议的安全扩展[HL97]

2.1 一些安全地进行文件传输实践

  a. 通过FTP传输预先被加密的文件
  b. 通过E-mail传输预先被加密的文件
  c. 通过PEM消息
  d. 通过使用Kerberos的rcp命令.

2.2 在RFC 2228 之前的FTP并不安全
  虽然FTP采用 TELNET 协议执行connection control操作,而且 TELNET 协议后来又增补了认证和加密选项,但在RFC 1123 中禁止在connection control中进行 TELNET 选项协商。另外 TELNET 协议也没有提供完整性保护,而且也没有data connection 的保护。

2.3 扩展命令
  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), 保密保护命令
  ENC (Privacy Protected Command),私有性保护命令
  一种新的返回类型(6yz)也被引入以保护返回值。

2.4 协议状态图
  下图描述了在一个提高了安全性的FTP实现中认证和和授权的流程。方形的块表示客户端需要发出的命令的状态,菱形的块表示服务器需要发出响应的状态。
     ,------------------, USER
    __\| Unauthenticated |________\
   | /| (new connection) |       /|
   |  `------------------'       |
   |      |             |
   |      | AUTH          |
   |      V             |
   |      / \              |
   | 4yz,5yz /  \  234        |
   |<--------<   >------------->. |
   |     \  /           | |
   |      \_/            | |
   |      |            | |
   |      | 334          | |
   |      V            | |
   | ,--------------------,      | |
   | | Need Security Data |<--. | |   |
   | `--------------------'      | | |
   |      |           | | |
   |      | ADAT        | | |
   |      V          | | |
   |      / \           | | |
   | 4yz,5yz /  \  335      | | |
   `<--------<   >-----------'  | |
         \  /          | |
         \_/          | |
          |            | |
          | 235         | |
          V           | |
      ,---------------.        | |
   ,--->| Authenticated |<--------'| |当客户与服务器
   |  `---------------'       | 完成了认证,如
   |      |           | 果存在完整性就
   |      | USER         | 必须对命令进行
   |      |           | 完整性保护。CCC
   |      |<-------------------' 命令可以用来放松
   |      V            这个限制。
   |      / \
   | 4yz,5yz /  \  2yz
   |<--------<   >----------->.
   |     \  /        |
   |      \_/        |
   |      |         |
   |      | 3yz       |
   |      V         |
   |  ,---------------.     |
   |  | Need Password |     |
   |  `---------------'     |
   |      |         |
   |      | PASS      |
   |      V         |
   |      / \        |
   | 4yz,5yz /  \  2yz     |
   |<--------<   >----------->|
   |     \  /        |
   |      \_/        |
   |      |         |
   |      | 3yz       |
   |      V         |
   |  ,--------------.     |
   |  | Need Account |     |
   |  `--------------'     |
   |      |         |
   |      | ACCT      |
   |      V         |
   |      / \        |
   | 4yz,5yz /  \  2yz     |
   `<--------<   >----------->|
         \  /        |
         \_/        |
          |         |
          | 3yz       |
          V         |
       ,-------------.     |
       | Authorized |/______|
       | (Logged in) |\
       `-------------'
3. 协议的安全问题及防范措施[AO99]
3.1 防范反弹***(The Bounce Attack)
  a. 漏洞
    FTP规范[PR85]定义了“代理FTP”机制,即服务器间交互模型。支持客户建立一个FTP控制连接,然后在两个服务间传送文件。同时FTP规范中对使用TCP的端口号没有任何限制,而从0-1023的TCP端口号保留用于众所周知的网络服务。所以,通过“代理FTP”,客户可以命令FTP服务器***任何一台机器上的众所周知的服务。
  b. 反弹***
    客户发送一个包含被***的机器和服务的网络地址和端口号的FTP“PORT”命令。这时客户要求FTP服务器向被***的服务发送一个文件,这个文件中应包含与被***的服务相关的命令(例如:SMTP、NNTP)。由于是命令第三方去连接服务,而不是直接连接,这样不仅使追踪***者变得困难,还能避开基于网络地址的访问限制。
  c. 防范措施
    最简单的办法就是封住漏洞。首先,服务器最好不要建立TCP端口号在1024以下的连接。如果服务器收到一个包含TCP端口号在1024以下的PORT命令,服务器可以返回消息504([PR85]中定义为“对这种参数命令不能实现”)。
    其次,禁止使用PORT命令也是一个可选的防范反弹***的方案。大多数的文件传输只需要PASV命令。这样做的缺点是失去了使用“代理FTP”的可能性,但是在某些环境中并不需要“代理FTP”。
  d. 遗留问题
    光控制1024以下的连接,仍会使用户定义的服务(TCP端口号在1024以上)遭受反弹***。

3.2 有限制的访问(Restricted Access)
  a. 需求
    对一些FTP服务器来说,基于网络地址的访问控制是非常渴望的。例如,服务器可能希望限制来自某些地点的对某些文件的访问(例如为了某些文件不被传送到组织以外)。另外,客户也需要知道连接是有所期望的服务器建立的。
  b. ***
    ***者可以利用这样的情况,控制连接是在可信任的主机之上,而数据连接却不是。
  c. 防范措施
    在建立连接前,双方需要同时认证远端主机的控制连接,数据连接的网络地址是否可信(如在组织之内),
  d. 遗留问题
    基于网络地址的访问控制可以起一定作用,但还可能受到“地址盗用(spoof)”***。在spoof***中,***机器可以冒用在组织内的机器的网络地址,从而将文件下载到在组织之外的未授权的机器上。

3.3 保护密码(Protecting Passwords)
  a. 漏洞
    第一、在FTP标准[PR85]中,FTP服务器允许无限次输入密码。
第二、“PASS”命令以明文传送密码
  b. ***
    强力***有两种表现:在同一连接上直接强力***;和服务器建立多个、并行的连接进行强力***。
  c. 防范措施
    对第一种中强力***,建议服务器限制尝试输入正确口令的次数。在几次尝试失败后,服务器应关闭和客户的控制连接。在关闭之前,服务器可以发送返回码 421(服务不可用,关闭控制连接”)。另外,服务器在相应无效的“PASS”命令之前应暂停几秒来消减强力***的有效性。若可能的话,目标操作系统提供的机制可以用来完成上述建议。
    对第二种强力***,服务器可以限制控制连接的最大数目,或探查会话中的可疑行为并在以后拒绝该站点的连接请求。
    密码的明文传播问题可以用FTP扩展中防止窃听的认证机制解决。
  d. 遗留问题
    然而上述两种措施的引入又都会被“业务否决”***,***者可以故意的禁止有效用户的访问。

3.4 私密性(Privacy)
  在FTP标准中[PR85]中,所有在网络上被传送的数据和控制信息都未被加密。为了保障FTP传输数据的私密性,应尽可能使用强壮的加密系统。

3.5 保护用户名Usernames
  a. 漏洞
    当“USER”命令中的用户名被拒绝时,在FTP标准中[PR85]中定义了相应的返回码530。而当用户名是有效的但却需要密码,FTP将使用返回码331。
  b. ***
    ***者可以通过利用USER操作返回的码确定一个用户名是否有效
  c. 防范措施
    不管如何,两种情况都返回331。

3.6 端口盗用Port Stealing
  a. 漏洞
    当使用操作系统相关的方法分配端口号时,通常都是按增序分配。
  b. ***
    ***者可以通过规律,根据当前端口分配情况,确定要分配的端口。他就能做手脚:预先占领端口,让合法用户无法分配;窃听信息;伪造信息。
  c. 防范措施
    由操作系统无关的方法随机分配端口号,让***者无法预测。

4. 结论
  FTP被我们广泛应用,自建立后其主框架相当稳定,二十多年没有什么变化,但是在Internet迅猛发展的形势下,其安全问题还是日益突出出来。上述的安全功能扩展和对协议中安全问题的防范也正是近年来人们不懈努力的结果,而且在 一定程度上缓解了FTP的安全问题  。