深入理解计算机网络(六):计算机网络安全

介绍计算机网络安全

传统的网络协议在网络通信时,消息都是明文的传输。如 HTTP,TCP,IP,Ethernet 等等协议。然而,明文传输会遭到他人恶意的攻击,这些攻击会窃取客户端用户的隐私信息,阻止服务端的正常工作等等。常见的安全攻击类型有:恶意软件攻击,拒绝服务攻击,数据嗅探,IP 欺骗等等。

计算机网络安全问题可以归为两类:网络通信安全,运维安全。

常见的网络通信安全问题有:

  • 消息窃听。
  • 消息篡改。插入,删除消息内容。
  • 消息伪造和重复消息。

保证网络通信的安全所需要的必要属性:

  • 保密性(Confidentiality)。消息进行加密,保证只有通信双方知道消息的内容。
  • 消息完整性(Integrity)。保证消息没有被修改。
  • 终端认证(End-point Authentication)。确认通信对方的身份。

一个网络安全协议必须实现以上所需的功能,从而实现安全的网络通信。常见的网络安全协议有 PGP,SSL,IPsec 等。

运维安全是指阻止外界对服务提供机构网络的恶意网络攻击。常见的防御措施有:建立防火墙,入侵侦测系统和入侵防御系统等。

通过本小节我们了解了网络安全的基本概念,接下来我们将介绍实现网络安全功能的基础技术,如机密和完整性校验等;网络安全协议的基本概念;最后我们将了解防火墙和入侵侦测系统是如何保护一个组织网络的安全的。

实现网络安全的技术

加密算法

加密是指发送端发送加密的数据,入侵者不能从拦截的数据中获取原始的信息,接收端可以恢复原始的数据。原始消息称为明文(Plaintext),经过加密算法加密后的消息称为密文(Ciphertext)。加密算法通过明文 m 和密钥 K1 作为输入,产生密文作为输出。密文表示为 K1(m)。解密算法通过密文和密钥 K2 作为输入,产生明文作为输出。解密表示为 K2(K1(m)) = m

我们常常把其它操作与加密(Encryption)产生混淆。如编码(Encoding)和消息摘要(Message Digest)。加密需要通过密钥来加密和解密,其他人没有密钥无法进行加密和解密。区分是不是加密的关键因素是:1. 只有使用密钥才能进行相关操作。2. 数据可以加密和还原。

编码是将一种数据格式转换为另一种格式,相应的操作为编码和解码。编码是任何人都可以操作,它不满足只有使用密钥才能进行相关操作的条件,所以它不是加密算法。常见的编码方式如 Base64。

消息摘要算法。通过 Hash 算法产生一个固定长度的值。它的转换是单向的。常用于数据完整性校验,存储用户密码信息。它没有密钥,也无法还原数据,所以它不是加密算法。常见的消息摘要算法如 MD5。

对称加密(Symmetric Encryption)

对称加密算法共享唯一的密钥进行加密和解密操作,常见的对称加密算法有:DES,3DES,AES 等。对称加密技术的类型有两种:流加密(Stream Ciphers),分组加密(Block Ciphers)。网络安全协议 PGP,SSL,IPsec 等大多使用分组加密技术。这里主要介绍分组加密技术。

分组加密:将消息明文划分为等长的块。每一个块独立加密。密文使用一对一映射,将 k bit 长度的明文块转换为 k bit 长度的密文块。一个 k bit 长的密文所有可能的有 2^k !,暴力破解几乎不可能做到。如暴力破解一个 128 位的 AES 密文大约需要100万亿年。

非对称加密(Asymmetric encryption)

非对称加密使用一对密钥即公钥(Public Key)和私钥(Private Key)来进行加密和解密,常见的算法如 RAS 算法。它可以让公钥公开在网络上分发,让客户端加密消息,但只有服务端才能解密。非对称加密不仅可以用于加密,也可以用于认证和数字签名。一般的用法时公钥加密,私钥解密。私钥签名,公钥验签。

RSA 的实现原理

