FTP的升级之路

FTP的升级之路

最近单位在将原来使用的FTP升级为FTPS。我翻了一下相关的协议标准和文档,发现无论从FTP的实际用途还是它带来的争议风险来讲,都值得仔细研究一下。

FTP的历史1

文件传输协议(FTP)是一个非常古老的网络协议,第一个FTP标准发布于1971年,当时跑在ARPANET的传输层协议NCP之上,那时候TCP/IP协议还没出现。之后的FTP协议标准进行过几次修订,1980年发布RFC765首次定义基于 TCP/IP 的 FTP 操作标准。1985年发布的RFC959添加一些新的命令,成为FTP的基本规范。后来就是一系列对FTP的安全扩展以及增加对IPv6的支持。

FTP 基本工作原理

FTP是一种客服-服务器协议,它依赖于客户端和服务器之间的两个通信通道:一个用于控制对话的命令通道和一个用于传输文件内容的数据通道。

工作模式

命令通道的连接总是由客户端(client)发起,服务端(server)在默认端口21或者某个指定端口等待连接。不同的是数据通道的连接由谁来发起,而这也就对应着FTP的两个不同(数据)连接工作模式:主动模式和被动模式。
(这里不讨论匿名方式登录,要求用户通过用户名和口令进行登录)

主动模式

在这里插入图片描述

如图中红色虚线所示,在建立数据通道的时候,如果由服务器向客户端发起TCP的连接请求,称为主动模式。

报文交互过程如下:
Client: USER username
Server: 331 Password required
Client: PASS password
Server: 230 User logged in.
Client: PORT 192,168,1,2,7,138         客户端希望服务器
                                                             连接到地址192.168.1.2
                                                             端口为1930
Server: 200 PORT command successful.
Server: request for data connection
Client: data connection ok.
file transfer…
Client: QUIT
Server: 221 Goodbye.

在该模式中,客户端在建立的命令通道中通过PORT命令告知服务器可以连接的数据通道的地址和端口。然后客户端就在该端口等待服务器发起连接请求。

被动模式

在这里插入图片描述

如图中红色虚线所示,在建立数据通道的时候,如果由客户端向服务器发起TCP的连接请求,称为被动模式。
报文交互过程如下:
Client: USER username
Server: 331 Password required
Client: PASS password
Server: 230 User logged in.
Client: PASV                                       客户端请求服务器打开数据连接端口
Server: 227 Entering Passive Mode
              (172,16,3,4,204,173)             服务端数据通道地址为172.16.3.4
                                                            端口为52397
Client: request for data connection
Server: data connection ok.
file transfer…
Client: QUIT
Server: 221 Goodbye.

在该模式中,客户端在建立的命令通道中通过PASV命令请求服务器数据连接地址和端口,服务器回复它正在监听的端口并等待客户端的连接请求。

面对的挑战

FTP是为简化机器间文件传输而设计,设计之初网络环境简单,所以FTP协议本身也很简单。但随着计算机技术发展,单位组织的网络环境变得非常复杂。复杂的网络环境对FTP服务的使用带来挑战,以下列举几个方面:

  1. 防火墙的存在
    在完成命令通道的建立之后,无论主动模式还是被动模式,都会动态分配数据通道的端口。如果是被动模式,可以在配置服务端数据连接的时候指定端口范围,将该端口范围添加到防火墙的白名单中。
    但在主动模式中,客户端分配数据通道的端口一般不可配置,没办法提前加到防火墙的白名单中。这时候就会出现数据通道一直无法建立,直到连接超时。如果是将大范围的端口都加到防火墙的白名单中,这对于客户端的防护意义会大打折扣。另一种方式对防火墙提出了更高的要求,需要防火墙能够监控到FTP通信中报文的负载内容并在检测到FTP连接的时候动态打开端口。这虽然能够在一定程度上解决问题,但在某些情况下会失效,后面会提到。

  2. NAT的应用
    单位组织的网络通过使用NAT方式布网解决IP地址不足和宽带共享问题。FTP客户端处于专用网络内部,需要通过NAT的方式访问外部的FTP服务器的时候,FTP通过主动模式的方式建立数据通道就会出现问题。(FTP服务端也可能部署在NAT之后提供服务,这里仅考虑客户端方面的NAT情况,服务端面临的问题类似。)
    当内网中FTP客户端通过PORT命令告知服务器数据通道的地址和端口的时候,会指定一个内网地址(如192.168.1.21/24)作为待连接地址,而在公网的服务器无法请求连接到一个内网地址,这时候就需要ALG发挥作用了。
    ALG全称Application Layer Gateway,即应用层网关2。它是特定于具体应用程序的转换代理,允许一个地址域中的主机上的应用程序透明地连接到在不同域中的主机上运行的对应应用程序。
    这里用到的ALG作为NAT的一个扩展实现。FTP命令通道中的PORT命令的参数包含建立数据通道所需要的IP地址和TCP端口。NAT ALG需要监控FTP命令通道中报文负载并对其修改,将数据通道建立连接的元组信息及方向更新到NAT,以便 NAT 可以为 FTP 数据会话设置状态信息。

    下面以主机从FTP服务器下载文件为例,说明主动模式下NAT ALG的工作过程。

    在这里插入图片描述

