网络安全是个十分重要的话题,我们这次开始考察如何使网络安全,使其避免那些攻击的威胁。
第一部分,我们将讨论能够加密的密码技术,鉴别正在与之通信的对方并确保报文报文完整性。
第二部分,我们将研究基本的密码学原则怎样用于生成安全的网络协议。
第三部分,我们考虑运行的安全性,保护机构网络免受攻击。
作为计算机网络安全的典型例子:Alice和Bob通信,Trudy是窃听者。
我们首先给出安全通信的特性:
入侵者能够潜在的执行下列行为:
窃听一一监听并记录信道上传输的控制报文和数据报文。
修改、插入或删除报文或报文内容。
建立了上述框架,明确了一些重要定义以及网络安全需求之后,我们将深入学习密码学。应用密码学来提供机密性是不言而喻的,同时我们很快将看到它对于提供端点鉴别、 报文完整性也起到了核心作用,这使得密码学成为网络安全的基石。
注意:密钥(mi yue)
密码技术使得发送方可以伪装数据,使入侵者不能从截取到的数据中获得任何信息。 当然,接收方必须能够从伪装的数据中恢复出初始数据。
现在假设Alice要向Bob发送一个报文。Alice报文的最初形式(例如, “ Bob, I love you. Alice )被称为明文(plaintext, cleartext)。Alice使用加密算法(encryption algorithm )加密其明文报文,生成的加密报文被称为密文(ciphertext),该密文对任何入侵者看起来是不可懂的。有趣的是在许多现代密码系统中,包括因特网上所使用的那些,加密技术本身是已知的,即公开发行的、标准化的和任何人都可使用的,即使对潜在的入侵者也是如此!显然,如果任何人都知道数据编码的方法,则一定有一些秘密信息可以阻止入侵者解密被传输的数据。这些秘密信息就是密钥。
Alice提供了一个密钥(key)KA,它是一串数字或字符,作为加密算法的输入。加密算法以密钥和明文报文处为输入,生成的密文作为输出。用符号KA(m)表示 (使用密钥KA加密的)明文报文m加的密文形式。使用密钥KA的实际加密算法显然与上下文有关。类似地,Bob将为解密算法(decryplion algorithm)提供密钥KB—将密文和Bob的密钥作为输入,输出初始明文。也就是说,如果Bob接收到一个加密的报文KA(m),他可通过计算KB(KA(m)) = m进行解密。在对称密钥系统(symmetrickeysystem)中,Alice和Bob的密钥是相同的并且是秘密的。在公开密钥系统(public key system,也称为公钥系统)中, 使用一对密钥:一个密钥为Bob和Alice俩人所知(实际上为全世界所知),另一个密钥只有Bob或Alice知道(而不是双方都知道)。
所有密码算法都涉及用一种东西替换另一种东西的思想,例如,取明文的一部分进行计算,替换适当的密文以生成加密的报文。在分析现代基于密钥的密码系统之前,我们首先学习一下凯撒密码(Caesar cipher) 找找感觉,这是一种加密数据的方法。这种非常古老而简单的对称密钥算法由Julius Caesar发明。
凯撒密码用于英语文本时,将明文报文中的每个字母用字母表中该字母后第k个字母进行替换(允许回绕,即把字母a排在字母z之后)。例如,如果k=3,则明文中的字母变成密文中的字母“d”;明文中的字母“b” 变成密文中的字母“e”,依此类推。因此,k的值就作为密钥。举一个例子,明文报文“bob, i love you. alice” 在密文中变成ere, l oryh brx, dolfh 尽管密文看起来像乱码,但如果你知道使用了凯撒密码加密,因为密钥值只有25个,所以用不了多久就可以破解它。
凯撒密码的一种改进方法是单码代替密码(monoalphabetic cipher),也是使用字母表中 的一个字母替换该字母表中的另一个字母。
并非按照规则的模式进行替换(例如,明 文中的所有字母都用偏移量n 为k的字母进行替换),只要每个字母都有一个唯一的替换字母,任一字母都可用另一字母替换,反之亦然。
单码代替密码的性能看来要比凯撒密码的性能好得多,可 能的字母配对为26! (1026数量级)种,而不是25种。
(1)唯密文攻击。有些情况下,入侵者只能得到截取的密文,也不了解明文报文的内容。我们已经看到,统计分析有助于对加密方案的唯密文攻击(ciphertext-only attack)。
(2)已知明文攻击。前面已经看到,如果Trudy以某种方式确信在密文报文中会出现"bob”和"alicen ,她就可以确定字母a、1、i、c、e、b和。的(明文,密文) 匹配关系。Trudy也可能会幸运地记录到传输的所有密文,然后在一张纸上找到 Bob写下的已解密的明文。当入侵者知道(明文,密文)的一些匹配时,我们将其称为对加密方案的已知明文攻击(known・plaintext attack)。
(3)选择明文攻击。在选择明文攻击(chosen-plaintext attack)中,入侵者能够选择某一明文报文并得到该明文报文对应的密文形式。对于我们前面所说的简单加密算法来说,如果 Trudy 能让 Alice发送报文"The quick brown fox jumps over the lazy dog”,则Trudy就能够完全破解Alice和Bob所使用的加密方案。但是随后我们将看到,对于更为复杂的加密技术来说,使用选择明文攻击不一定意味着能够攻破该加密机制。
多码代替密码,这种技术是对单码代替码的改进。
比如,第一个字母用C1编码,第二个用C2,这样子下去。
现代社会中,考察对称密钥加密今天的工作方式。对称加密技术有两种宽泛的类型:流密码(stream cipher)和块密码(block cipher)。当我们研究无线LAN的安全性时,将简要地研究流密码。现在,我们关注块密码,该密码用在多种因特网协议的加密中,包括PGP (用于安全电子邮件)、SSL (用于使TCP连接更安全)和IPsec (用于使网络层传输更安全)。
在块密码中,要加密的报文被处理为k比特的块。例如,如果k=64,则报文被划分为64比特的块,每块被独立加密。为了加密一个块,该密码采用了一对一映射,将k比特块的明文映射为k比特块的密文。我们来看一个例子。假设k=3,因此块密码将3比特输入(明文)映射为3比特输出(密文)。如下表,给出了一种可能的映射。注意到这是一 个一对一的映射,即对每种输入有不同的输出。这种块密码将报文划分成3比特的块并根据映射关系进行加密。可以验证,报文010110001111被加密成了 101000111001。
继续这个3 比特块的例子,注意到上述映射只是许多可能映射中的一种。有多少种可能的映射呢?要回答这个问题,观察到一个映射只不过是所有可能输入的排列。共有23=8)种可能的输入(排列在“输入”栏中)。这8种输入能够排列为8! =40320种不同方式。因为这些排列的每种都定义了一种映射,共有40320种可能的映射。我们能够将这些映射的每种视为一个密钥,即如果Alice和Bob都知道该映射(密钥),他们能够加密和解密在他们之间发送的报文。
对这种密码的蛮力攻击即通过使用所有映射来尝试解密密文。仅使用40 320种映射(当k=3),这能够在一台桌面PC上迅速完成。为了挫败蛮力攻击,块密码通常使用大得多的块,由64比特甚至更多比特组成。注意到对于通常的k比特块密码,可能映射数量是2k!,对于即使不大的k=64值,也是一个天文数字。
尽管全表块密码对于不大的k值能够产生健壮的对称密钥加密方案,但不幸的是它们难以实现。对于k=64和给定的映射,将要求Alice和Bob维护一张具有264个输入值的表,这是一个难以实现的任务。此外,如果Alice和Bob要改变密钥,他们将不得不每人重新生成该表。因此,全表块密码在所有输入和输出之间提供了预先决定的映射 (如在上述例子中那样),这简直是不可能实现的事。
取而代之的是,块密码通常使用函数模拟随机排列表。在图中显示了当k=64时 这种函数的一个例子。该函数首先将64比特块划分为8个块, 每个块由8 比特组成。每个8 比特块由一个“8比特到8比特”表处理,这是个可管理的长度。例如,第一个块由标志为T1的表来处理。接下来,这 8 个输出块被重新装配成一 个64比特的块。该输出被回馈到64比特的输入,开始了第二次循环。经几次这样的循环 后,该函数提供了一个64比特的密文块。这种循环的目的是使得每个输入比特影响最后输出比特的大部分(即使不是全部)。(如果仅使用一次循环,一个给定的输入比特将仅影响64输岀比特中的8比特。)这种块密码算法的密钥将是8张排列表(假定置乱函数是公共已知的)。
目前有一些流行的块密码,包括DES ( Data Encryption Standard,数据加密标准)、 3DES和 AES ( Advanced Encryption Standard,高级加密标准)。这些标准都使用了函数 (而不是预先决定的表),连同上图的线(虽然对每种密码来说更为复杂和具体)。这些算法也都使用了比特串作为密钥。例如,DES使用了具有56比特密钥的64比特块。AES使用128比特块,能够使用128、192和256比特长的密钥进行操作。一个算法的密钥决 定了特定“小型表”映射和该算法内部的排列。对这些密码进行蛮力攻击要循环通过所有密钥,用每个密钥应用解密算法。观察采用长度为n的密钥,有2n种可能的密钥。NIST估计,如果用1秒破解56比特DES的就计算机来破接一个128比特的AES密钥,大约需要149万亿年的时间才有可能成功。
在计算机网络应用中,通常需要加密长报文。其中可能有明文块相同,这些相同的块,块密码当然将产生相同的密文。
为了解决这个问题,在密文中混合某些随机性,使得相同的明文块产生不同的密文块。
块密码通常使用了一种称为密码块链接(Cipher Block Chaining,CBC)的技术。其基本思想是仅随第一个报文发送一个随机值,然后让发送方和接收方使用计算的编码块代替后继的随机数。具体而言,CBC运行过程如下:
因为通信刚开始双方都没有对称密钥,第一次传送对称密钥可能被截获,为了解决这个问题,开创了公开密钥密码系统。
因此公开密钥密码体制的使用在概念上是简单的。但是有两点必须要注意。
首先应关注的是,尽管入侵者截取到Alice的加密报文时看到的只是乱码,但是入侵者知道公钥 (显然Bob的公钥是全世界都可以使用的)和Alice加密所用的算法。Trudy可以据此发起选择明文攻击,使用已知的标准加密算法和Bob的公开可用的加密密钥对她所选择的任意报文编码!例如,Trudy可以尝试对她怀疑Alice可能发送的全部报文或部分报文编码。很明显,要使公开密钥密码能工作,密钥选择和加密/解密算法必须保证任意入侵者都不能 (至少要困难得几乎不可能)确定出Bob的私钥或者以某种方式解密或猜出Alice发给Bob的报文。
第二个值得关注的问题是,既然Bob的加密密钥是公开的,任何人(包括Alice 和其他声称自己是Alice的人)都可能向Bob发送一个已加密的报文。在单一共享密钥情况下,发送方知道共享秘密密钥的事实就已经向接收方隐含地证实了发送方的身份。然而 在公钥体制中,这点就行不通了,因为任何一个人都可向Bob发送使用Bob的公开可用密 钥加密的报文。这就需要用数字签名把发送方和报文绑定起来。
(a % n)d % n = ad % n
这里我们注意到,RSA所要求的指数运算是相当耗费时间的过程。形成对比的是, DES用软件实现要比RSA快 100倍,用硬件实现则要快1000 ~ 10 000倍。所以,在实际应用中,RSA通常与对称密钥密码结合起来使用。例如,如果Alice要向Bob发送大量的加密数据,她可以用下述方式来做。首先,Alice选择一个用于加密数据本身的密钥,这个密钥有时称为会话密钥(session key),该会话密钥表示为Ks。
Alice必须把这个会话密钥告知Bob,因为这是他们在对称密钥密码(如DES或AES)中所使用的共享对称密钥。Alice可以使用Bob的RSA公钥来加密该会话密钥。
我们再次使用Alice和Bob来定义报文完整性问题。假定Bob接收到一个报文(这可能已经加密或可能是明文),并且他认为这个报文是由Alice发送的。为了鉴别这个报文,Bob需要证实:
(1)该报文的确源自Alice。
(2)该报文在到Bob的途中没有被篡改。
报文完整性在所有网络安全协议中都是至关重要的。
举一个特定的例子,考虑一个使用链路状态路由选择算法(例如OSPF)的计算机网络,在该网络中决定每对路由器之间的路由。在一个链路状态算法中,每台路由器需要向该网络中的所有其他路由器广播一个链路状态报文。路由器的链路状态报文包括直接相连邻居的列表以及到这些邻居的直接费用。一旦某台路由器从其他所有路由器收到了链路状态报文,它能够生成该网络的全图,运行它的最小费用路由选择算法并配置它的转发表。对路由选择算法的一个相对容易的攻击是,Trudy分发具有不正确状态信息的虚假链路状态报文。因此产生了报文完整性的需求:当路由器B收到来自路由器A的链路状态报文时,路由器B应当证实路由器A实际生成了该报文,并且进一步证实在传输过程中该报文没有被篡改。
附加性质:
主流散列算法:
MD5和SHA-1。
我们现在再回到报文完整性的问题。既然我们理解了散列函数,就先来看一下将如何执行报文完整性:
为了执行报文完整性,除了使用密码散列函数外,Alice和 Bob将需要共享秘密儿这个共享的秘密只不过是一个比特串,它被称为鉴别密钥(authentication key)。使用这个共享秘密,报文完整性能够执行如下:
怎样向通信实体分发这个共享的鉴别密钥呢?例如,在链路状态路由选择算法中,在某种程度上需要向自治系统中的每台路由器分发该秘密鉴别密钥。(注意到所有路由器都能够使用相同的鉴别密钥。)一名网络管理员能够通过物理上访问每台路由器来实际完成这项工作。或者,如果这名网络管理员不够勤快,并且每台路 由器都有它自己的公钥,那么该网络管理员能够用路由器的公钥加密鉴别密钥并分发给任何一台路由器,从而通过网络向路由器发送加密的密钥。
我们简要地将数字签名与报文鉴别码(MAC)进行比较,尽管它们有类似之处,但也有重要的微妙差异。数字签名和MAC都以一个报文(或一个文档)开始。为了从该报文中生成一个MAC,我们为该报文附加一个鉴别密钥,然后取得该结果的散列。注意到在生成MAC过程中既不涉及公开密钥加密,也不涉及对称密钥加密。为了生成一个数字签名,我们首先取得该报文的散列,然后用我们的私钥加密该报文(使用公钥密码)。因此,数字签名是一种“技术含量更高”的技术。
数字签名的一个重要应用是公钥认证(public key certification),即证实一个公钥属于某个特定的实体。公钥认证用在许多流行的安全网络协议中,包括IPsec和SSL。
没有公钥认证:
将公钥与特定实体绑定通常是由认证中心(Certification Authority,CA) 完成的,CA 的职责就是使识别和发行证书合法化。CA具有下列作用:
(1)证实一个实体的真实身份。如何进行认证并没有强制的过程。当与一个CA打交道时,一方必须信任这个CA能够执行适当的严格身份验证。例如,如果Trudy走进名为Fly-by-Night的认证中心并只是宣称“我是Alice”,就可以 得到该机构颁发的与Alice的身份相关联的证书的话,则人们不会对Fly-by-Night认证中心所签发的公钥证书有太多的信任。另一方面,人们可能愿意(或不愿意!)信任某个CA,如果这个CA是联邦或州计划的一部分的话。你对与公钥相关联的身份的信任程度,仅能达到你对CA及其身份验证技术的信任程度。
(2) 一旦CA验证了某个实体的身份,这个CA会生成一个将其身份和实体的公钥绑定起来的证书(certificate) 。这个证书包含这个公钥和公钥所有者全局唯一的身份标识信息(例如,一个人的名字或一个IP地址)。由CA对这个证书进行数字签名。
两张图片了解详情:
端点鉴别就是一个实体经过计算机网络向另一个实体证明其身份的过程。
不行,Trudy一定会在发出的报文中修改自己的ip成为Alice的
也不行,这种方法无法推广,难道跟10个人聊天就要10个口令?
如果只用一个口令,当你telnet远程到一个计算机时,口令也会明文发送出去,容易被窃取
一样的,Bob并不在意口令是一段话还是一段随机数,上面失败的根本原因在于,Bob无法判断Alice是否还在线,如果Alice还在线,Trudy是无法伪装Alice的ip地址的。
使用不重数(nonce),所谓不重,就是他只在一个协议的生存期中使用一次
Bob会在一开始选择一个不重数R,发送给Alice
然后Alice用他两都有的对称密钥K加密这个不重数,然后Bob解密如果解密出来的是R,证明对面是Alice,因为密钥只有他两有,Trudy是没有的!
应用层的安全性:安全电子邮件。
PGP公钥由一个可信Web验证。当Alice相信一个密钥/用户名对确实匹配时,她自己就可以验证这一密钥/用户名对。此外,PGP允许Alice为她所信任的用户鉴别更多密钥提供担保。 一些PGP用户通过保持密钥签署方(key-signing party)互相签署对方的密钥。用户实际走到一起,交换公钥,并用自己的私钥对对方的公钥签名来互相验证密钥。
考察密码技术如何用安全性服务加强TCP,该安全性服务包括机密性、数据完整性、端点鉴别。
TCP的这种强化版本通常称为安全套接字层(Secure Socket Layer,SSL),SSL版本3的一个稍加修改的版本被称为运输层安全性(Transport Layer Security,TLS)。
当你使用浏览器时,若URL以https:
开始而不是以http
开始,就能认定正在使用 SSL。
SSL经常用来为发生在HTTP之上的事务提供安全性。然而,因为SSL使TCP安全了,因此它能被应用于运行在TCP之上的任何应用程序。SSL提供了一个简单的具有套接字的应用编程接口(API),该接口类似于TCP的API。当一个应用程序要使用SSL时,它包括了SSL类/库。尽管SSL技术上位于应用层中,但从研发者的角度看,它是一个提供TCP服务的运输协议,而这里的TCP服务用安全性服务加强了。
我们从描述一个简化的SSL版本开始,这将使我们从宏观上理解SSL的工作原理和工作过程。我们将这个SSL的简化版本称之为“类SSL”。描述过类SSL之后,我们将描述真实的SSL,填充细节。类SSL (和SSL)具有三个阶段:握手、密钥导出和数据传输。我们现在描述针对一个客户(Bob) 和一个服务器(Alice) 之间的通信会话的这三个阶段,其中Alice具有私钥/公钥对和将她的身份与其公钥绑定的证书。
(1)握手。
在握手阶段,Bob需要:①与Alice创建一条TCP连接;②验证Alice是真实的Alice;③发送给Alice一个主密钥,Bob和Alice持用该主密钥生成SSL会话所需的所有对称密钥。
注意到一旦创建了 TCP连接,Bob就向Alice发送一个 hello报文。Alice则用她的证书进行响应,证书中包含了她的公钥。因为该证书已被某CA证实过,Bob明白无误地知道该公钥属于Alice。然后,Bob产生一个主密钥(MS)(该MS将仅用于这个SSL会话),用Alice的公钥加密该MS以生成加密的主密钥(EMS),并将该EMS发送给Aliceo Alice用她的私钥解密该EMS从而得到该MS。在这个阶段后,Bob和Alice(而无别的人)均知道了用于这次SSL会话的主密钥。
(2)密钥导出。
从原则上讲,MS此时已由Bob和Alice共享,它能够用作所有后继加密和数据完整性检查的对称会话密钥。然而,对于Alice和Bob每人而言,使用不同的密码密钥,并且对于加密和完整性检查也使用不同的密钥,通常认为更为安全。因此,Alice和Bob都使用MS生成4个密钥:
Alice和Bob每人都从MS生成4个密钥。 这能够通过直接将该MS分为4个密钥来实现。(但在真实的SSL中更为复杂一些,我们后面将会看到。)
在密钥导岀阶段结束时,Alice和Bob都有了4个密钥。其中的两个加密密钥将用于加密数据;两个MAC密钥将用 于验证数据的完整性。
(3)数据传输
既然Alice和Bob共享相同的4个会话密钥,他们就能够经TCP连接开始发送安全的数据。
因为TCP是一种字节流协议,一种自然的方法是用SSL在传输中加密应用数据,然后将加密的数据在传输中传给TCP。但是如果我们真的这样做,我们将用于完整性检查的MAC置于何处呢?我们无疑不希望等到TCP会话结束时才验证所有Bob数据的完整性,Bob数据的发送要经历整个会话!为了解决这个问题,SSL将数据流分割成记录,对每个记录附加一个MAC用于完整性检查,然后加密该“记录+MAC”。为了产生这个MAC, Bob将数据连同密钥Eb放入一个散列函数中。为了加密“记录+ MAC” 这个包,Bob使用他的会话加密密钥Eb。然后这个加密的包将传递给TCP经因特网传输。
虽然这种方法几经周折,但它为整个报文流提供数据完整性时仍未达到无懈可击。特 别是,假定Trudy是一名“中间人”,并且有在Alice和Bob之间发送的TCP报文段流中插入、删除和代替报文段的能力。例如,Trudy能够俘获由Bob发送的两个报文段,颠倒这两个报文段的次序,调整TCP报文段的序号(这些未被加密),然后将这两个次序翻转的报文段发送给Alice。假定每个TCP报文段正好封装了一个记录,我们现在看看Alice将如何处理这些报文段。
①在 Alice端运行的TCP将认为一切正常,将这两个记录传递给SSL子层。
②在Alice端的SSL将解密这两个记录。
③在Alice端的SSL将使用在每个记录中的MAC来验证这两个记录的数据完整性。
④然后SSL将解密的两条记录的字节流传递给应用层。
但是Alice收到的完整字节流由于记录的颠倒而次序不正确!
对该问题的解决方案如你可能猜想的那样,那就是使用序号。SSL采用如下的方式。 Bob维护一个序号计数器,计数器开始为0,Bob每发送的一个SSL记录它都增加1。Bob 并不实际在记录中包括一个序号,但当他计算MAC时,他把该序号包括在MAC的计算中。所以,该MAC现在是数据加MAC密钥Mb加当前序号的散列。Alice跟踪Bob的序 号,通过在MAC的计算中包括适当的序号,使她验证一条记录的数据完整性。SSL序号的使用阻止了Trudy执行诸如重排序或重放报文段等中间人攻击。
(4)SSL记录
SSL记录(以及类SSL记录)。该记录由类型字段、版本字段、 长度字段、数据字段和MAC字段组成。注意到前三个字段是不加密的。类型字段指出了该字段是握手报文还是包含应用数据的报文。它也用于关闭SSL连接,如下面所讨论。在接收端的SSL使用长度字段以从到达的TCP字节流中提取SSL记录。版本字段是自解释的。
既然我们已经对SSL有了基本了解,就能够更深入地研究实际SSL协议的要点了。
(1)SSL握手。
SSL并不强制Alice和Bob使用一种特定的对称密钥算法、一种特定的公钥算法或一 种特定的MAC。相反,SSL允许Alice和Bob在握手阶段在SSL会话开始时就密码算法取得一致。此外,在握手阶段,Alice和Bob彼此发送不重数,该数被用于会话密钥的生成中。真正的SSL握手的步骤如下:
①客户发送它支持的密码算法的列表,连同一个客户的不重数。
②从该列表中,服务器选择一种对称算法(例如AES)、一种公钥算法(例如具有 特定密钥长度的RSA) 和一种MAC算法。它把它的选择以及证书和一个服务器不重数返回给客户。
③客户验证该证书,提取服务器的公钥,生成一个前主密钥(Pe Master Secret,PMS),用服务器的公钥加密该PMS,并将加密的PMS发送给服务器。
④使用相同的密钥导岀函数(就像SSL标准定义的那样),客户和服务器独立地从PMS和不重数中计算出主密钥(Master Secret, MS)。然后该MS被切片以生成两个密码和两个MAC密钥。此外,当选择的对称密码应用于CBC (例如3DES或AES),则两个初始 化向量(Initialization Vector, IV)也从该MS获得,这两个IV分别用于该连接的两端。自此以后,客户和服务器之间发送的所有报文均被加密和鉴别(使用MAC)。
⑤ 客户发送所有握手报文的一个MAC。
⑥服务器发送所有握手报文的一个MAC。
最后两个步骤使握手免受篡改危害。
不重数的原因:
假设Trudy嗅探了 Alice和Bob之间的所有报文。第二天,Trudy冒充Bob并向Alice发送 正好是前一天Bob向Alice发送的相同的报文序列。如果Alice没有使用不重数,她将以前 一天发送的完全相同的序列报文进行响应。Alice将不怀疑任何不规矩的事,因为她接收到的每个报文将通过完整性检查。如果Alice是一个电子商务服务器,她将认为Bob正在 进行第二次订购(正好订购相同的东西)。在另一方 在协议中包括了一个不重数, Alice将对每个TCP会话发送不同的不重数,使得这两天的加密密钥不同。因此,当Alice 接收到来自Trudy重放的SSL记录时,该记录将无法通过完整性检查,并且假冒的电子商务事务将不会成功。总而言之,在SSL中,不重数用于防御“连接重放”,而序号用于防 御在一个进行中的会话中重放个别分组。
(2)连接关闭。
在某个时刻,Bob或者Alice将要终止SSL会话。一个方法是让Bob通过直接终止底层的TCP连接来结束该SSL会话,这就是说,通过让Bob向Alice发送一个TCP FIN报文段。但是这种幼稚设计为截断攻击(truncation attack)创造了条件,Trudy再一次介入一个进行中的SSL会话中,并用TCP FIN过早地结束了该会话。如果Trudy这样做的话,Alice将会认为她收到了 Bob的所有数据,而实际上她仅收到了其中的一部分。对这个问题的解决方法是,在类型字段中指出该记录是否是用于终止该SSL会话的。(尽管SSL类型是以明文形式发送的,但在接收方使用了记录的MAC对它进行了鉴别。)通过包括这样一个字段,如果Alice在收到一个关闭SSL记录之前突然收到了一个TCP FIN,她可能知道正在进行着某些耍花招的事情。
IP安全(IP Security)协议更常被称为IPsec,它为网络层提供了安全性。IPsec为任意两个网络层实体(包括主机和路由器)之间的IP数据报提供了安全。如我们很快要描述的那样,许多机构(公司、政府部门、非营利组织等等)使用IPsec创建了运行在公共因特网之上的虚拟专用网(Virtual Private Network,VPN) 。
在学习IPsec细节之前,我们后退一步来考虑为网络层提供机密性所包含的意义。在网络实体对之间(例如,两台路由器之间,两台主机之间,或者路由器和主机之间)具有网络层机密性,发送实体加密它发送给接收实体的所有数据报的载荷。这种载荷可以是一 个TCP报文段、一个UDP报文段、一个ICMP报文等等。如果这样的网络层服务适当的话,从一个实体向其他实体发送的所有数据报将隐形于任何可能嗅探该网络的第三方,发送的数据报包括电子邮件、Web网页、TCP握手报文和管理报文(例如ICMP和SNMP)。 正因为如此,网络层安全性被认为提供了 “地毯覆盖”。
除了机密性,网络层安全协议潜在地能够提供其他安全性服务。例如,它能提供源鉴别,使得接收实体能够验证安全数据报的源。网络层安全协议能够提供数据完整性,使得接收实体能够核对在数据报传输过程中可能岀现的任何篡改。网络层安全服务也能提供防止重放攻击功能,这意味着Bob能够检测任何攻击者可能插入的任何冗余数据报。我们将很快看到IPsec的确提供了用于这些安全服务的机制,即机密性、源鉴别、数据完整性和重放攻击防护。
跨越在多个地理区域上的某机构常常希望有自己的1P网络,使它的主机和服务器能够以一种安全和机密的方式彼此发送数据。为了达到这个目标,该机构能够实际部署一个单独的物理网络,该网络包括路由器、链路和DNS基础设施且与公共因特网完全分离。这样一种为特定的机构专用的分立网络被称为专用网络(private network)。毫不奇怪,专用网络可能耗资巨大,因为该机构需要购买、安装和维护它自己的物理网络基础设施。
不同于部署和维护一个专用网络,如今许多机构在现有的公共因特网上创建VPN。使用VPN,机构办公室之间的流量经公共因特网而不是经物理上独立的网络发送。而为了提供机密性,办公室之间的流量在进入公共因特网之前进行加密。下图中显示了 VPN的 一个简单例子。这里的机构由一个总部、一个分支机构和旅行中的销售员组成,销售员通 常从他们的旅馆房间接入因特网。(在该图中仅显示了一名销售员。)在这个VPN中,无论何时,位于总部的两台主机相互发送IP数据报或位于分支机构的两台主机要通信,它们都使用经典的IPv4 (即无IPsec服务)。然而,当两台机构的主机经过跨越公共因特网的路径时,这些流量在进入因特网之前进行加密。
当总部中的一台主机向某旅馆中的某销售员发送一个IP数据报时,总部中的网关路由器将经典的IPv4转换成为IPsec数据报,然后将该IPsec数据报转发进因特网。该 IPsec数据报实际上具有传统的IPv4首部,因此在公共因特网中的路由器处理该数据报,仿佛它对路由器而言是一个普通的IPv4数据报。但是IPsec数据报的载荷包括了一个IPsec首部,该首部被用于IPsec处理;此外,IPsec数据报的载荷是被加密的。当该IPsec数据报到达销售员的便携机时,便携机的操作系统解密载荷(并提供其他安全服务,如验证数据完整性),并将解密的载荷传递给上层协议(例如,给TCP或UDP)。
IPsec是一个相当复杂的整体,即它被定义为10多个RFC文档。两个重要的文档是HFC 4301和RFC 6071,前者描述了总体IP安全体系结构,后者提供了一个IPsec协议集的概述。
在IPsec协议族中,有两个主要协议:鉴别首部 (Autlientication Header,AH) 协议和封装安全性载荷(Encapsulation Security Payload,ESP)协议。当某源IPsec实体(通常是 一台主机或路由器)向一个目的实体(通常也是一台主机或路由器)发送安全数据报时,它可以使用AH协议或ESP协议来做到。AH协议提供源鉴别和数据完整性服务,但不提供机密性服务。ESP协议提供了源鉴别、数据完整性和机密性服务。因为机密性通常对 VPN和其他IPsec应用是至关重要的,所以ESP协议的使用比AH协议要广泛得多。为了 讲清IPsec并且避免许多难题,我们将此后专门关注ESP协议。
IPsec数据报在网络实体对之间发送,例如两台主机之间、两台路由器之间或一台主机和一台路由器之间。在从源实体向目的实体发送IPsec数据报之前,源和目的实体创建了一个网络层的逻辑连接。这个逻辑连接称为安全关联(Security Association,SA)。一个SA是一个单工逻辑连接;也就是说,它是从源到目的地单向的。如果两个实体要互相发送安全数据报,则需创建两个SA,每个方向一个。
从路由器R1到路由器R2的SA场景下进行观察。 (你能够认为路由器R1是总部网关路由器,而路由器R2是分支机构网关路由器。)路由器R1将维护有关该SA的状态信息,这将包括:
无论何时路由器R1需要构建一个IPsec数据报经过这个SA转发,它访问该状态信息以决定它应当如何鉴别和加密该数据报。类似地,路由器R2将维护对此SA的相同的状态信息,并将使用该信息鉴别和加密任何从该SA到达的IPsec数据报。
一个IPsec实体(路由器或主机)经常维护许多SA的状态信息。
一个 IPsec实体在它的安全关联数据库(Security Association Database,SAD)中存储其所有SA的状态信息,SAD是实体操作系统内核中的一个数据结构。
在描述了SA后,我们现在能够描述实际的IPsec数据报了。IPsec有两种不同的分组形式,一种用于所谓隧道模式(tunnel mode),另一种用于所谓运输模式(transport mode)。更为适合VPN的隧道模式比运输模式部署得更为广泛。为了进一步讲清IPsec和避免许多难题,我们因此专门关注隧道模式。一旦已经牢牢地掌握了隧道模式,应当能够容易地自学运输模式。
假设路由器R1接收到一个来自主机172. 16. 1. 17 (在总部网络中)的普通IPv4数据报,该分组的目的地是主机172. 16. 2. 48 (在分支机构网络中)。 路由器R1使用下列方法将这个“普通IPv4数据报”转换成一个IPsec数据报:
注意到得到的IPsec数据报是一个货真价实的IPv4数据报,它具有传统的IPv4首部字段后跟一个载荷。但在这个场合,该载荷包含一个ESP首部、初始IP数据报、一个ESP 尾部和一个ESP鉴别字段(具有加密的初始数据报和ESP尾部)。初始的IP数据报具有源IP地址172. 16. 1. 17和目的地址172. 16. 2. 48。因为IPsec数据报包括了该初始IP数据 报,这些地址被包含和被加密作为IPsec分组负载的组成部分。但是在新IP首部中的源和目的地IP地址,即在IPsec数据报的最左侧首部又该如何处理呢?如你所猜测,它们被设置为位于隧道两个端点的源和目的地路由器接口,也就是200. 168 1. 100和193. 68 2. 23。 同时,这个新IPv4首部字段中的协议号不被设置为TCP、UDP或SMTP,而是设置为50,指示这是一个使用ESP协议的IPsec数据报。
在R1将IPsec数据报发送进公共因特网之后,它在到达R2之前将通过许多路由器。这些路由器中的每个将处理该数据报,就像它是一个普通数据报一样,即它们被完全忘记这样的事实:该数据报正在承载IPsec加密的数据。对于这些公共因特网路由器,因为在外面首部中的目的IP地址是R2,所以该数据报的最终目的地是R2。
在考察了如何构造一个IPsec 数据报的例子后,我们现在更仔细地观察enchilada的组成。我们看到ESP尾部由三个字段组成:填充、填充长度和下一个首部。前面讲过块密码要求被加密的报文必须为块长度的整数倍。使用填充(由无意义的字节组成),使得当其加上初始数据报(连同填充长度字段和下一个首部字段)形成的“报文” 是块的整数倍。填充长度字段指示接收实体插入的填充是多少(并且需要被删除)。下一 个首部字段指示包含在载荷数据字段中数据的类型(例如UDP)。载荷数据(通常是初始IP数据报)和ESP尾部级联起来并被加密。
附加到这个加密单元前面的是ESP首部,该首部以明文发送,它由两个字段组成:SPI字段和序号字段。SPI字段指示接收实体该数据报属于哪个SA;接收实体则能够用该 SPI索引其SAD以确定适当的鉴别/解密算法和密钥。序号字段用于防御重放攻击。
发送实体也附加一个鉴别MAC。如前所述,发送实体跨越整个enchilada (由ESP首部、初始IP数据报和ESP尾部组成,即具有加密的数据报和尾部)计算一个MAC。前面讲过为了计算一个MAC,发送方附加一个秘密MAC密钥到该enchilada,进而计算该结果的一个固定长度散列。
当R2接收到IPsec数据报时,R2看到该数据报的目的IP地址是R2自身。R2因此处
理该数据报。因为协议字段(位于IP首部最左侧)是50, R2明白应当对该数据报施加 IPsec ESP处理。第一,针对enchilada,R2使用SPI以确定该数据报属于哪个SA。第二,它计算该enchilada的MAC并且验证该MAC与在ESP MAC字段中的值一致。如果两者一 致,它知道该enchilada来自R1并且未被篡改。第三,它检查序号字段以验证该数据报是新的(并且不是重放的数据报)。第四,它使用与SA关联的解密算法和密钥解密该加密单元。第五,它删除填充并抽取初始的普通IP报文。最后,它朝着其最终目的地将该初 始数据报转发进分支机构网络。这个一种多么复杂的秘诀呀!还未曾有人声称准备并破解 enchilada是一件容易的事!
实际上还有另一个重要的细微差别需要处理。它以下列问题为中心:当R1从位于总部网络中的一台主机收到一个(未加密的)数据报时,并且该数据报目的地为总部以外的某个目的IP地址,R2怎样才能知道它应当将其转换为一个IPsec数据报呢?并且如果它由IPsec处理,R1如何知道它应当使用(在其SAD中的许多SA中)哪个SA来构造这个 IPsec数据报呢?该问题以如下方式解决。除了 SAD外,IPsec实体也维护另一个数据结构,它称为安全策略库(Security Policy Database,SPD)。该 SPD指示哪些类型的数据报 (作为源IP地址、目的IP地址和协议类型的函数)将被IPsec处理;并且对这些将被IPsec处理的数据报应当使用哪个SA。从某种意义上讲,在 SPD中的信息指示对于一个到达的数据报做“什么”;在SAD中的信息指示“怎样”去做。
IPsec究竟提供什么样的服务呢?我们从某攻击者Trudy的角度来考察这些服务,Trudy是一个中间人,位于R1和R2之间路径上的某处。假设通过这些讨论,Trudy不知道SA所使用的鉴别和加密密钥。Trudy能够做些什么和不能够做些什么呢?第一,Trudy不能看到初始数据报。如果事实如此,不仅Trudy看不到在初始数据报中的数据,而且也看不到协议号、源IP地址和目的IP地址。对于经该SA发送的数据报,Trudy仅知道该数据报源于172. 16. L0/24的某台主机以及目的地为172. 16. 2. 0/24的某台主机。她不知道它是否携带TCP、UDP或ICMP数据;她不知道它是否携带了 HTTP、SMTP或某些其他类型的应用程序数据。因此这种机密性比SSL范围更为宽广。第二,Trudy试图用反转数据报的某些比特来篡改在SA中的某个数据报,当该篡改的数据报到达R2时,它将难以通过完整性核查(使用MAC),再次挫败了 Trudy的恶意尝试。第三,假设Trudy试图假冒R1,生成一个源为200. 168 1. 100和目的地为193.68.2. 23的IPsec数据报。 Trudy的攻击将是无效的,因为这个数据报将再次通不过在R2的完整性核査。最后,因为 IPsec包含序号,Trudy将不能够生成一个成功的重放攻击。总而言之,正如本节开始所言,IPsec在任何通过网络层处理分组的设备对之间,提供了机密性、源鉴别、数据完整性和重放攻击防护。
当某VPN具有少量的端点时,网络管理员能够在该端点的SAD中人工键入SA信息(加密/鉴别算法和密钥及SPI)。这样的“人工密钥 法”对于一个大型VPN显然是不切实际的,因为大型VPN可能由成百甚至上千台IPsec 路由器和主机组成。大型的、地理上分散的部署要求一个自动的机制来生成SAO IPsec使用因特网密钥交换(Internet Key Exchange,IKE)协议来从事这项工作,IKE由RFC 5996定义。
IKE与SSL中的握手具有某些类似。每个IPsec实体具有一个证书,该证书包括了该实体的公开密钥。如同使用SSL —样,IKE协议让两个实体交换证书,协商鉴别和加密算法,并安全地交换用于在IPsec SA中生成会话密钥的密钥材料。与SSL不同的是,IKE应用两个阶段来执行这些任务。
第一个阶段由R1和R2之间报文对的两次交换组成:
在IKE的第二个阶段,两侧生成在每个方向的一个SA。
在阶段2结束时,对这两个 SA的每一侧都建立了加密和鉴别会话密钥。然后这两侧都能使用SA来发送安全的数据报。在IKE中有两个阶段的基本动机是计算成本,即因为第二阶段并不涉及任何公钥密码,IKE能够以相对低的计算成本在两个IPsec实体之间生成大量SA。
在802. 11中的安全性问题受到了技术界和媒体界的极大关注。在进行大量讨论的同时,一个几乎没有争论的事实是,看起来被广泛认同的初始802. 11规范具有一些严重的安全性缺陷。现在的确能够下载利用这些漏洞的公共域软件,使得那些使用该普通802. 11 安全性机制的用户面对安全性攻击,就像根本没有使用安全性措施的网络用户一样,门户洞开。
在下面一节中,我们讨论最初在802. 11规范中标准化的安全性机制,该规范统称为有线等效保密(Wired Equivalent Privacy,WEP)。顾名思义,WEP意欲提供类似于在有线网络中的安全性水平。
IEEE 802. 11的WEP协议设计于1999年,为在主机和无线接入点(即基站)之间提供鉴别和数据的加密。WEP并没有指定密钥管理算法,因此它假定主机和无线接入点之间通过带外方式就密钥达成了某种一致。鉴别以下列方式进行::
(1)无线主机通过接入点请求鉴别。
(2)接入点以一个128字节的不重数值响应该鉴别请求。
(3)无线主机用它与这个接入点共享的密钥加密这个不重数值。
(4)接入点解密主机加密的不重数值。
如果解密所得不重数值与初始发给主机的值相同,则这个接入点鉴别了该主机。
在IEEE 802. 11于1999年发布后不久,就开始研发具有更强安全性机制的802. 11的新型、改进版本。这个新标准被称为802.11i,于2004年最终得到批准。如我们将看到的那样,虽然WEP提供了相对弱的加密、仅有单一方式执行鉴别并且没有密钥分发机制,但IEEE 802. 11 i却提供了强得多的加密形式、一种可扩展的鉴别机制集合以及一种密钥分发机制。
因特网不是一个安全的地方,有坏家伙出现,给定因特网的不利性质,我们现在考虑一个机构网络和管理它的网络 管理员。从网络管理员的角度看,世界可以很明显地分为两个阵营:一部分是好人,他们属于本机构网络,可以用相对不受限制的方式访问该机构网络中的资源;另一部分是坏家伙,他们是其他一些人,访问网络资源时必须经过仔细审查。在许多机构中,从中世纪的城堡到现代公司的建筑物,都有单一的岀口/入口,无论好人坏人出入该机构,都需要进行安全检查。在一个城堡中,可以在吊桥的一端的门口执行安全检查;在公司大厦中,这些工作可在安全台完成。在计算机网络中,当通信流量进入/离开网络时要执行安全检查、做记录、丢弃或转发,这些工作都由被称为防火墙、入侵检测系统(IDS) 和入侵防止系统 (IPS) 的运行设备来完成。
防火墙(firewall)是一个硬件和软件的结合体,它将一个机构的内部网络与整个因特网隔离开,允许一些数据分组通过而阻止另一些分组通过。防火墙允许网络管理员控制外部和被管理网络内部资源之间的访问,这种控制是通过管理流入和流出这些资源的流量实现的。防火墙具有3 个目标:
从外部到内部和从内部到外部的所有流量都通过防火墙。位于被管理网络和因特网其余部分之间的边界处。虽然许多大型机构可使用多级防火墙或分布式防火墙,但在对该网络的单一接入点处设置一个防火墙这使得管 理和施加安全访问策略更为容易。
仅被授权的流量(由本地安全策略定义)允许通过。随着进入和离开机构网络的所有流量流经防火墙,该防火
墙能够限制对授权流量的访问。
防火墙自身免于渗透。防火墙自身是一种与网络连接的设备,如果设计或安装不当,将可能危及安全,在这种情况下它仅提供了一种安全的假象(这比根本没有防火墙更糟糕!)。
防火墙能够分为3类:传统分组过滤器(traditional packet filter)、状态过滤器(stateful filter)和应用程序网关(application gateway)。
一个机构通常都有一个将其内部网络与其ISP (并因此与更大的公共因特网相连)相连的网关路由器。所有离开和进入内部网络的流量都要经过这个路由器, 而这个路由器正是分组过滤(packet filtering)出现的地方。分组过滤器独立地检查每个数据报,然后基于管理员特定的规则决定该数据报应当允许通过还是应当丢弃。过滤决定通常基于下列因素:
IP源或目的地址。
在IP数据报中的协议类型字段:TCP、UDP、ICMP、OSPF等。
TCP或UDP的源和目的端口。
TCP标志比特:SYN、ACK等。
ICMP报已文类型。
数据报离开和进入网络的不同规则。
对不同路由器接口的不同规则。
一个机构可能具有的若干可能的策略,以及它们是如何用一个分组过滤器来处理分组的。
在传统的分组过滤器中,根据每个分组分离地做出过滤决定。状态过滤器实际地跟踪 TCP连接,并使用这种知识作岀过滤决定。状态过滤器通过用一张连接表来跟踪所有进行中的TCP连接来解决这个问题。
为了得到更高水平的安全性,防火墙必须把分组过滤器和应用程序网关结合起来。应用程序网关除了看IP/TCP/UDP首部外,还基于应用数据来做策略决定。一个应用程序网 关(application gateway)是一个应用程序特定的服务器,所有应用程序数据(入和出的) 都必须通过它。多个应用程序网关可以在同一主机上运行,但是每一个网关都是有自己的进程的单独服务器。
当观察到潜在恶意流量时能 产生告警的设备称为入侵检测系统(Intrusion Detection System, IDS)。
滤除可疑流量的设备称为入侵防止系统(Intrusion Prevention System, IPS)。
IDS能够用于检测多种攻击,包括网络映射(例如使用rmrnp进行分析)、端口扫描、 TCP栈扫描、DoS带宽洪泛攻击、蠕虫和病毒、操作系统脆弱性攻击和应用程序脆弱性攻击。目前,数以千计的机构应用了IDS系统。这 些已部署的系统有许多是专用的,Cisco、Check Point和其他安全装备厂商在市场上销售这 些系统。但是许多已部署的IDS系统是公共域系统,如极为流行的Snort IDS系统。
一个机构可能在它的机构网络中部署一个或多个IDS传感器。当部署了多个传感器时,它们通常共同工作,向一个中心IDS处理器发送有关可疑流量活动的信息,中心处理器收集并综合这些信息,当认为适合时向网络管理员发送告警。该机构将其网络划分为两个区域:一个高度安全区域,由分组过滤器和应用程序网关保护,并且由IDS系统监视;一个较低度安全区域(称之为非军事区(DeMilitarized Zone, DMZ)),该区域仅由分组过滤器保护,但也由IDS系统监视。注意到DMZ包括了该机构需要与外部通信的服务器,如它的公共Web服务器和它的权威DNS服务器。
IDS系统大致可分类为基于特征的系统(signature-based system)或基于异常的系统(anomaly-based system)。基于特征的IDS维护了一个范围广泛的攻击特征数据库。每个特征是与一个入侵活动相关联的规则集。一个特征可能只是有关单个分组的特性列表(例如源和目的端口号、协议类型和在分组载荷中的特定比特串),或者可能与一系列分组有关。 这些特征通常由研究了已知攻击、技艺熟练的网络安全工程师生成。一个机构的网络管理员能够定制这些特征或者将其加进数据库中。
从运行上讲,基于特征的IDS嗅探每个通过它的分组,将每个嗅探的分组与数据库中的特征进行比较。如果某分组(或分组序列)与数据库中的一个特征相匹配,IDS产生一个告警。该告警能够发送一个电子邮件报文给网络管理员,能够发送给网络管理系统,或只是做日志以供以后检查。
尽管基于特征的IDS系统部署广泛,但仍具有一些限制。更重要的是,它们要求根据以前的攻击知识来产生一个准确的特征。换言之,基于特征的IDS对不得不记录的新攻击完全缺乏判断力。另一个缺点是,即使与一个特征匹配,它也可能不是一个攻击的结果,因此产生了一个虚假告警。最后,因为每个分组必须与范围广泛的特征集合相比较,IDS 可能处于处理过载状态并因此难以检测出许多恶意分组。
当基于异常的IDS观察正常运行的流量时,它会生成一个流量概况文件。然后,它寻找统计上不寻常的分组流,例如,ICMP分组不寻常的百分比,或端口扫描和ping掠过导致指数性突然增长。基于异常的IDS系统最大的特点是它们不依赖现有攻击的以前知识。 在另一方面,区分正常流量和统计异常流量是一个极具挑战性的问题。迄今为止,大多数部署的IDS主要是基于特征的,尽管某些IDS包括了某些基于异常的特性。
至此,我们学习了许许多多计算机网络安全方面的知识。