计算机网络——网络安全③
连接层安全性:安全套接字层
TCP使用一个强化版本提供机密性、数据完整性和端点鉴别(鉴别客户端和服务器),称为安全套接字层(Secure Socket Layer,SSL)。 SSL的第三版的一个改进版称为运输层安全性(Transport Layer Security,TLS),已经由IETF标准化在RFC 8446中。 SSL得到广泛应用,并且已经被大部分互联网上的网站所支持,因为HTTP服务正是运行在TCP之上。
SSL原则上工作在应用层,但对应用程序而言,其实际上提供一个控制安全套接字的接口,和TCP的接口非常类似,因此对于应用程序其实际上位于连接层和应用层之间。 我们称SSL是工作在应用程序与连接层之间的一个子层,其仍然属于应用层。
工作流程
我们将大致介绍SSL的工作流程。 SSL具有三个阶段:握手、密钥导出和数据传输,前两个阶段也可以统称握手。 我们假设Bob向Alice发起连接,Alice作为服务器应当具有一个带有公钥的证书和对应的私钥。
握手与密钥导出
首先介绍握手阶段,此时客户端Bob需要建立TCP连接、验证Alice的身份然后生成并发送主密钥(Master Secret,MS)。
主密钥在此后的密钥导出中用于生成其他密钥。
首先Bob进行典型的TCP三次握手并建立TCP连接。
如果成功建立连接,则Bob发送ClientHello
报文请求建立SSL连接,其中包括自己期望的加密算法等参数和一个随机不重数。
服务器以证书和一些其他内容回复,包括:
一个ServerHello
报文,其中包括服务器选择的加密算法,包括一个对称加密算法,一个公钥加密算法(或密钥交换算法)和一个MAC及签名算法,通称加密套件(Cipher suite);
一个Certificate
报文,包括服务器的证书,根据加密套件不同可能不发送证书;
一个ServerKeyExchange
报文,用于进行密钥交换,如果加密套件不使用密钥交换算法则不发送此报文;
一个ServerHelloEnd
报文,标志回复的结束。
客户端验证证书的正确性,然后回复一个ClientKeyExchange
报文,含有前主密钥(Pre-Master Secret,PMS)、公钥等内容,这个内容是由加密套件指定的。
前主密钥需要使用从证书中提取的服务器公钥进行加密。
服务端收到加密的前主密钥后,进行解密得到PMS。 然后,客户端和服务端各自独立地根据PMS和不重数导出主密钥,然后根据主密钥生成两个会话加密密钥和两个鉴别密钥。 会话加密密钥用于会话的对称加密,由Bob发送的数据和由Alice发送的数据使用不同的密钥; 同理,鉴别密钥用于生成MAC,两端也使用不同的密钥。 使用不同的密钥更加安全。
如果对称加密使用密码块链接(CBC),那么两端的两个初始向量(IV)也由主密钥获得。
最后两端发送所有握手报文的MAC以免受篡改。
客户端首先发送ChangeCipherSpec
报文,标识此后的内容都已经加密且被验证,然后发送一个Finish
报文,其中含有MAC。
服务端接收此报文并验证上述所有报文的MAC,如果发现不符则终止连接。
服务端也发送这两个报文供客户端验证。
上文介绍的握手基于公钥加密进行主密钥的产生,使用密钥交换算法的时候,其步骤略有不同,但是基本思路是一致的。 如果不是服务端具有证书,而是客户端具有证书,那么握手的过程也会发生变化。
数据传输
TCP是一种字节流协议,因此使用SSL进行加密的自然方法就是使用SSL在传输中加密数据,然后再将加密的字节流发送给TCP层。 但是,如果只发送加密的字节流,那么就无法使用MAC验证报文的完整性了。 为此,SSL使用一种称为记录(Record)的方式传输数据。
每一个SSL记录含有报文类型,SSL版本,报文长度,数据和MAC五个组件。 记录中数据和MAC使用发送方的密钥进行加密,而剩下三个不加密。
值得注意的是,TCP的报文首部是没有加密的,因此如果只对数据计算MAC,那么这种方案不能应对重排序攻击。 这种攻击调整TCP首部的序号,如果每个TCP报文段只含有一个记录,这会使得接收方收到顺序错误的记录,而这些记录都可以正确解密。 解决这个问题的关键在于为每个记录分配一个序号,每一端发送一个记录后就将自己的序号加一。 Alice和Bob分别维护自己和对方的序号,但不在报文中包括这个序号,而是在计算MAC时同时计算记录和序号的MAC。 因此,任何一端都可以同时使用维护的对方的序号和数据计算MAC,然后验证正确性。
连接关闭
SSL实质上不能对截断攻击(Truncation attack)进行任何保护,因为其基于TCP,而TCP连接只需要发送未经保护的FIN
报文就会被终止。
为了稍微缓解这种攻击,SSL使用一个特殊的关闭通知(Close notify)记录。
这是一大类警报记录中的一种,警报记录还负责通知诸如MAC错误之类的问题。
尽管修改未经保护的SSL记录的类型字段是相当容易的,但是这种修改会导致MAC验证失效。
这种缓解方案仍然不能对抗中间人发送的FIN
报文攻击,但是如果一端在没有收到关闭通知的情况下发现TCP连接关闭,那么就可以认为是恶意的攻击。
大部分应用程序使用额外的方法保证信息不会被截断,如HTTP首部的Content-length
字段。
除此之外,不使用关闭通知的连接关闭实在非常常见,比如移动设备离开WiFi范围导致的物理链路被切断,因此大部分应用程序实际上不对错误的TCPFIN
报文段做出任何响应。
网络层安全性:IP安全与虚拟专用网
互联网安全协议(IP security,IPsec)为任何两个网络层实体之间的IP数据报提供安全性; 利用IPsec,机构可以在公共互联网上搭建虚拟专用网(Virtual Private Net,VPN)。
网络层的机密性可以为所有运行在网络层之上的载荷,如TCP或UDP报文段或ICMP报文,提供机密性。 这种机密性可以防止任何第三方对报文的嗅探,无论是电子邮件还是网络管理报文。 因此,网络层的机密性可以认为提供了“地毯式覆盖”。
除了机密性,IPsec也提供鉴别和完整性等服务。
虚拟专用网
跨越多个物理位置的组织如果需要在使用网络的同时保证物理层面上的安全性,往往会部署一个单独的物理网络。 这个物理网络就像互联网一样,具有物理链路、主机、路由器和诸如DNS、DHCP等服务器,但是不和互联网连接,或是仅使用特别的网关和互联网连接。 这种网络称作专用网络(Private network),和专用地址一样,“专用”表示这个网络是仅供一个组织内部使用的。 专用网络虽然仅和互联网进行有限的连接,但是完全遵守IP协议。
显然,搭建一个物理独立的网络需要花费大量的时间与资源,因此现有的组织通常使用虚拟专用网,即VPN。 为了实现这一点,IP数据报需要经过整个公共因特网,但是同时保证只有VPN中的端系统可以进行通信,因此通常的VPN都需要使用IPsec。
IPsec可以在主机或是路由器上部署。 一个子网的网关路由器(即和互联网的边界路由器)可以部署IPsec协议,从而将任何出口的明文IP数据报转化为加密的数据报,并将进入的加密数据报转化为明文数据报。 值得注意的是,这种网关不仅可以发送IPsec数据报,也可以发送明文IP数据报,前者用于另一个启用IPsec的节点进行VPN通信,后者用于和互联网上的其他实体(如Google服务器)通信。
AH协议和ESP协议
IPsec是一族相当复杂的协议,主要包含在RFC 4301与RFC 6071中。 协议族中包括三个最重要的协议:鉴别首部(Authentication Header,AH)协议和封装安全载荷(Encapsulation Security Payload,ESP)协议,进行加密时可以选择使用两者之一。 前者只提供源鉴别和报文完整性服务,而后者可以提供源鉴别、报文完整性和机密性服务,因此我们主要关注后者。 除此之外还有一个用于密钥管理的因特网密钥交换(Internet Key Exchange,IKE)协议,我们也会介绍这个协议。
安全关联
IPsec在两个进行通信的节点之间建立一个逻辑连接,称为安全关联(Security Association,SA)。 这种连接是单工的,即仅有源可以向目的地单向发送数据报,如果需要双工通信,则需要再建立一个SA。
SA的源和目的地需要维护以下信息:
- 一个32比特的标识符,称为安全参数索引(Security Parameter Index,SPI);
- SA的源接口与目的接口的IP地址;
- 加密类型和加密密钥;
- 完整性检查类型和鉴别密钥。
当发送端需要发送或接收端需要接受IPsec数据报时,其总是会查询这些信息来进行解密和鉴别。 这些数据被维护在安全关联数据库(Security Association Database,SAD)中,通常由操作系统内核负责维护这个数据库。
ESP IPsec数据报
IPsec使用两种不同的分组模式,分别为隧道模式(Tunnel mode)和运输模式(Transport mode)。 两种模式对IP数据报的不同部分进行加密,因此适用于不同的目的。 我们将详细介绍适用于搭建VPN的隧道模式,其部署更加广泛,然后稍微介绍一下运输模式。
使用ESP的IPsec数据报依次含有以下内容:
- 新IP首部;
- ESP首部,含有SPI和序号;
- 初始IP首部,即被加密的IP数据报的首部;
- 初始IP载荷;
- ESP尾部,含有填充,填充长度和下一个首部的信息;
- ESP MAC。
其中,从第三项至第五项被加密,而计算的ESP MAC包括第二项至第五项。 从而,整个被鉴别的部分包括ESP首部、初始IP首部、初始IP载荷和ESP尾部,这四个部分称为“Enchilada”(墨西哥玉米卷饼,也指“最重要的事”)。
值得注意的是,和SSL不同,IPsec中先进行加密,再计算MAC,而SSL先计算MAC,再和MAC一起进行加密,前者称为“先加密再MAC”(Encrypt-then-MAC,EtM),后者称为“先MAC再加密”(MAC-then-Encrypt,MtE)。 在未提及的应用层协议SSH中,首先用明文计算MAC,然后仅加密报文,这种方式称为“加密并MAC”(Encrypt-and-MAC,E&M)。
IPsec使用以下步骤将普通数据报转换成IPsec数据报:
- 在初始IPv4数据报后计算并附加ESP尾部;
- 使用SA规定的算法和密钥加密IPv4数据报和ESP尾部;
- 在加密的数据报之前计算并附加ESP首部;
- 计算MAC并附在数据报最后;
- 计算新的IPv4首部。
我们接下来依次考虑如何计算附加的内容。
新的IPv4首部如何计算呢?
假设初始IPv4数据报从子网1.1.1/24
中的1.1.1.100
出发,目的为子网2.2.2/24
中的2.2.2.100
,启用IPsec的网关分别为1.1.1.1
和2.2.2.1
,那么原始IPv4首部的源地址和目的地址显然为1.1.1.100
和2.2.2.100
。
在网关处,它从SAD中识别到这是一个需要被转换为IPsec的分组,因此它进行以上步骤,并把新的IPv4首部的源地址和目的地址设定为1.1.1.1
和2.2.2.2
。
这就是说,在隧道模式下,网关会把SA的两端填入新的IPv4首部中。
这个新IPv4的协议号为50
,无论载荷的协议是什么,这表示该数据报为IPsec数据报。
ESP首部以明文的方式含有SPI和序号。 SPI可以通过查询SAD容易地得到。 序号和SSL序号一样,都是用来防御重放攻击的。
ESP尾部含有关于填充的信息,填充用于保证使用块密码加密的数据符合块的长度。 下一个首部含有IP载荷中的协议信息,其含义和初始IP首部的“协议”字段含义一致。
这个数据报具有通常IPv4数据报的格式,因此途径的任何一个路由器都会负责地转发这个数据报。
当ESP数据报到达隧道末端时,其首先检查协议字段,如果为50
,那么表示需要进行IPsec处理。
首先,其使用明文的SPI信息从SAD中获取SA的所有信息,包括加密方式和密钥等;
然后,计算MAC并进行比对,如果一切正常,则验证序号是否正确以避免重放攻击;
最后,使用密钥进行解密,删去填充并抽取正常的IP数据报,然后处理正常的数据报。
现在,发送和接受的网关如何决定是否使用IPsec,使用哪一个SA进行加密或解密呢? 除了SAD之外,IPsec实体还维护一个安全策略库(Security Policy Database,SPD)。 这个数据库使用源IP地址、目的IP地址和协议类型进行索引,可以进行是否使用IPsec和使用哪个SA的决策。
以上介绍的都是隧道模式相关的内容,在这种模式下,一对网关负责搭建隧道,并把整个IPv4数据报封装在ESP中。 如果使用运输模式,则IPsec直接负责从一个端系统到另一个端系统的运输。 IPsec不会构造新的IP首部,而是直接使用原始的首部,相对地,其报文具有以下格式:
- IP首部,其中协议号设为
50
; - ESP首部;
- IP载荷
- ESP尾部;
- ESP MAC。
不难发现其实报文的格式几乎一样,只是原始IP首部不再作为载荷进行加密和鉴别了。
因特网密钥交换
我们尚没有解决如何生成SA的问题。 如果VPN的端点较少,那么网络管理员可以手动管理SAD,并为SA指定算法和密钥。 但大型的、物理位置分散的VPN网络要求使用某种自动方法进行密钥管理。
IPsec使用IKE进行密钥管理,此时要求每个IPsec实体(而不是服务器)具有自己的证书,包括签名和公钥,同时还有自己的私钥。 和SSL握手类似,IKE协议允许两个实体交换证书并协商加密和鉴别算法和密钥,不同的是IKE只使用两个阶段。
在第一个阶段,IKE主要负责建立一个安全的信道,用于协商IPsec相关内容,为此,两个实体进行两次报文交换:
- 两侧使用Diffie-Hellman算法交换一个密钥并产生一个双向IKE SA(不同于上文所述的IPsec SA)。此时,两侧协商用于IKE SA的加密和鉴别算法和密钥,并产生第二阶段建立IPsec SA的主密钥。两侧既不使用对方的公钥,也不使用自己的私钥,因此不暴露自己的身份。
- 然后,两侧通过证书等手段验证对方的身份。此时,两侧都需要使用自己的私钥进行签名,并发送自己的证书,因此会泄露自己的身份,但是由于协商在IKE SA信道上进行,因此不会泄露给第三方。
在第二个阶段,两侧生成两个IPsec SA,形成双工信道。 两侧通过在IKE SA信道上协商IPsec所用的加密和鉴别算法以及其密钥达成这一点。 IKE分为两个阶段,从而以和会话密钥相同的思路降低了公钥算法所需的时间。
无线链路层安全性:WEP和WPA
正如此前介绍的,现有的有线网多基于点对点连接,因此对安全性没有特别紧迫的需求。 相对地,无线网络多使用广播信道,因此需要较强的安全性。
在本节中,我们将研究两个常见的802.11的安全性规定,包括有线等效保密(Wired Equivalent Privacy,WEP)和802.11i标准。 前者因为安全性缺陷已经被基本淘汰了,后者被广泛使用,又称WiFi保护接入(WiFi Protected Access,WPA)。
有线等效保密
WEP协议设计于1999年,可以为主机和无线接入点(AP)提供鉴别和加密。 WEP不指定密钥协商算法,这通常是通过主机手动输入实现的,就像在餐厅中询问WiFi密码那样,因此在之后的讨论中我们假设两端已经协商了一个密钥。
WEP使用非常简单的方法进行主机的鉴别,这种鉴别方法称为共享密钥鉴别(Shared Key Authentication): 收到主机的请求后,接入点明文发送一个不重数,然后主机使用密钥进行加密,再发送给接入点。 接入点使用密钥进行解密,然后对比两个不重数是否相同。 WEP也可以选择不进行鉴别,这种“鉴别方法”称为开放系统鉴别(Open System Authentication)。 乍一看似乎共享密钥鉴别更加安全,但实际上,由于无线信道是广播信道,任何人都可以获得明文和密文不重数,这使得选择明文攻击非常容易进行。
WEP的数据加密方法也相当简单。
首先,假定两端都知道一个40比特的对称密钥,称为$K_S$,然后,在每个802.11帧首部之后都附加一个24位的IV。 把IV附在密钥后面,就可以生成一个64比特的密钥$K_S^{IV}$,这个密钥被用来进行加密。 每一帧使用不同的IV,因此也有不同的密钥。
然后,为每个帧的载荷计算四字节的CRC值,以$K_S^{IV}$作为密钥,使用RC4算法进行加密。 RC4是一个流密码,我们不讨论它的技术细节,仅仅阐述其思路。 RC4使用$K_S^{IV}$生成一个比特序列$k_1^{IV}, k_2^{IV}, \dots, k_n^{IV}$,然后将这个比特序列与帧载荷和CRC的每一个字节异或,即可得出密文。 由于异或的逆运算就是自己,因此AP使用相同的算法得出这个比特序列,然后对密文进行异或即可得出明文。
WEP帧的结构也非常简单,首先是802.11首部,然后是IV,最后是加密的数据和CRC。 值得注意的是IV是由明文发送的。
正确使用RC4算法要求使用不同的密钥,因此每个帧使用不同的IV来避免重复。 然而,IV仅有24位,如果对称密钥$K_S$不变化,那么只有约两千万个取值,这意味着重复会非常快地发生。 如果密钥随机选择,那么根据生日悖论,出现相同密钥的概率又会大大提升。 计算表明,随机选择的密钥在处理12000帧后出现相同IV的概率就能达到99%。 如果攻击者故意发送非常小的帧,那么帧的数量达到这个数量级仅需几秒钟。
密钥不变的RC4算法不能抵抗选择明文攻击。 RC4的加密和解密依赖于等式$\text{明文}_i = \text{密文}_i \oplus k_i^{IV}$。 如果攻击者进行选择明文攻击,那么在等式两边同时异或密文就可以得出密钥。 如果密钥不变,那么之后所有使用相同密钥的RC4密文都能被解密。 更糟糕的是,WEP帧中的IV是明文发送的,因此攻击者很容易确定密钥是否重复。
除此之外,WEP还有许多问题,比如在某些弱密钥下容易攻破,且CRC并不是密码散列函数,因此不能抵抗碰撞攻击等。 所以,大部分AP选择使用更新的安全协议。
IEEE 802.11i
IEEE 802.11i提供了更加先进的加密模式、可拓展的鉴别机制和密钥分发机制。 这个标准通称WiFi访问保护(WiFi Protected Access,WPA),其中WPA1是为WEP向802.11i过渡提供的,而WPA2实现了所有802.11i标准的要求。
WPA2提供两种不同的鉴别方式:预共享密钥(Pre-Shared Key,PSK)和可拓展鉴别协议(Extensible Authentication Protocol)。 前者使用预先分发的口令和和一个密钥导出函数生成密钥,通常用于家庭无线网络的加密,因此也称为WPA2-个人。 后者则使用独立的鉴别服务器(Authentication Server)。 我们主要介绍后者的原理。
EAP鉴别需要三个节点:客户站点(STA)、无线接入点(AP)和鉴别服务器(AS),其中AP和AS通常以有线网连接。 这种鉴别具有四个阶段。
首先,是发现阶段,发生在STA和AP之间。 AP通过广播通告它的存在和允许使用的加密算法,希望连接的客户则请求它期望的特定鉴别和加密形式。 此时客户既没有被鉴别,也没有生成任何加密使用的密钥。
然后,是相互鉴别和主密钥(MK)生成。 这一阶段发生在STA和AS之间,AP仅提供中继的作用,因此可以视作是STA到AS的端到端连接。 EAP在RFC 3748中定义了所需的报文格式。 EAP报文在STA到AP之间使用局域网上EAP(EAP over LAN,EAPoL)进行封装,然后使用802.11无线信道发送至AP。 AP收到EAPoL封装之后,将其拆封,取出EAP报文,然后使用远端用户拨入验证服务(Remote Authentication Dial In User Service,RADIUS)协议重新封装并使用UDP和IP发送给RADIUS服务器。 RADIUS协议由RFC 2865标准化,但其本身并不是WPA2的一部分,但是其是事实上(de facto)的标准,几乎没有人使用其他协议进行EAP鉴别。
正如其名所述,EAP不对鉴别协议本身做任何要求,而只是承载鉴别载荷,因此具有可拓展性。 常用的鉴别方案包括EAP-TLS,这种方案使用类似TLS的公钥技术进行双向鉴别,并生成主密钥。
第三阶段是成对主密钥(Pairwise Master Key,PMK)生成。 主密钥在第二阶段导出,只有STA和AS知道,所以不能用来进行STA到AP的加密。 成对主密钥则是由AS和STA从主密钥同时导出的,AS向AP发送这个PMK,从而实现STA到AP的加密。 使用PMK,STA和AP也可以相互鉴别并进行通信加密。 这一阶段用于向AP分发密钥,而在WEP中并不存在密钥分发。
最后是临时密钥(Temporal Key,TK)生成。 STA和AP之间的通信的加密并不直接使用PMK,而是使用由其导出的临时密钥。
目前尚未发现可以广泛使用的针对WPA2的攻击,除了针对PSK使用字典的穷举攻击。
运行安全性:防火墙与入侵检测系统
我们用防火墙、入侵检测系统(IDS)和入侵防止系统(IPS)一起,满足机构网络的运行安全性。
防火墙
防火墙(Firewall)是一个硬件和软件的集合体,用来将机构的内部网络与整个因特网隔离开。 防火墙通过管理流入和流出的流量实现控制外部网络和内部资源之间的访问。
防火墙具有三个目标:
- 所有跨越内外网络的流量都需要通过防火墙。显然,如果流量不通过防火墙,那么它就没有作用。这可以通过多级或分布式的防火墙实现,但是最简单的方法就是只使用一个网关,然后在这个网关上安装防火墙。
- 仅允许被授权的流量通过。如果所有流量都通过防火墙,那么该防火墙就能限制各种流量,仅允许授权的流量通过。
- 防火墙自身免于渗透。防火墙如果不能保护自己免受攻击,那就没有作用。
防火墙可以分为三类:传统分组过滤器(Traditional packet filter)、状态过滤器(Stateful filter)和应用程序网关(Application gateway)。
传统分组过滤器可以非常容易地由iptables
之类的指令实现。
正如此前介绍的,这可由SDN远程控制并部署在路由器中。
分组过滤器
分组过滤器部署在路由器上,独立地(和状态过滤器不同)检查每个分组的首部,然后根据策略决定丢弃哪些分组。 典型的策略包含:IP源或目的地址、IP首部的协议类型字段、TCP或UDP的源或目的端口、TCP标记比特、ICMP报文类型、路由器的物理接口号等等。
根据分组的特点,可以做到实现比较复杂的过滤策略。
比如,为了防止外来的、向非指定HTTP服务器的TCP连接,可以阻止所有含有SYN比特的TCP分组,只放行指定IP、80(或443)端口的SYN分组。
如果某个机构不希望被外部绘制网络拓扑(使用traceroute
),那么可以阻止ICMP TTL过期报文离开该网络。
使用ACK比特可以阻止单向的TCP连接,而允许另一向的TCP连接。 这一技巧基于一个事实,即通常TCP连接中只有第一个报文段不设置ACK比特。 通过阻止不含ACK比特的TCP报文段进入内部网络,即可阻止从外部向内部的TCP连接,但不阻止内部向外部的TCP连接。
分组过滤器把这些规则维护在访问控制列表中,就像转发表或流表一样,然后在分组进入时查阅这张表格。
状态过滤器
正如其名,状态过滤器通过维护TCP连接中的状态来实现分组过滤。 单个传统的分组过滤器仅使用单个分组内的信息进行过滤,而由于缺乏关于TCP状态的信息,这往往是不足够的。 特别是,恶意的攻击者可以通过伪造TCP连接来欺骗防火墙。
状态过滤器追踪三次握手(SYN,SYNACK,FIN)和其他特殊的TCP报文段(如FIN、RST)来重建一个连接的状态。 如果一个连接在一段时间内没有发送分组,那么防火墙可以保守地认为该连接已经关闭。
过滤器内部维护一张表格,其中包括连接的源和目的地址和端口和对应的连接状态,称为连接表。 在访问控制列表中,状态过滤器的访问控制列表往往会加上“核对连接”一项。 如果防火墙发现一个TCP报文段满足的访问控制列表项中核对连接一项为真,那么就核对连接表。 通过这种方式,防火墙只放行和连接表中的状态对应的TCP报文段。 如果连接还没有建立,那么不会放行ACK报文段,如果连接已经建立,则不会放行SYN报文段,从而防止伪造的TCP连接。
应用程序网关
以上所有过滤器最高也只能达到连接层,而有时这也不足够,因此我们需要应用程序网关。 比如,我们可能需要只让指定用户访问外网的特定程序,另一些用户只能访问另一些程序。 这种网络控制基于用户而非网络地址,因此只能在应用层实现。
应用程序网关往往不会单独出现,因为需要一些手段将流量重定向到网关所在的服务器去。 这可以通过上文所述的分组过滤器实现,即进行IP劫持,也可以通过DNS或HTTP重定向等应用层服务实现(后者是各种公共场所WiFi认证的常用架构,称为Captive Portal)。
网关收到重定向的分组之后通常会要求用户输入自己的用户名和口令。 如果正确,则网关允许用户主机到外部的流量。 这可以通过网关转发所有用户流量(这会带来比较严重的性能压力)、更新分组过滤器以停止拦截流量、联合DHCP为用户主机分配新的IP地址等手段做到。
如果还记得此前对应用层服务的介绍,不难发现,HTTP缓存代理和SMTP服务器实际上都是应用程序网关。
入侵检测系统
分组过滤器对分组的应用层数据毫不关心,从而能力不足,因此我们不得不检查应用程序的报文。 这种不仅检查首部,还要检查载荷的行为称为深度分组检查(Deep Packet Inspection,DPI),应用程序网关就进行这样的检查。
这种工作也能由硬件执行,当这种硬件通过DPI检测到恶意或是可疑的分组,就可以阻止其通过,或是允许其通过但是进行记录或发布警告。 在发现可疑分组时进行警告的设备称为入侵检测系统(Intrusion Detection System),而滤除可疑分组的设备称为入侵防止系统(Intrusion Prevention System)。 我们将统一研究这两个系统。
IDS可以检测多种攻击,包括网络制图(Network mapping,使用nmap等工具绘制网络的拓扑图)、端口扫描、TCP栈指纹检测(TCP stack fingerprinting,检测典型的TCP实现特征,以确定系统类别和版本)、拒绝服务带宽洪泛攻击、蠕虫与病毒、针对操作系统和应用程序漏洞的攻击。 这种探测是通过IDS传感器实现的。 如果存在多个IDS传感器,那么它们会向某一个中心IDS处理器进行通信,而中心处理器负责对这些信息进行综合。
通常一个提供互联网访问的机构会将内部网络分为两个大区,由路由器分别进行路由。 一个区域(或子网)具有应用程序网关等高级防护,内部人员的个人计算机和内部服务器等设备就位于此网络; 而另一个区域只具有分组过滤器,负责防止和互联网通信的服务区,如Web、FTP、DNS服务器,称为非军事区(De-Militarized Zone,DMZ)。 这两个大区通常都被IDS保护。
IDS需要使用多个传感器,且通常放置于分组过滤器或路由器后,这是因为IDS需要进行深度分组检查,并可能需要将得到的信息与特征(Signature)比对。 对于一个数据吞吐量很大的机构网络,这将导致极大的处理量,通过先进行分组过滤或路由,可以降低每个传感器的处理载荷。
IDS可分为基于特征的系统和基于异常的系统。
基于特征的系统维护大量的已知攻击的特征,每个特征是属于一种攻击的一个规则集。 其中的规则可能是单个分组的端口号、协议类型或特定比特串,也可以和一串分组相关。 这种系统对未被记录的攻击完全不具有抵抗力,且可能产生假阳性,即对正常的分组发出警告。
基于异常的系统则对流量进行统计,然后寻找统计学意义上的异常,如过多的ICMP分组通常代表可能遭受了网络制图。 这种系统不需要对攻击的任何已知信息,但区分正常和异常的流量是一个具有挑战性的问题。
目前主流的IDS是基于特征的,但是也通常具有基于异常的特点。