主机(Host 192.168.100.13)位于私网,中间通过NAT设备访问位于公网的FTP Server(假设地址为166.111.4.80)。NAT左侧端口地址为192.168.1.1,作为私网的默认网关;右侧出口地址为39.105.51.17,是一个对外公网地址。

下载文件过程开始,Host主机与FTP Server之间建立控制连接。Host继续发送PORT命令报文,携带自己的地址和端口(192.168.100.13,5341),请求以主动模式开启数据通道连接。当PORT报文经过NAT的时候,作为NAT的扩展ALG就要发挥它的作用了。ALG检测到PORT报文的负载中包含IP地址和端口信息,将其替换为39.105.51.17:56317,同时将该修改信息反馈给NAT本身。接下来FTP服务器会向39.105.51.17:56317发起请求建立数据通道,该请求报文到达NAT的时候,NAT根据记录信息,将该请求转发给主机192.168.100.13。至此,数据连接建立完成即可开始文件下载过程。

另外,由于PORT命令携带的IP地址和端口是ASCII编码,这可能会导致对数据包的大小修改。比如,192.168.100.13是14个ASCII字符,而39.105.51.17是12个ASCII字符。如果新的大小和之前的大小一致,这时候只需要修改TCP的校验和。如果新的大小大于或者小于之前的大小,在FTP控制会话中的TCP的序列号也要被修改。这时候的ALG需要建立一个表来修正TCP序列号和ACK号码,而这个序列号和ACK号的修改将会贯穿整个FTP命令会话过程。

在网络中NAT的应用很多,并且NAT的实现有很多变种;NAT的应用对于很多的协议提出了挑战,这个还挺有意思的,在后面可以小结一下。

  1. load balancing 的挑战3
    如果FTP服务器位于负载均衡器后面,这意味着在被动模式中,FTP服务器提供的自身数据通道监听地址和端口并不能够被用户连接,此时需要FTP服务器告知客户端负载均衡器的地址。
    以FileZilla服务器为例,在它的被动模式设置使用外部Server IP地址(以下图片来源于网络),
    在这里插入图片描述

这样就能够保证被动模式下,由客户端发起的建立连接请求能够被负载均衡器处理。同时,需要配置负载均衡器监听所有的端口。比如nginx(v1.15.10开始)作为负载均衡器使用的时候,支持设置端口范围4,所以理论上可以做到监听所有的端口。

这里仅列举了出现频率较高的问题,在真实的网络部署环境中,FTP部署要面对更多的问题。

FTP存在的安全问题

FTP设计简单,很多地方存在着安全隐患,chrome和firefox都不再支持FTP。Mozilla安全团队在其博客中概括了FTP的安全风险5

The biggest security risk is that FTP transfers data in cleartext, 
allowing attackers to steal, spoof and even modify the data transmitted. 
To date, many malware distribution campaigns launch their attacks by compromising FTP servers 
and downloading malware on an end user’s device using the FTP protocol.

