下午好,我的网工朋友。
IPSec算是比较复杂的协议之一了,对于很多朋友来说,大概是“熟悉又陌生”的。
熟悉是IPSec这个技术应该听过很多次了,不管是在书中还是大佬聊天中,说用IPSec可以实现这个需求,保护数据的安全;
陌生则是并不知道IPSec具体是怎么工作的,为什么能够保证到数据的安全性,又在工作中应用这么广泛?
今天就给你梳理一遍,从基本原理到框架,再到加密算法、封装协议等等,多个角度解析IPSec。文中还有几个有趣图解案例,给你加深理解哈。
今日文章阅读福利:《 IPSec:新一代因特网安全标准.pdf 》
IPSec相关的经典好书,给你找来了完整的pdf书籍,可以转存下。私信我,备注“IPSec”,限时获取资源。
01 IPSec 基本原理
IPSec 是一项标准的安全技术,它通过在数据包中插人一个预定义头部的方式,来保障 OSI 上层协议数据的安全。
IPSec 主要用于保护网络层(IP)数据,因此它提供了网络层的安全性。
它对 VPN 流量提供了如下3 个方面的保护:
- 私密性:数据私密性也就是对数据进行加密。这样一来,即使第三方能够捕获加密后的数据,也不能将其恢复成明文。
- 完整性:完整性确保数据在传输过程中没有被第三方算改。
- 源认证:源认证也就是对发送数据包的源进行认证,确保是合法的源发送了此数据包。
如上图所示,不难看出,IPSec 技术在原始IP 头部和 IP 负载之间插入了一个IPSec 头部,这样可以对原始的IP负载实现加密,同时还可以实现对IPSec 头部和原始IP 负载的验证,以确保数据的完整性。
02 IPSec 框架
一些传统的安全技术(如HTTPS)以及无线安全术(如WEP/WPA),往往会采用某种固定的加密和散列函数。
这种做法带有明显的赌博性质,因为如果某天这个加密算法曝出严重漏洞,那么使用这个加密算法或者散列函数的安全技术也就难免要遭到淘汰。
为了避免这种在一棵树上吊死的悲惨事件发生,IPSec 并没有定义具体的加密和散列函数。
IPSec 的做法是提供一个框架性的结构,但每一次IPSec 会话所使用的具体算法,都是通过协商来决定的。
也就是说如果我们觉得 3DES 这个算法所提供的 168 位的加密强度能够满当的需要,那么就不妨暂且使用这个协议来加密数据。
但是只要有一天 3DES 出现了严重漏洞,或者出现了一个更好的加密协议,那么我们也可以马上更换加密协议,使 IPSec VPN 总是使用最新最好的协议来进行加密。
下图所示为 IPSec 框架示意图:
这张图在说明不仅仅是散列函数加密算法,还包括封装协议和模式、密钥有效期等内容都可以通过协商决定,在两个IP Sec 对等体之间协商的协议叫做IKE,下面以 IPSec 框架涉及的技术为主线,详细介绍这些技术的特点和工作原理。
03 散列函数
散列函数也叫做 HASH 函数,主流的散列算法有 MD5与SHA-1。
散列函数的主要任务是验证数据的完整性。
通过散列函数计算得到的结果叫做散列值,这个散列值也常常被称为数据的指纹 (Fingerprint)。
如上图所示:文件内容为111,通过MD5、SHA1算法之后,分别得到了不同的散列值。
01 散列函数特点
1.固定大小
散列函数可以接收任意大小的数据,并输出固定大小的散列值。
以 MD5 这个散列算法为例,不管原始数据有多大,通过 MD5 算得到列值总 128 比特,而SHA-1的输出长度则为 160 比特。
2.雪崩效应
原始数据就算修改哪怕一个比特,计算得到的散列值也会发生巨大的变化。
3.单向
只可能从原始数据计算得到散列值,不可能从散列值恢复哪怕一个比特的原始数据。
4.冲突避免
几乎不能够找到另外一个数据和当前数据计算的散列值相同,因此散列函数能够确保数据的唯一性。
散列函数虽然能够很好地确认数据的完整性,但是却容易遭受中间人攻击。合法与非法用户都可以对他们发送的信息进行散列函数计算,并得到散列值。
因此他们也都能把文件和散列值一起打包发送给接收方,而接收方也都能够通过散列函数来校验数据的完整性。
散列函数虽然能够确认数据的完整性,却不能确保这个数据来自于可信的源(不提供源认证),所以散列函数存在中间人攻击的问题。
为了弥补这个漏洞,我们可以使用一个叫做密钥化散列信息认证代码 (HMAC Keyed-hash Message Authentication Code)的技术,这项技术不仅仅能够实现完整性校验,还能完成源认证的任务。
04 加密算法
加密,顾名思义就是把明文数据转换为密文数据。
这样一来,即使第三方截获到了密文数据,也无法将其恢复为明文。而解密过程则正好相反,合法的接收者通过正确的解密算法和密钥恢复密文到明文。
加密算法可以分为如下两大类:
- 对称密钥算法
- 非对称密钥算法
01 对称密钥算法
上图所示为对称密钥算法的工作示意图,从图中可以看到一个很明显的特点:加解密双方使用相同的密钥与算法进行加解密。
因此,使用相同密钥与算法进行加解密运算的算法就叫做对称密钥算法。
对称密钥算法有如下特点:
优点:速度快、安全、紧凑
缺点:
- 明文传输共享密钥,容易出现中途劫持和窃听的问题;
- 随着参与者数量的增加,密钥数量急剧膨胀 ((n x (n-1)) /2);
- 因为密钥数量过多,对密钥的管理和存储是一个很大的问题;
- 不支持数字签名和不可否认性。
对称密钥算法的主流协议:
DES、3DES、AES、RC4
02 非对称密钥算法加密
在使用非对称密钥技术之前,所有参与者,不管是用户还是路由器等网络设备,都需要预先使用非对称加密算法(如 RSA)产生一对密钥。
非对称加密需要4个密钥。通信双方各自准备一对公钥和私钥。
其中公钥是公开的,由信息接受方提供给信息发送方。公钥用来对信息加密。
私钥由信息接受方保留,用来解密。公钥是公开的,就不存在保密问题。
也就是说非对称加密完全不存在密钥配送问题!
03 案例:非对称加、解密过程
假设小明想约小红出来玩:
1、小明确定了自己的私钥 mPrivateKey,公钥 mPublicKey。自己保留私钥,将公钥mPublicKey发给了小红;
2、小红确定了自己的私钥 hPrivateKey,公钥 hPublicKey。自己保留私钥,将公钥 hPublicKey 发给了小明;
3、小明发送信息 “周六早10点T1楼下见”,并且用小红的公钥 hPublicKey 进行加密。
4、小红收到信息后用自己的私钥 hPrivateKey 进行解密。然后回复 “收到,不要迟到” 并用小明的公钥mPublicKey加密。
5、小明收到信息后用自己的私钥 mPrivateKey 进行解密。
以上过程是一次完整的request和response。
通过这个例子我们梳理出一次信息传输的非对称加、解密过程:
1、消息接收方准备好公钥和私钥
2、私钥接收方自己留存、公钥发布给消息发送方
3、消息发送方使用接收方公钥对消息进行加密
4、消息接收方用自己的私钥对消息解密
通过私钥加密的数据只能由公钥解密,通过公钥加密的数据只能由私钥解密。由于加密和解密使用不同的密钥,因此称为非对称加密。
04 非对称密钥算法 实现数字签名
非对称密钥算法的第二个用途就是实现数字签名,为什么要签名呢?
签名的目的无非是对某一份文件进行确认。
例如,欠条。
张三欠李四 10000 元钱,欠款人张三在欠条上签名确认。签名的主要作用就是张三对这张欠条进行确认,事后不能抵赖(不可否认性)。
到底最后谁会看这个签名呢?李四很明显没必要反复去确认签名。
一般都是在出现纠纷后,例如,张三抵赖不还的时候,李四就可以把欠条拿出来,给法官这些有权威的第三方来进行验证,如果他们确认此欠条上的签名确实来自张三无疑,张三就不能再否认欠李四钱这一既定事实了。
我们来看看数字签名是如何工作的:
步骤 1:重要明文信息通过散列函数计算得到散列值(明文)。
步骤 2:“用户一”(发起者)使用自己的私钥对步骤1计算的明文散列值进行加密,加密后的散列值就叫做数字签名(密文)。
步骤3:把重要明文信息和数字签名一起打包发送给“用户二”(接收方)。
步骤4:“用户二”从打包文件中提取出重要明文信息。
步骤5:“用户二”使用和“用户一”相同的散列函数对步骤4提取出来的重要明文信息计算散列值,得到的结果简称“散列值 1(明文)”。
步骤6:“用户二”从打包文件中提取出数字签名(密文)。
步骤7:“用户二”使用预先获取的“用户一”的公钥,对步骤6提取出的密文的数字签名进行解密,得到明文的“散列值 2”。
步骤8:比较“散列值 1”和“散列值2”是否相等。如果相等,数字签名校验成功。
这样说或许比较肝,接下来给你说个生动形象的案例,看完你就懂了。
05 案例:数字签名
1. 红红有两把钥匙,一把是公钥,另一把是私钥。
2. 红红把公钥送给他的朋友们——帕蒂、道格、苏珊——每人一把。
3. 苏珊要给红红写一封保密的信。她写完后用红红的公钥加密,就可以达到保密的效果。
4. 红红收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要红红的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
5. 红红给苏珊回信,决定采用“数字签名”。他写完后先用Hash函数,生成信件的散列值(digest)。
6. 然后,红红使用私钥,再对这个散列值(digest)加密,生成“数字签名”(signature)。
7. 红红将这个签名,附在信件下面,一起发给苏珊。
8. 苏珊收信后,取下“数字签名”(signature),用红红的公钥解密,得到信件的散列值1(digest 1)。由此证明,这封信确实是红红发出的。
9. 苏珊再对信件本身使用Hash函数,将得到的散列值2(digest 2),与上一步得到的散列值1(digest 1)进行对比。如果两者一致,就证明这封信未被修改过。
10. 复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了红红的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是红红的公钥。
因此,道格就可以冒充红红,用自己的私钥做成“数字签名”,写信给苏珊,让苏珊用假的红红公钥进行解密。
11. 后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于红红。
她想到了一个办法,要求红红去找“证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对红红的公钥和一些相关信息一起加密,生成“数字证书”(Digital Certificate)。
12. 红红拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
13. 苏珊收信后,用CA的公钥解开数字证书,就可以拿到红红真实的公钥了,然后就能证明“数字签名”是否真的是红红签的。
看到这,你就完全明白了吗?
非对称密钥算法有如下特点:
优点:更安全、不用担心交换的公钥被劫持、支持数字签名和不可否认性
缺点:
- 加密速度会很慢
- 密文会变长
非对称密钥算法的主流协议:
RSA (数字签名和数字证书的主流协议)
DH (IPSec 产生密钥资源的主要协议)
ECC (椭圆曲线算法)
由于上述缺点,与对称密钥算法一样,在一套安全解决方案中不可能单独使用非对称密钥算法。
那么我们应该如何利用对称和非对称密钥算法的优势来加密实际的数据呢?
下面来看一个巧妙的加密解决方案。
06 巧妙的加密解决方案
对称密钥算法和非对称密钥算法,这两种算法都各有其优缺点。
对称密钥算法加密速度快,但是密钥数量过多不好管理,并且密钥分发不安全。非对称密钥算法密钥数量少,密钥分发方便并且不存在安全隐患,但是加密速度奇慢,不可能用于大流量数据的加密。
所以在实际使用加密算法的时候,一般会让两种算法共同工作,发挥各自优点。
下面是一个非常巧妙的联合对称和非对称算法的解决方案,这种解决问题的思路被大量运用到实际加密技术。
步骤1:“用户一”(发起方)使用本地随机数产生器,产生用于对称密钥算法的随机密钥,用于加密数据。
步骤2:使用步骤1产生的随机密钥,对重要的明文信息通过对称密算法进行加密,并得到密文。
步骤3:“用户一”(发送方)需要预先获取“用户二”(接收方)的公钥,并且使用“用户二”的公钥对步骤1产生的随机密钥进行加密,得到加密的密钥包。
步骤4:对步骤2和步骤3产生的密文和密钥包一起发送给“用户二(接收方)。
步骤5:“用户二”首先提取出密钥包,并且使用自己的私钥对它进行解密,并得到明文的随机密钥。
步骤6:“用户二”提取出密文,并且使用步骤5解密得到的随机密钥进行解密,得到明文的重要信息。
05 封装协议
IP Sec有ESP和AH两种封装协议:
01 ESP
ESP(Encapsulation Security Payload)的IP协议号为50,ESP能够为数据提供私密性(加密)、完整性和源认证3大方面的保护,并且能够抵御重放攻击(反复发送相同的包,接收方由于不断地解密消耗系统资源,实现拒绝服务攻击(DOS))。
ESP 只能保护IP负载数据,不对原始 IP 头部进行任何安全防护。
02 AH
AH(Authentication Header) 的IP 协议号为 51,AH 只能够为数据提供完整性和源认证两方面的安全服务,并且抵御重放攻击。AH 并不能为数据提供私密性服务,也就是说不加密,所以在实际部署IPSe VPN 的时候很少使用AH,绝大部分IPSec VPN都会使用 ESP 进行封装。
AH不仅能保护IP负载数据,还能对原始 IP 头部进行验证。
当然 AH 不提供私密性服务,只是它不被广泛采用的其中一个原因,另外一个原因是AH协议封装的IPSec数据包不能穿越NAT。
06 封装模式
IPSec有如下两种数据封装模式:
传输模式(Transport mode)
隧道模式(Tunnel mode)
01 传输模式(Transport mode)
因为AH少使用所以封装模式示意图中我们都以ESP封装协议为例来进行介绍。
传输模式实现起来很简单,主要就是在原始 IP 头部和 IP 负载(TCP头部和应用层数据)之间插入一个ESP 头部。当然ESP 还会在最后追加上ESP尾部和ESP验证数据部分,并且对 IP负载和 ESP尾部进行加密和验证处理,但原始 IP 头部被完整地保留了下来。
02 隧道模式(Tunnel mode)
隧道模式把原始 IP 数据包整个封装到了一个新的 IP 数据包中,并且在新 IP 头部和原始 IP 头部中间插入了ESP 头部,以此对整个原始IP 数据包进行了加密和验证处理。
07 密钥有效期
长期使用相同密钥来加密数据是不明智的,应该周期性地更新密钥,Cisco的IPSec VPN 用于加密实际数据的密钥,默认每一个小时 (3600秒)就要更新一次。
Cisco的IPSec VPN 虽然默认每小时更换一次密钥,但下一个小时使用的密钥是由当前这个小时使用的密钥,通过一系列的算法衍生得出的。也就是说这些密钥之间存在推演关系。
这样的密钥更新就不能叫做完美向前保密 PFS(Prfect Forward Secrecy)。
PFS 要求每一次密钥更新,都需要重新产生全新的密钥,和以前使用的密钥不存在任何衍生关系。
Cisco 的IPSec VPN一旦启用了 PFS 技术,就会在每一个小时结束的时候,展开一次全新的 DH 交换算法,产生全新的密钥用于下一个小时加密。
08 IKE(互联网密钥交换)协议
IPSec VPN需要预先协商加密协议、散列函数、封装协议、封装模式和密钥有效期等内容。具体执行协商任务的协议叫做互联网密交换协议 IKE。
IKE主要完成如下3个方面的任务:
- 对建立IPSec 的双方进行认证(要预先协商认证方式)。
- 通过密钥交换,产生用于加密和 HMAC 的随机密钥。
- 协商协议参数 (加密协议、散列函数、封装协议、封装模式和密有效期)。
协商完成后的结果就叫做安全关联 SA,也可以说IKE 建立了安全关联SA。
一共有两种类型,一种叫做IKE SA,另一种叫做 IPSec SA。
- IKE SA维护了安全防护 (加密协议、散列函数、认证方式、密钥有效期等)IKE 协议的细节。
- IPSec SA 则维护了安全防护实际用户流量 (通信点之间流量)的细节。
- SKEME 决定了IKE的密钥交换方式,IKE主要使用DH来实现密钥交换。
- Oakley 决定了IPSec 的框架设计,让IPSec 能够支持更多的协议。
- ISAKMP 是 IKE 的本质协议,它决定了 IKE 协商包的封装格式,交换过程和模式的切换。
ISAKMP是IKE的核心协议,所以经常会把IKE与ISAKMP 这两个词语换着使用。例如,IKE SA 也经常被说成ISAKMP SA。
在配置 IPSec VPN 的时候,主要的配置内容也是ISAKMP。SKEME 和Okley 没有任何相关的配置内容。
如果一定要对IKE和ISAKMP进行区分的话,那么由于 SKEME 的存在,因此IKE 能够决定密钥交换的方式,但是ISAKMP只能够为密钥交换来交换数据包,但却不能决定密钥交换实现的方式。
IKE的2个阶段与3个模式:
IKE协商分为两个不同的阶段:第一阶段和第二阶段。
第一阶段协商分别可以使用 6 个包交换的主模式或者3个包交换的主动模式来完成,第一阶段协商的主要目的就是对建立 IPSec 的双方进行认证,以确保只有合法的对等体 (peer) 才能够建立 IPSec VPN。协商得到的结果就是IKE SA。
第二阶段总是使用 3 个包交换的快速模式来完成,第二阶段的主要目的就是根据需要加密的实际流量(感兴趣流),来协商保护这些流量的策略。协商的结果就是IPSec SA。
整理:老杨丨10年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部