计算机安全原则
Computer Security Principles
2017 年 5 月 12 日,"WannaCry"勒索软件在一天之内感染了全球 150 个国家超过 23 万台计算机。英国国家医疗服务体系(NHS)的大量医院被迫关闭紧急服务,手术被取消,救护车被改道。代价估计超过 40 亿美元。
WannaCry 利用的是 Windows 的一个漏洞(EternalBlue),这个漏洞由美国国家安全局(NSA)发现并保留,后被一个叫"影子掮客"的组织窃取并公开。微软在攻击爆发前两个月已经发布了补丁,但数十万台机器没有及时更新。
这个案例展示了计算机安全的核心悖论:安全工具本身也是攻击工具;最危险的漏洞往往不在于技术,而在于人和流程。
破除误解:安全不是产品,是过程
许多人把安全理解为"装了防火墙和杀毒软件就安全了"。这是危险的误解。
安全是一个持续的过程,不是一个可以购买的产品状态。
原因在于:攻击者和防御者处于持续的"猫鼠游戏"中。每个新的防御机制都会催生新的攻击手段,每个发现的漏洞背后都有未知的同类漏洞。绝对的安全不存在;目标是把攻击的代价提高到超过收益,以及把被攻击后的损失控制到可接受范围。
因此安全工作的度量也不该是"有没有装某件产品",而是:关键资产是否被识别、威胁假设是否写清、控制措施是否可验证、出事之后能否在可接受时间内恢复。把安全当成采购清单,往往会留下"证书贴满墙、配置却默认开放"的空壳。
破除误解:把系统藏起来不等于安全
另一个常见误解是"只要把算法和源码藏好,攻击者就攻不进来"。这叫"隐晦式安全"(security through obscurity),在专业领域被视为脆弱的策略。
荷兰裔密码学家奥古斯特·柯克霍夫斯(Auguste Kerckhoffs)早在 1883 年的《军事密码学》(La Cryptographie Militaire)中就提出:一套加密系统即使整体设计落入敌手,也应当依然安全——安全只应依赖于密钥的保密,而非算法的保密。
信息论奠基人香农(Claude Shannon)后来把它凝练成一句话:"敌人了解系统"(the enemy knows the system)。
这正是现代密码学(如 AES、RSA)公开算法、只保护密钥的根本理由:公开的算法经得起全世界的审视,藏起来的算法只是把已知的漏洞推迟到被发现的那一天。隐晦可以作为深度防御的一层,但绝不能是唯一的一层。
安全的三角:CIA
计算机安全有三个核心目标,简称 CIA 三角:
- 保密性(Confidentiality):信息只被授权的人访问。破坏示例:数据库泄露、网络窃听。
- 完整性(Integrity):信息不被未授权篡改。破坏示例:中间人攻击修改了传输中的数据、文件被恶意软件加密。
- 可用性(Availability):授权用户能在需要时访问系统。破坏示例:DDoS 攻击、勒索软件。
不同系统对三个目标的权重不同:军事系统最关注保密性,金融系统最关注完整性,应急响应系统最关注可用性。
三者之间还存在张力:为提高可用性而做的缓存与副本,可能扩大保密性暴露面;为强化完整性而加的校验与审批,可能拖慢紧急修复。安全设计不是把三个字母都拉到满分,而是在明确业务优先级后做可辩护的取舍,并记录"我们选择牺牲了什么"。后来也有人把可问责性、真实性等属性并入讨论,但 CIA 仍是沟通风险时最稳的共同语言。
威胁建模
威胁建模(Threat Modeling)是安全设计的第一步:在攻击发生前,系统性地思考"谁会攻击我,用什么方式,目标是什么"。
常用的威胁建模框架:
STRIDE(微软的 Loren Kohnfelder 与 Praerit Garg 于 1999 年在内部文章《The Threats to Our Products》中提出):
| 威胁类型 | 含义 | 破坏的安全属性 |
|---|---|---|
| Spoofing(假冒) | 冒充他人身份 | 身份验证 |
| Tampering(篡改) | 修改数据或代码 | 完整性 |
| Repudiation(否认) | 否认执行过某操作 | 不可否认性 |
| Information Disclosure(信息泄露) | 向未授权方暴露信息 | 保密性 |
| Denial of Service(拒绝服务) | 使服务不可用 | 可用性 |
| Elevation of Privilege(权限提升) | 获取超出授权的权限 | 授权 |
威胁建模的价值不在填满表格,而在逼迫团队先回答四个问题:资产是什么、信任边界在哪里、攻击者能力假设到哪一级、失败时优先保什么。没有这些前提,后面的控制列表很容易变成与真实风险脱节的检查清单。建模还应随架构变更重做——一次微服务拆分或一次把管理接口暴露到公网,都足以让旧模型失效。
最小权限原则
最小权限原则(Principle of Least Privilege,PoLP) 是安全设计的基石之一,由 Jerome Saltzer 和 Michael Schroeder 在 1975 年论文中提出:
每个主体(用户、程序、系统)只应该拥有完成其任务所需的最少权限,不多一点。
这个原则的推论在于:即使某个组件被攻陷,攻击者获得的权限也是受限的,无法横向移动到其他系统。
值得一提的是,同一篇 1975 年论文一口气提出了八条设计原则,最小权限只是其中之一。另外几条同样常被引用:默认拒绝(fail-safe defaults,没有明确授权就一律拒绝)、开放设计(open design,安全不依赖设计的保密,与上文柯克霍夫原则呼应)、以及心理可接受性(psychological acceptability,安全机制必须易用,否则用户会主动绕开它)。半个世纪过去,这八条几乎原封不动地仍是安全设计的公认起点。
实际应用: - 数据库账户应只有当前应用需要的操作权限(读/写特定表),不应是管理员 - 云服务角色(IAM Role)应精确定义,不应用"管理员"角色 - 进程应以非 root 用户运行
最小权限要落到时效与范围上:权限应可临时提升并自动回收,而不是一旦授予就永久悬浮;访问应尽量限定到具体资源与操作,而不是"整个项目只读"这种过大集合。定期审计休眠账号与过度授权角色,往往比再买一层检测产品更能缩小爆炸半径。
深度防御
深度防御(Defense in Depth) 来自军事概念:不依赖单一防线,而是设置多层防御,即使某层被突破,其他层仍能阻止攻击。
一个 Web 应用的深度防御示例: - 网络层:防火墙、DDoS 防护 - 传输层:TLS 加密 - 应用层:输入验证、SQL 注入防护 - 身份层:多因素认证 - 数据层:加密存储、最小权限访问 - 检测层:日志、异常检测、SIEM
当任何一层失效时,其他层仍然提供保护。
深度防御真正起作用的条件是各层失败模式尽量独立:若网络过滤、应用校验与数据加密都依赖同一套错误的身份断言,一层被骗等于多层同时塌掉。因此分层不只是堆叠产品名称,而是让控制措施来自不同机制、由不同团队运维、用不同信号告警。检测层尤其关键——没有可见性,其余各层的失效会静默发生。
常见攻击类型
下面按原则而非操作步骤理解几类经典风险:它们分别打破输入信任、输出信任、请求意图信任或内存安全假设。知道"破了哪条假设",比背具体利用细节更有助于选型防御。
注入类风险(以 SQL 注入为代表):当不可信输入被拼进解释型命令时,数据与控制流的边界被抹掉。原则性防御是让查询结构与参数分离(参数化查询 / Prepared Statement),把用户内容永远当作数据而非代码。
跨站脚本(XSS):不可信内容在他人浏览器中被当成可执行脚本。原则是默认转义一切输出,并用内容安全策略(CSP)收紧可执行来源——把"谁可以在页面里跑代码"变成显式白名单。
跨站请求伪造(CSRF):浏览器自动附带的凭证被第三方站点借去发请求,于是"已登录"不再等于"用户有意"。原则是让状态改变请求携带不可预测的令牌,或收紧 Cookie 的 SameSite 策略,使跨站自动带凭证失效。
内存安全破坏(缓冲区溢出等):语言与运行时允许越界写时,完整性假设在机器码层崩塌。原则性出路是边界检查、内存安全语言(如 Rust),以及 ASLR 等让攻击失去稳定地址假设的缓解——它们提高利用成本,但不能代替修根因。
这类内存安全漏洞的分量超出多数人想象。微软安全工程师 Matt Miller 在 2019 年 BlueHat 大会上披露:过去 12 年里,微软约 70% 的安全补丁都在修复内存安全问题。Google 对 Chrome 的统计也得出相近比例。正因如此,美国网络安全和基础设施安全局(CISA)近年公开呼吁用内存安全语言(如 Rust)重写关键系统——这是一个"换语言比打补丁更治本"的罕见行业共识。
社会工程学(Social Engineering):不攻击技术,而是利用人的心理——冒充 IT 部门要求提供密码、发送钓鱼邮件等。技术防御无法完全阻止,需要安全意识培训。
Verizon 的《2024 年数据泄露调查报告》给出了量化证据:约 68% 的数据泄露涉及非恶意的人为因素——有人犯了错,或落入社会工程陷阱;而被窃取的凭据是 38% 数据泄露的最初突破口。开篇 WannaCry 揭示的悖论在这里再次得到印证:最薄弱的环节常常是人,而非机器。
软件供应链:现代防御的新前沿
WannaCry 暴露的是"没及时打补丁",而 2021 年底的 Log4Shell 暴露的是另一类更棘手的问题:你依赖的开源组件出了漏洞,而你甚至不知道自己用了它。
Log4j 是一个极其普及的 Java 日志库。它的漏洞 CVE-2021-44228 在 2021 年 12 月初公开,CVSS 评分拿到满分 10.0——攻击者只需让服务器记录一行精心构造的日志,就能远程执行任意代码。
这个漏洞由阿里云安全团队的陈兆军(Chen Zhaojun)发现并上报,而它其实自 2013 年起就潜伏在代码里,多年无人察觉。由于 Log4j 被无数应用间接依赖,潜在受影响设备以亿计。
它的教训是:现代软件是层层依赖堆叠出来的,你的安全边界不止于自己写的代码,还包括你所有的依赖、以及依赖的依赖。这催生了"软件物料清单"(SBOM,列出软件包含的全部组件,让漏洞排查有据可查)等供应链安全实践。
零信任架构
传统安全模型假设:内网是安全的,外网是危险的。"城堡与护城河"模型——只要攻入边界,内部是可信的。
零信任(Zero Trust):假设内网同样不可信,对每次访问都进行身份验证和授权。这个术语由 Forrester 分析师 John Kindervag 在 2010 年的报告《No More Chewy Centers》(标题讽刺传统架构外硬内软、像一颗软心糖)中正式提出。核心原则:
- 不信任任何人,无论在内网还是外网
- 最小权限访问,始终验证
- 假设已被攻破(Assume Breach)
零信任的实现依赖于身份管理(Identity Provider)、微分段(每个服务之间也有访问控制)和持续监控。Google 的 BeyondCorp 项目(2010 年开始)是企业零信任的最早大规模实践之一。
落地时常见的误区是把零信任缩成"换一套 VPN 产品"。真正改变的是策略决策点:每次访问都要基于身份、设备健康、资源敏感度与上下文动态评估,并且默认拒绝。若仍保留宽阔的平坦内网与长期有效的静态密钥,名义上的零信任只是换皮。它与最小权限、深度防御是同一族思想在网络与身份层的具体化:缩小隐式信任,缩短凭证寿命,让横向移动变贵。
代价与争议
安全与便利的永恒张力:更严格的安全措施往往意味着更大的使用摩擦。多因素认证(MFA)显著提高安全性,但增加了登录步骤。过度严格的安全措施会导致用户绕过它——在便利贴上写密码,是安全专家最头痛的现象。Saltzer 所说的"心理可接受性"在这里变成工程约束:机制若不能融入工作流,最终会被系统性绕过,安全账本上只剩下虚假的合规。
安全漏洞的披露伦理:发现漏洞后,应该立即公开,还是先通知受影响方,给他们时间修补?"负责任披露"(Responsible Disclosure)是行业主流规范,但政府机构(如 NSA)囤积漏洞用于攻击的做法,与这一精神背道而驰。
AI 驱动的攻防升级:大语言模型已被用于生成更逼真的钓鱼邮件和自动化漏洞挖掘。同时,AI 也用于异常检测和自动化安全分析。这场升级战的走向仍不明朗。
跨域连接
- 软件供应链安全:那次日志库漏洞暴露的不是补丁慢,而是你根本不知道自己用了它。信任边界止于依赖的依赖,所以现代防御的第一步是把"用了什么"变成可查询的事实——物料清单的价值就在这里。推论是:安全边界的长度等于依赖树的规模,而不是自己代码的行数。
- 可证伪性:隐晦式安全的缺陷不在保密,而在它的安全主张无法被检验,因而也无法积累证据。柯克霍夫原则等于要求把假设写成可公开攻击的命题:公开算法经得起全世界试错,藏起来只是把已知漏洞推迟到被发现那天。这也把隐晦降格为纵深防御中的一层,而不能成为唯一的一层。
- 信息不对称:买方在购买时无法观察软件的安全质量,于是厂商投入安全的收益不可见,市场向低质量收敛。认证、强制披露与责任规则都在补这条缺口——它们改变的不是技术,而是质量能否被定价。安全投入的转折点因此常由责任规则决定,而不由攻击技术决定。
- 认知偏差:社会工程制造权威、紧迫与互惠三种线索,逼人用快速判断代替核实。可检验推论:只教人识别钓鱼特征的培训在时间压力下会失效;有效对策是改流程——带外确认、双人复核,而不是指望当事人当场识破。
- 情报与间谍:同一个漏洞既是进攻能力,也是本国的暴露面,囤积还是上报因此是把攻防收益放在同一杆秤上称。那场席卷医院的勒索软件给出了这笔账的另一半:泄露之后,代价由完全无关的第三方承担。推论是:漏洞的社会成本与它的情报价值,并不由同一方承担。
参考文献
- Saltzer, J. & Schroeder, M. The Protection of Information in Computer Systems. Proceedings of the IEEE 63(9), 1975. (最小权限原则的来源)
- Anderson, R. Security Engineering: A Guide to Building Dependable Distributed Systems, 3rd Ed. Wiley, 2020. (全面的安全工程教材,作者提供在线阅读)
- Google. BeyondCorp: A New Approach to Enterprise Security. ;login: USENIX, 2014.
- OWASP. OWASP Top Ten. owasp.org. (每年更新的 Web 安全十大风险)
- Kerckhoffs, A. La Cryptographie Militaire. Journal des sciences militaires, 1883. (隐晦式安全批判与开放设计原则的源头)
- Kindervag, J. No More Chewy Centers: Introducing The Zero Trust Model of Information Security. Forrester Research, 2010. (零信任术语首次提出)
- Miller, M. Trends, Challenges, and Strategic Shifts in the Software Vulnerability Mitigation Landscape. BlueHat IL, 2019. (微软约 70% 补丁为内存安全问题的来源)
- Verizon. 2024 Data Breach Investigations Report. Verizon Business, 2024. (人为因素与凭据窃取占比的来源)
延伸阅读
- Schneier, B. Secrets and Lies: Digital Security in a Networked World. Wiley, 2000.