这些安全风险可以分解为以下几点:

  1. 用户名和口令明文传输,而且在某些系统中ftp可能会采用系统账户的用户名和口令。

  2. FTP服务一般采用被动模式建立数据连接,明文会暴露ftp服务器打开的随机端口,通常这些端口会被加入到防火墙的白名单。打开的随机端口越多,风险越大。

  3. 反弹攻击(The Bounce Attack)6: 攻击者通过向FTP服务端发送PORT命令,指示服务端与某个网络服务器建立连接并发送恶意文件,以此达到攻击该服务器的目的。更糟糕的是,这种方式很难追踪到真正的攻击者。

  4. 端口窃取(Port Stealing)6
    FTP中数据传输是通过为每一个要传输的文件创建新的TCP连接实现。每次创建新的连接,根据不同模式,需要客户端或服务端创建监听socket等待另一端的连接。端口窃取指的是攻击者根据观察可以猜测到下一个要打开的数据通道端口,在真正的客户端或服务端连接前对该端口进行连接。以被动模式为例,攻击者连接到服务端后,原来的客户端无法进行文件传输。攻击者可以在服务端下载敏感数据文件也可以上传恶意文件。

FTPS解决了哪些问题

FTPS利用SSL/TLS对FTP数据进行加密传输,这是一种常用且简单的数据保护方法。使用FTPS基本可以做到FTP的安全性和易用性之间的平衡。
对于安全风险中的第1和第2点,使用FTPS能够避免。
对于第3点,还需要结合其他措施降低风险,比如:禁用主动模式,仅使用被动模式传输;对于知名网络服务器(端口0~1023)的访问,在服务端直接禁掉,这可以在一定程度上减少反弹攻击,但仍不能避免对非知名网络服务的攻击;因为反弹攻击的第一步是将攻击文件上传到FTP服务器,所以对FTP服务端上文件采用适当的文件保护措施,能够一定程度上减少反弹攻击。
对于第4点,TLS的应用通过对建立数据连接的对端认证可以阻止没有授权的用户接收或者发送文件。

FTPS vs FTPES

利用SSL/TLS对FTP数据进行加密包括两种方式,即FTPS(隐式FTPS, ftp over implicit SSL)和FTPES(显式FTPS, ftp over explicit SSL)。

显式FTPS
在这里插入图片描述

隐式FTPS
在这里插入图片描述

隐式FTPS是在建立TCP连接之后,直接开始TLS加密过程(通过抓包可以看出,在三次握手之后,客户端首先发起Client Hello请求)。而显式FTPS是在客户端与服务端建立连接之后,由客户端发送AUTH TLS命令报文进行显式的请求安全通信,然后开始协商过程,二者协商加密的协议、方法等内容。

这里参考网上的一幅对比图7,它对二者做了对比:
在这里插入图片描述

在进行FTPS通信的时候,根据用户配置决定开启显式或隐式FTPS请求。同样,依据服务端的配置,决定是否支持用户的请求:可能用户请求隐式FTPS通信,但服务端不支持;可能用户请求显式FTPS通信,而服务端支持这种通信方式。一般两端商量好采用的FTPS方式,然后进行对应配置。

关于隐式FTPS,有的说法是它从一开始就全程SSL/TLS加密,安全性高,也有的说法列举了它的一系列"缺点":仅支持绑定990端口,无法实现同一台server上配置多个FTP服务;相对于FTP而言,隐式FTPS使用了额外的端口。然后很多地方讲隐式FTPS已经deprecated了。这就带给了我一个疑惑:这点儿缺点不至于把隐式FTPS废掉啊。
后来看到论坛里的一个说法8:从来就没有一个关于隐式FTPS的正式规范。它在各家软件的实现无法保证一致,从而导致不稳定的行为或完全不兼容。
再去翻一下RFC4217中"Securing FTP with TLS"的描述恰恰就是我们所说的显式FTPS。到这里,大概知道了为什么隐式FTPS被deprecated了。

补充一点,FTPS中的命令通道被TLS加密,其中所有传输的命令都被加密传输,包括客户端和服务端协商建立数据连接的端口和地址。之前在谈到FTP部署对防火墙的挑战的时候,因为能够"感知"应用,防火墙可以实现动态临时打开限制端口,但由于TLS的加持,这使得防火墙的"智能"不再:无法再动态的调整防火墙对FTP数据通道端口的限制。只能通过手动配置的方式,在服务端限制FTP应用使用的端口范围,并将其全部添加到防火墙允许通过列表中。

参考

  1. FTP Overview, History and Standards
  1. IP Network Address Translator (NAT) Terminology and Considerations
  1. Can you load balance FTP servers
  1. nginx stream core module, port ranges
  1. Stopping FTP support in Firefox 90
  1. FTP Security Considerations
  1. The Difference Between Implicit and Explicit FTPS
  1. Implicit FTPs - What is the deal?
  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值