生成公钥和私钥过程

  • 选择两个大质数 p 和 q。
  • 计算 n = pq, z= (p-1)(q-1)。
  • 选择一个数字 e,小于 n,且与 z 没有公共因数。
  • 找到一个数字 d,始得 ed - 1 能被 z 整除即 (ed - 1) % z = 0。
  • 公钥是一对数字 (n, e),私钥是(n, d)

加密和解密过程

设消息明文表示为 m,密文为 c。公钥为 (n, e),私钥为 (n, d)

使用公钥对明文加密。加密计算公式: c = m ^ e % n

使用私钥对密文解密。解密计算公式: m = c ^ d % n

例子,

设 p=5, q=7, n= 35, z=24, e=5, d= 29

若明文为 m=12

加密计算 c = 12 ^ 5 % 35 = 17

解密计算 m = 17 ^ 29 % 35 = 12

RSA 算法工作原理

RSA 用到的基础理论:

  • 取模运算转换公式:(a % n)^d % n = a^d % n。
  • 数值理论转换。如果 p,q时质数,n=pq,z=(p-1)(q-1),则 x^y % n = x ^ (y % z) % n。下面应用计算应用 x=m, y=ed.

证明过程:

RSA 加密公式为:c = m^e % n,解密公式为: m = c^d % n

由 c = m ^ e % n 推导 m = c ^ d % n 过程如下:

(1)将 c = m ^ e % n 代入解密公式等式,得 m = (m ^ e % n) ^ d % n

(2)由取模运算转换公式,得 m = m ^ ed % n

(3)由数值理论转换和已知条件 (ed - 1) % z = 0,得 m = m ^ (ed % z) % n = m ^ 1 % n = m % n

(4)由 m < n,得 m = m。等式左边等于右边,证明原等式成立。

消息完整性和数字签名


介绍消息完整性

认证消息的完整性(Message Integrity)需要实现以下功能:

  • 验证消息来源自合法的终端。
  • 验证消息没有被篡改。

实现消息完整性常用的技术有:数字签名(Digital Signatures)和终端认证(End-point Authentication)。

哈希算法和消息认证码

哈希算法将输入转换为固定长度的哈希值。哈希算法保证了任意的两个不同的值得到不同的 hash 值。常见的哈希算法有:MD5,Secure Hash Algorithm (SHA-1)。

传统的网络协议使用 checksum 校验消息完整性(数据分片和校验和相加结果为n个1),这种方式存在不同的消息可以存在相同的checksum。哈希值有唯一的特性,可以使用消息的哈希值检验完整性,这样更加安全可靠。

消息认证码

简单的使用哈希进行完整性校验的方式为:将消息 m 的哈希值 H(m) 附加到消息后面,组成新的消息message(m, H(m))。但是,这样的处理很容易被伪造消息。使用伪造一个新的消息,后面附加新消息的哈希值 message(m’, H(m’)),这同样也是一个具有完整性的消息。

为了防止伪造消息,可以使用加密的哈希方法(Cryptographic Hash Function),通信的双方需要共享一个密码 s 称为认证码(Authentication Code)。新的消息可以表示为 message(m+s, H(m+s))。这样入侵者不知道认证码,生成不了正确的哈希值。

数字签名(Digital Signature)

数字签名是一个加密技术,它指出了一个文档的拥有者是谁。数字签名具有的特性:可验证的,不可伪造的。

数字签名可以使用非对称加密实现。使用私钥加密,使用公钥验证。私钥是被唯一拥有的,公钥可以分发在网络上进行验证。可以对整个消息加密作为数字签名K(m),但这样太耗费了。更好的做法是对消息的哈希值进行加密作为数字签名K(H(m))。

公钥证书(Public Key Certification)

数字签名的一个重要的应用就是公钥证书。公钥证书它证明一个公钥属于一个具体的实体。公钥证书使用在很多流行的安全网络协议,如 IPsec 和 SSL。

认证机构(Certification Authority, CA),它可以绑定一个公钥和一个特定的实体。它的工作是验证身份和发布证书。

