# 4.4 网络安全 (Cybersecurity)

## 4.4.1 安全特性

计算机安全可以视为保护系统和数据的保密性 (Secrecy), 完整性 (Integrity) 和可用性 (Availability)：

* 保密性：只有有权限的人，才能**读取**计算机系统和数据。若黑客泄露信用卡信息，则是攻击保密性。
* 完整性：只有有权限的人，才能**使用和修改**系统和数据。若黑客知道你邮箱密码伪造你的发送邮件，则是攻击完整性。
* 可用性：有相应权限的人，可以**随时访问**计算机系统和数据。用大量假请求来拖垮服务器的「拒绝服务攻击」(Distributed Denial of Service Attack, DDOS)，是在攻击可用性。

## 4.4.2 威胁模型分析

为实现 4.4.1 节中的对三种特性的维护，安全架构师会从抽象层面对假想敌人做出模拟，为特定情境做准备，这个过程称为「威胁模型分析」(threat model)。

该模型会对攻击者进行大致描述：攻击者能力 (capabilities)、攻击目标 (goals)、可能攻击手段/攻击矢量（attack vector）。

在实际应用过程中，具体如何保护要看是与谁进行对抗。通常威胁模型分析里 会以能力水平区分，比如”某人可以物理接触到笔记本计算机，而且时间无限”，安全架构师要在给定的威胁模型下提供解决方案以保持系统安全。

只要某些假设不被推翻，保护计算机系统、网络和数据的方法有很多。诸多安全问题可以被归结为以下两个问题：

1. who are you? 你是谁？ -> 身份认证
2. what should you have access to? 你能访问什么？-> 访问控制

## 4.4.3 身份认证

根据来访者的身份给予不同权限，用于区分不同使用者的方式称为「身份认证」 (authentication) ，常用的三种方式分别是：你知道什么 (What you know)、你有什么 (What you have)、你是什么 (what you are)。

对于重要账户，可以采用”双因素” (two-factor) 或”多因素”认证 (multi-factor authentication)，这种两步验证使得安全性大大提升。

### What you know

基于某个只有计算机和你知道的秘密（如用户名和密码）来确认身份，但若攻击者通过猜测得知，密码组合位数越多、复杂性越高，被猜中的概率越低。

以 4 位的手机 PIN 码为例，计算机可以在 1s 内从 0000 一直试到 9999，这种尝试所有可能性的攻击方式称为「暴力攻击」(brute force attack)。

通常的系统会有次数限制，比如在 PIN 码输入错误 3 次后，需要等待一定时间才能进行重试。但假设攻击者使用数以万计的计算机来形成僵尸网络在不同账户上尝试密码组合，就算每个账户只试一次，也存在命中的可能性。

8 位 PIN 码著有 1 亿种组合，但包含特殊字符的 8 位数密码有超过 600w 亿种组合。为了记忆和复杂度的综合，可以使用三个连续单词的组合，英文大约有 10w 个单词，三个单词的组合约有 1亿亿种可能。而使用不在字典中的单词，会使得密码强度进一步提升。

### What you have

基于某种用户所拥有的特定物体来确认身份，比如钥匙和锁。通常需要有人在场，使得远程攻击更为困难。但如果攻击者在附件，安全性就会降低——钥匙可以被复制，手机可能被偷，锁可以撬开。

### What you are

基于人类自身的生物特征来进行身份认证，比如指纹识别器和虹膜扫描仪就是典型的生物识别验证器，安全性最高但好的识别技术十分昂贵，且传感器中识别到的数据每次都会有差异。

相较于具有”确定性”（正确 or 错误）的 “你知道什么”和”你有什么”这两种验证方式，“生物识别”是存在概率性的。系统有可能认不出你或者错认你，同时生物认证也存在无法重设的问题——人只有十个手指，攻击者如果拿到所有指纹就玩完。

## 4.4.4 访问控制

认证完身份后，可以通过用户相对应的权限 (Permissions) 或是「访问控制列表」(Access Control Lists, ACL) 来明确谁能访问什么，修改什么，使用什么。基本权限如下：

* 读 (Read)：允许用户查看文件内容。
* 写 (write)：允许用户修改内容。
* 执行 (execute)：限允许用户运行文件（如程序）。

一种常用的”访问控制列表”配置（即访问控制模型）是为美国国防部”多层安全政策”制定的 Bell-LaPadula 模型，其特点在于「不能向上读，不能向下写」。

以 “公开、机密、绝密” 三个访问级别为例：“机密”权限用户仅能读取 “机密” 和 “公开” 文件，无法读取 “绝密” 文件；“绝密” 权限用户可以读取所有访问级别的文件，但为防止高级别文件泄露，无法修改写入低级别文件。

除此之外，“中国墙”模型 (the Chinese Wall model) 和”比伯”(Biba model) 模型也是较为常见的访问控制模型，模型的优劣取决于具体情况。

## 4.4.5 独立安全检查和质量验证

进行身份验证和访问控制的前提是软硬件可信，但我们实际上无法确定操作系统有没有被攻击者的恶意软件控制或是安全程序是否有给攻击者留后门。

安全软件在理论上是 “安全的”，但在实现时可能出错存有 bug，我们可以通过一发现漏洞就修复以及当程序被攻破时尽可能减少损害等方式来提高安全性。

系统级安全的圣杯之一是「安全内核」(security kernel)，又称作「可信计算基础」(trusted computing base)：在最小化代码数量的前提下，决定内核中有什么，同时还要确保安全性都是接近可验证的。

正式验证代码安全性是一个活跃的研究领域，现在最好的安全手段是「独立安全检查和质量验证」(Independent Verification and Validation)，这种方法让安全领域的软件开发者来审计代码（通常是开源的），外部开发人员比写原始代码的人更容易找到错误。

同时，也会举行安全大会以便安全专家互相认识并分享想法。

## 4.4.6 隔离

隔离 (isolation) 是一种在当程序被攻破后控制损害最小化的方式之一，可以通过「沙盒」(sandbox) 程序来实现，沙盒的具体方法是由操作系统给每个程序独有的内存块，其他程序不能使用。

一台计算机可以运行多个虚拟机 (Virtual Machines)，虚拟机模拟计算机，每个虚拟机都在自己的沙箱里。如果一个程序出错，最糟糕的情况是它自己崩溃或是搞坏它处于的虚拟机，而计算机上其他东西都是隔离的，并不会受其影响。
