161 / 163 · C11 · 约 8 分钟
分布式系统安全
本章探讨分布式系统特有的安全挑战:单机操作系统无法管辖远程主机,也无法完全信任中间网络。密码或公钥认证加上证书颁发机构签发的证书,是在不可信环境中建立身份并保护通信的核心手段。
分布式安全面临的两大难题
传统操作系统只能保护它直接管理的硬件。一旦计算跨越多台机器,就会出现两个根本障碍。远程参与者可能根本不执行约定的安全策略,甚至可能是伪装成可信伙伴的对手,其内部状态无法被检查。同时,承载消息的网络通常不受任何一方完全控制,攻击者可以伪造、复制、重放、篡改、销毁或延迟数据包。密码学是主要防御工具,但必须通过经过仔细设计的标准协议来使用,而不是自行发明。
如何在网络上验证身份
由于无法观察远程计算机,我们只能通过它独自拥有的秘密来认证它。密码适合大量客户端向单一服务器证明身份的场景,因为每个客户端可以记住一个独特字符串,服务器则以加盐哈希形式保存。公钥密码学适合相反场景:单一服务器用一把私钥向无数客户端证明自己,对应的公钥被广泛分发。任何在网络上传输的密码都必须先由已建立的加密通道保护,否则窃听者可以直接记录。
数字证书与证书颁发机构
公钥本身毫无价值,除非我们确定它属于谁。证书将身份、公钥以及过期日期等辅助信息打包,再由称为证书颁发机构(CA)的可信第三方对整个包进行数字签名。任何已经持有该 CA 公钥的人都可以验证签名,从而在从未谋面的情况下获得主体公钥的可信副本。整个体系的安全性最终取决于 CA 核实身份的认真程度以及对其自身私钥的保护。
常见误区
- 仅仅相信远程方口头保证会执行安全策略
- 在未加密通道上传输密码或其他认证秘密
- 不检查颁发者及其签名就接受一张证书
- 以为加密通道也能抵御已被攻破的远程主机
运行一个例子
最低标准 C11 · 完整程序 · 下载 .c
#include <stdio.h>
int main(void) {
puts("=== Toy Simulation of Certificate-Based Authentication ===");
puts("Remote service ExampleCorp wants to prove its identity.");
puts("It presents a certificate containing its public key, signed by TrustedCA.");
puts("Local machine already holds TrustedCA's public key (pre-installed).");
puts("Signature verification succeeds.");
puts("Public key of ExampleCorp is now trusted for this session.");
puts("Encrypted channel can be established.");
puts("Remember: the remote OS itself may still be compromised.");
return 0;
}
在本地编译
gcc -std=c11 -Wall -Wextra -Wpedantic -Werror ostep-57-distributed-security.c -o example && ./example预期结果
=== Toy Simulation of Certificate-Based Authentication ===
Remote service ExampleCorp wants to prove its identity.
It presents a certificate containing its public key, signed by TrustedCA.
Local machine already holds TrustedCA's public key (pre-installed).
Signature verification succeeds.
Public key of ExampleCorp is now trusted for this session.
Encrypted channel can be established.
Remember: the remote OS itself may still be compromised.
CHECK YOUR UNDERSTANDING
合上答案,试着解释。
为什么网站通常用公钥证书向用户证明自己,而用户却用密码向网站证明自己?
查看参考答案
网站必须向海量用户证明身份,不可能为每个访客维护不同密码。它只需发布一张由 CA 签名的公钥证书,所有浏览器都能用预装的 CA 公钥验证。每个用户则必须被单独识别,密码是人类容易使用、也容易为每个账户单独设置的机制。
继续查证
标准草案与官方章节会更新;版本标记只说明示例最低要求。