CA 验证实体的身份后,CA 创建一个证书(Certificate),它绑定实体的公钥和身份。证书包含了公钥和实体的认证信息(人的名称,有效期)等等。

实际使用场景,如客户端浏览器访问一个 HTTPS 网址,建立 SSL Socket 连接时,服务器给客户端发送自己的公钥,客户端可以通过 CA 来验证接收到的公钥是不是该网址的公钥。

终端认证

终端认证(End-Point Authentication)指的是在网络上一个实体提供它的身份给另一个实体的过程。

不安全的客户端终端认证方式:

  • 明文密码认证。可能被窃听,被他人获取密码。
  • 加密密码认证。可能受到回放攻击(Playback Attack)。被他人窃取和利用加密后的密码。

安全的客户端终端认证:

  • 使用 nonce 和加密的密码。一个 nonce 是一个数字仅仅在网络通信中使用一次,即每次通信使用不同的 nonce。这样可以防止他人利用加密后的密码。

网络安全协议

SSL

Secure Sockets Layer(SSL)是一个传输层协议,提供增强 TCP 的安全服务。SSL 提供了保密性,完整性,服务器认证,客户端认证等服务。SSL 的修改版本 SSL version 3 称为 Transport Layer Secure(TLS)。

SSL 建立连接的过程

  • 三次握手
    • 客服端,发送 SYN。
    • 服务端,响应 SYN/ACK
    • 客服端,发送 ACK。
  • 协商(Negotiation)
    • 客户端发送 Hello,以及支持的加密算法列表,和客户端 nonce(Random Number #1)。
    • 服务端响应,发送服务端选择的一个对称加密算法,一个非对称加密算法,一个 MAC 算法,SSL 证书,和服务端 nonce(Random Number #2)。
    • 客服端,验证证书,提取服务端公钥,生成一个 Pre-Master Secret(PMS),使用公钥加密 PMS,发送 PMS 和客户端证书(可选项)给服务端。
    • 服务端,使用私钥解密 Pre-Master Secret。
  • 共享密码
    • 客户端和服务端,通过随机数 #1,#2 和 PMS 计算得到 Master Secret(MS)。使用MS 生成 两个 加密密钥,两个 MAC 密钥。
  • 握手完成
    • 客服端,发送一个哈希消息使用主密码(MS)
    • 服务端,发送一个哈希消息使用主密码(MS)

SSL 实现安全通信的方法

  • 保密性
    • SSL 使用非对称加密算法交换共享的对称加密密钥。
    • SSL 使用对称加密算法加密通信的数据。
  • 完整性
    • 使用报文数据域附加的 MAC 进行完整性校验。
    • 通过 CA 验证服务端公钥的合法性。从而认证消息来自合法的终端。
  • 服务端认证
    • 通过 CA 验证公钥的合法性。从而认证服务端。
  • 防止回放攻击
    • 使用 nonce 防御连接回放攻击(Connection Playback Attack)
    • 使用MAC key + Sequence Number 生成MAC,防御数据包传输途中的回放攻击。

IPsec

IPsec (IP Security Protocol)提供网络层通信安全。它能够在所有主机和路由器上安全地传输网络层报文。IPsec 协议常用来在公共的因特网上创建一个虚拟专用网络(Virtual Private Network, VPN)。

一个机构跨越多个不同的地理区域常常想要自己的专用 IP 网络。但是搭建一个物理的专用网络代价太昂贵了,需要购买、安装和维护自己的物理网络基础设施。所以现实中通常使用 VPN 来搭建专用网络。

IPsec 的实现原理

IPsec 将原来正常的 IP 数据报转换为一个新的加密的 IP 数据报。

IPsec 创建一个新的 IP 报文:

  • 创建新的 IP 报文头部。
  • 将原始的IP 报头部和原始数据负载进行加密,加上 IPsec 头部,尾部和MAC等,组成新的 IP 报文的数据负载。

新的 IP 数据报头部和传统的 IPv4 头部相同,对于路由器来说它和正常的 IP 报文没什么区别。

IPsec 在客户端主机中将传输层的数据封装成加密的 IP 报文,在服务端主机中解密 IP 报文传给传输层。

AH 和 ESP 协议

Authentication Header(AH)协议和 Encapsulation Security Payload (ESP)协议为 IPsec 提供安全通信服务的子协议。IPsec 协议套件需要使用其中的一个协议来实现安全通信。

AH 协议提供终端认证和数据完整性,不提供保密性。

ESP 协议提供 终端认证,数据完整性,和保密性。

因为 ESP 协议提供完整的安全通信功能,所以它比 AH 协议使用更广泛。

安全关联

在 IPsec 协议中,源地址和目标地址创建的一个逻辑连接称为一个安全关联(Security Association,SA)。它是单向的,所以两个终端之间的通信需要建立两个 SA。SA 维护了 IPsec 通信的重要信息,如 加密算法类型,加密密钥,认证密钥等等。客户端和服务端都需要维护 SA 信息,SA 存储在 Security Association Database (SAD)中。通过 SA 中的信息终端主机可以进行加密,解密和认证等操作。

IPsec 的数据报

IPsec 的数据报格式如下图所示:

IPsec vs SSL

  • 安全性。IPsec 和 SSL 都可以提供了安全的网络通信。
  • 便利性。IPsec 需要一个第三方客户端软件。实现更复杂,更高的维护成本。SSL 已经在浏览器中支持了不需要额外的软件和配置。
  • 服务。IPsec 位于网络层,提供全接入的安全网络,即两个主机之间建立安全连接。而 SSL 位于传输层,只能针对某个应用进程提供安全连接。

HTTPS

HTTPS 它是 HTTP 的一个扩展。它本身并不提供安全服务,它使用传输层 SSL 来进行安全通信。HTTPS 本质是 HTTP + SSL。所以,严格意义上它不算是网络安全协议。

HTTPS 和 HTTP 报文格式相同,只是 HTTPS 建立的是 SSL Socket 连接,而 HTTP 建立的是 TCP Socket 连接。

其它安全协议

更多安全网络通信协议,如 Email 安全和无线网络安全,可阅读后面给出的参考书籍。

运维安全

运维安全(Operational Security)是指阻止外界对服务提供机构网络的恶意网络攻击。它的是实现方法为:在一个计算机网络中,进入和离开一个网络时,进行安全的检查,记录,丢弃,和转发。它的实现技术为:防火墙(Firewall),入侵检测系统(Intrusion Detection System, IDS)和入侵防御系统(Intrusion Prevention System, IPS)

防火墙

防火墙允许网络管理员可以控制网络访问,在外部网络和内部网络之间。

防火墙的定义:

  • 所有的进入和外出的网络流量需要经过防火墙。
  • 只有授权的流量时允许通过的。
  • 防火墙本身是免疫渗透攻击的。

防火墙分为三种类型:

  • 传统的数据包过滤器(Traditional Packet Filter)。通过检查报文的头部进行过滤,过滤的规则定义在接入控制列表中。
  • 有状态的过滤器(Stateful Filter)。它追踪 TCP 连接,根据 TCP 连接状态来进行过滤。所有的 TCP 连接记录在过滤列表中。非法 TCP 状态的连接将被过滤。
  • 应用程序网关(Application Gateway)。检查一个具体应用程序的所有进入和外出的报文头部和数据负载。

入侵侦测系统

防火墙只是检测数据包的头部,然而,侦测更多的攻击类型,我们需要执行深度数据包检查,同时检查报文的头部和数据负载。虽然应用程序网关可以进行数据包检查,但是它只针对一个具体的应用程序。

入侵侦测系统(Intrusion Detection System)可以对所有通过它的数据包进行深度检查,当观察到恶意攻击流量时,生成报警信息。

入侵防御系统(Intrusion Prevention System)它可以直接过滤有嫌疑的网络流量。

References

[1] Computer Networking: A Top-Down Approach, by Jim Kurose

[2] Base64 - Wikipedia

[3] MD5 - Wikipedia