编程语言研究书库

安全引论与认证 — 沙地上的房子,和「证明你是谁」为什么这么难

20 安全引论与认证 — 沙地上的房子,和「证明你是谁」为什么这么难

1. 这一章讲什么

全书最后一部分换了作者(UCLA 的 Peter Reiher),也换了问题: 前四部分防的是事故(断电、崩溃、丢包),这一部分防的是 故意的恶意。本章搭好这座建筑的脚手架:五级台阶—— 先定安全目标(要防什么),再定策略(谁可以做什么), 然后是认证(你说的「你」凭什么信)、访问控制(信了之后放你做什么)、 密码学(操作系统管不到的地方怎么办)。本章走完前三级的理论 加第一级实践:认证。

2. 顶层全景

  为什么 OS 安全是一切的根基:
    所有软件跑在 OS 上;OS 握着全部硬件 ──「沙地上的房子」
    OS 漏洞 = 攻击者获得 OS 的全部权力(读写任意内存/文件/网络)
        │
  五级台阶:
    ① 目标:CIA + 不可抵赖(机密性/完整性/可用性/不能赖账)
    ② 策略:把目标写成软件能执行的规则(「A 和 B 可写 X,别人不行」)
    ③ 认证:你是谁 ── 你知道什么(密码)/你有什么(令牌)/你是什么(生物)
    ④ 访问控制:你能不能做(下一章)
    ⑤ 密码学:管不到的地方怎么保护(再下一章)
        │
  设计时的八条老规矩(Saltzer & Schroeder, 1975):
    机制简单 / 默认安全 / 每次检查 / 公开设计 / 分权 / 最小权限 /
    最少共用机制 / 可用性(用户不肯用就等于零)

图说:上半是「为什么 OS 是地基」,下半是本部分(以及本章)的地图。

3. 核心原理

3.1 为什么操作系统是「沙地上的房子」

一切软件都跑在操作系统上;操作系统握着整台机器(处理器、 内存、外设)的完全控制权1。书里列举它因而能做的一切: 看改任意进程的内存、读写删任何文件、改任何进程的调度、 冒充任何进程发消息、对任何系统调用撒最有害的谎…… 进程对操作系统几乎无法自保。所以我们不必假设 OS 恶意, 但只要一个漏洞让恶意进程能操纵 OS 失序,那个进程就获得了 OS 的全部权力2。两层推论:OS 自身的正确性是所有上层 安全的公分母;而 OS 的安全机制(虚拟内存的隔离、系统调用 这道检查站)同时就是前四部分学过的那些机制——只是现在假想 的使用者是故意的3。

安全 vs 容错的小注脚:前面做的虚拟化隔离,防的是无意的互相 踩踏;恶意攻击者会主动找隔离机制的缝,而且我们本来就需要 进程间合法的共享——合法的缝就是攻击面4。

3.2 目标与策略:CIA + 把愿望写成规则

三个大目标(所有系统通用)5:

  • 机密性(Confidentiality):该藏的不让人知道(信用卡号);
  • 完整性(Integrity):该是什么状态就不被改(订单不被改成 1000 份凤尾鱼披萨);其中含真实性——信息确实出自声称的作者;
  • 可用性(Availability):该提供的服务不被掐(竞争对手不能 堵你店门口的路)。 外加不可抵赖:说了的话不能事后赖账——赖账越难,作恶越容易被追责。

目标必须落成策略:软件能执行的具体规则。「A 和 B 可以写 文件 X,其他用户不行」这种粒度6。一个重要分工:操作系统 提供通用机制,策略由人告诉它——OS 默认连「地址空间私有」 这类基础目标之外的事都不知道,你把策略说错,机制再好也白搭。 这正呼应了全书的机制/策略二分:安全是它的又一次现身。

3.3 Saltzer 八原则:1975 年的设计清单

书里完整给出(引 [SS75]),值得原样记住7:

原则一句话违反的常见病
机制简单越小越简单越少 bug巨型内核、万能守护进程
默认安全默认值取更安全的那边默认开放权限、默认监听全网
完全调解每次访问都查,不缓存「上次查过」检查一次后不再查
公开设计假定攻击者知道全部设计细节「保密靠算法保密」
分权关键动作要多方凭据单人一把万能钥匙
最小权限只给必需的权限root 跑一切、应用全权账号
最少共用机制不同用户走不同机制所有用户共享一个数据结构
可接受性用户不肯用就等于没有安全流程繁琐被绕过

图说:八条里没有一条是技术机密,全是工程纪律——所以它们五十年 不过时。攻击者和你一样聪明但更懒:不找零日漏洞,专挑你 weakest link,而最弱环常常是人(密码设成 "password")8。

3.4 认证:三类凭据,各自的死穴

**身份先要有处可挂。**认证之前还有一环:进程的身份是哪来的? 机制朴素:进程几乎都是别的进程造的(fork),OS 处理创建请求时, 查父进程控制块里的身份、给子进程新建一个控制块、把身份抄过去 ——子进程继承父进程的身份9。可如果满系统只有一个身份, 任何「谁可以做什么」的策略都无从谈起。所以开机先造一个属系统 自己的「元初进程」,再让身份分岔:多用户系统里,你在 shell 敲 一条命令,就是请 OS 以你的身份起一个新进程;而 shell 的身份 是当初你登录时,OS 亲手把它的所有者改成你的9。那 OS 凭什么 知道你是你?你已经看到下一环了:它必须能向用户索要身份证明并 验证,才能给进程挂上可靠身份,才谈得上按身份执行策略。 一环扣一环,这就是认证存在的原因。

认证要回答的问题是:这个自称 X 的请求者,凭什么证明它是 X? 凭据分三类10:

你知道什么(密码)。最古老也最脆。人的选择不随机—— 攻击者拿一本「按使用概率排序的名字+词+123456 列表」 (字典攻击),对典型站点能猜中 90% 的密码11。 登录入口的防护是限速:错几次就锁或指数变慢。 真正的防线在密码文件上:只存哈希(把任意数据压成固定长度指纹的函数,原样反推不回去);但哈希也怕 预计算表——所有人用同一种哈希算法,攻击者偷到文件后 只需拿「字典×哈希」对一遍。解法是 盐(salt): 每个密码配一个随机数(32–64 位),哈希的是「盐+密码」, 盐明文存在文件里。32 位盐 = 每个字典词要算 2³² 次哈希, 预计算表作废(Morris 与 Thompson 1979 年的发明)12。 Linux 登录流程把它落成五步:特权 login 进程查名字 → 取盐与盐化哈希 → 用用户输入重算比对 → 匹配则 fork、 置用户/组身份、cd 回家目录、exec 用户的 shell13。 细节之美:失败时不区分「用户不存在」和「密码错」—— 不让攻击者枚举合法用户名14。

你有什么(令牌/手机)。USB 密钥、显示动态码的令牌。 要害是必须常变:静态信息一旦被人瞟见,「你有什么」 就退化成「你知道什么」15。死穴是丢失:你开不了门, 捡的人会冒充你——多因子(密码+令牌)在此救命: 小偷偷了令牌还得猜密码16。

你是什么(生物识别)。指纹、人脸、声纹。两个内在问题: 假阳性/假阴性不可兼得(交叉错误率是权衡点); 以及无法更换——密码泄露换一个,指纹泄露换不了。 对不可信终端上采样的生物特征尤其要当心17。

这两个「内在问题」背后各有一层机制,书里都展开了18。 为什么不能像密码那样逐位比对:摄像头拍下的「照片」在程序 眼里只是一堆数字(明暗、色阶、对比度);存一张正确用户的照片, 下次逐位相等才算过?做不到——同一个人、隔一秒、同样的灯光, 两张照片的位模式几乎必然不同,换个发型、暗一点光,数就全变了。 所以程序只能提取更高一层的特征(鼻梁长度、眼睛颜色、嘴型), 再比对特征;并且只能要求「够接近」而不是全等。 容差由此进场:卡得太紧,真主人某天都被拒(假阴性); 放得太松,长得像的人、甚至一张照片都能混进来(假阳性)。 两个错误率互相顶,两条曲线的交点叫交叉错误率;把系统调在 哪一点,取决于你更怕哪种错——手机指纹宁可错放也不愿天天锁死 主人,金库视网膜扫描宁可麻烦经理复检,也绝不能让一只假眼睛 开门18。 为什么不可信终端的采样要当心:网络上过来的只是一串位, 而位就是位——任何人都能造出任意位模式;攻击者若知道你的指纹 读数长什么样,他不需要你的手指,也不需要指纹仪19。

结论(书里替安全界说的):单靠密码已经不够格, 最多作为多因子之一——这正是今天「密码+短信/令牌」 成为标配的理论出处20。

**还有一类请求者根本不是人。**Web 服务器、智能灯泡:没有 「某个登录的用户」该把身份附给它们,但代码确实在跑。机制是 给它们也开个账号(webserver、lightbulb),把身份挂到对应 进程上;难的是「怎么保证只有真的 Web 服务器进程能挂这个 身份」。一条路是给非人类用户也设密码,管理员登录成 webserver 再起服务,子进程自然继承;更常用的是特权机制:允许指定用户 直接创建属于别的身份的进程——Linux 的 sudo -u webserver apache2 就是以 webserver 的身份启动 apache2;启动者自己要过一遍认证,apache2 的子进程再继承 webserver 身份21。这几种办法都允许一个用户造出属于 另一个用户的进程,所以统统要配强管控(临时借身份的那条路 ——setuid——是下一章的主角)。

组是另一种主体。有时要标识的不是个人,而是一组共享特征的 人:四五个管理员,谁都该能启动 Web 服务器。把特权授予「组」、 再登记成员,比逐个授权好管。实现上有两种挂法:每个进程随身带 一份组列表,或者用个人身份去索引「这个人属于哪些组」的名单—— 后者更灵活,一个人可以进任意多个组。要留神的是:子进程照例继承 父进程的组特权,而且组成员资格是用户拿到资源访问权的第二条 路径——它带来方便,也带来第二条要守的口子22。

4. 作者的判断与证据

书里给了证据的判断:

  • CIA 三目标是安全研究的共识框架;不可抵赖作为第四维补充;
  • 八原则引 Saltzer & Schroeder 1975 原文,书里明说「不保证安全, 但不遵守后果自负」7;
  • 盐的有效性论证是量化的(2³² 个预计算变体)12;
  • 字典攻击 90% 成功率引 [G13] 对真实站点的研究11。

作者的判断(立场):

  • 「密码是过去的技术」是安全界的广泛信念,书里借来作本章结论—— 这是作者(安全学者)的立场,不是 OS 教材的立场;
  • 「学者说的安全和现实世界有显著差距,部分因为学者爱贬低 一切理论上可破的东西」——这位作者难得的自我调侃16。

5. 边界与局限

  • 本章(及本部分)广度优先、深度有限:密码学只有用法没有数学, 访问控制没有 capability 系统的实现细节;
  • 生物识别一节写作时还没有通行的人脸识别滥用讨论,其「假阳性/ 假阴性」框架仍是正确底色,但现实争议远超出技术;
  • 「不区分用户不存在/密码错」等细节以 Linux 为例,其他系统 行为可能不同(有的为可用性会给出部分信息)。

6. 可带走的

  1. OS 是一切安全的公分母:评估任何系统的安全,先看它脚下的 OS/运行时可信不可信。
  2. 先定目标(CIA),再写策略,再上机制——顺序颠倒的机制是摆设。
  3. 八原则背三条最救命的:最小权限、默认安全、完全调解。
  4. 存密码 = 哈希 + 盐;登录 = 限速 + 模糊报错。这四个词是 任何认证系统的设计底线。
  5. 静态凭据会退化:令牌必须常变,否则「你有」变「你知」。
  6. 多因子的本质是不同类别的死穴互不兜底——偷设备的猜不到 密码,猜中密码的没有设备。

7. 原文地图

主题原书章原文位置
「沙地上的房子」53. Introduction To Operating System Securitytext/55-ch53-53-introduction-to-operating-system-security.txt:17(搜「house on sand」)
OS 的全部权力清单53. Introduction To Operating System Securitytext/55-ch53-53-introduction-to-operating-system-security.txt:107(搜「complete control」)
CIA 三目标与不可抵赖53. Introduction To Operating System Securitytext/55-ch53-53-introduction-to-operating-system-security.txt:180(搜「Confidentiality」)
目标 → 策略的细化53. Introduction To Operating System Securitytext/55-ch53-53-introduction-to-operating-system-security.txt:234(搜「flexibility」)
安全 vs 容错旁注53. Introduction To Operating System Securitytext/55-ch53-53-introduction-to-operating-system-security.txt:251(搜「FAULT TOLERANCE」)
八原则53. Introduction To Operating System Securitytext/55-ch53-53-introduction-to-operating-system-security.txt:284(搜「Saltzer」)
最弱环提示53. Introduction To Operating System Securitytext/55-ch53-53-introduction-to-operating-system-security.txt:399(搜「WEAKEST LINK」)
认证与三类凭据54. Authenticationtext/56-ch54-54-authentication.txt:82(搜「who」)
字典攻击 90%54. Authenticationtext/56-ch54-54-authentication.txt:299(搜「dictionary attack」)
盐的机制与出处54. Authenticationtext/56-ch54-54-authentication.txt:354(搜「salt」)与:355(搜「Morris」)
多因子与 ATM 例子54. Authenticationtext/56-ch54-54-authentication.txt:375(搜「multi-factor」)
Linux 登录五步54. Authenticationtext/56-ch54-54-authentication.txt:400(搜「LINUX LOGIN」)
身份继承链(子抄父、登录定身份)54. Authenticationtext/56-ch54-54-authentication.txt:106(搜「inherits」)
生物特征的匹配机制(特征+容差)54. Authenticationtext/56-ch54-54-authentication.txt:570(搜「bit-for-bit」)与:609(搜「crossover error rate」)
网络上生物特征读数的危险54. Authenticationtext/56-ch54-54-authentication.txt:637(搜「Bits are bits」)
非人类主体的认证与 sudo54. Authenticationtext/56-ch54-54-authentication.txt:668(搜「light bulb」)与:706(搜「sudo -u webserver」)
组作为主体、第二条授权路径54. Authenticationtext/56-ch54-54-authentication.txt:766(搜「second path」)
「你有什么」的退化与丢失54. Authenticationtext/56-ch54-54-authentication.txt:458(搜「converted」)
生物识别的假阳性/假阴性54. Authenticationtext/56-ch54-54-authentication.txt:602(搜「false positive」)

Footnotes

  1. 出处:「53. Introduction To Operating System Security」第 1–29 段(text/55-ch53-53-introduction-to-operating-system-security.txt:17,搜「house on sand」)。原文:「就像在沙地上盖房子」——上层再好,底层被冲走一切全完。 ↩

  2. 出处:「53. Introduction To Operating System Security」第 100–159 段(text/55-ch53-53-introduction-to-operating-system-security.txt:107,搜「complete control」)。 ↩

  3. 出处:「53. Introduction To Operating System Security」第 363–437 段(text/55-ch53-53-introduction-to-operating-system-security.txt:391,搜「system calls」)。原文:系统调用切换特权级的那一跳,同时就是 OS 检查「这个进程配不配做这件事」的机会。 ↩

  4. 出处:「53. Introduction To Operating System Security」第 251–272 段(text/55-ch53-53-introduction-to-operating-system-security.txt:251,搜「FAULT TOLERANCE」)。 ↩

  5. 出处:「53. Introduction To Operating System Security」第 164–215 段(text/55-ch53-53-introduction-to-operating-system-security.txt:180,搜「Confidentiality」)。 ↩

  6. 出处:「53. Introduction To Operating System Security」第 216–276 段(text/55-ch53-53-introduction-to-operating-system-security.txt:240,搜「users A and B」)。 ↩

  7. 出处:「53. Introduction To Operating System Security」第 278–361 段(text/55-ch53-53-introduction-to-operating-system-security.txt:298,搜「Economy of mechanism」)。 ↩ ↩2

  8. 出处:「53. Introduction To Operating System Security」第 399–419 段(text/55-ch53-53-introduction-to-operating-system-security.txt:399,搜「WEAKEST LINK」)。原文:攻击者和你一样聪明、且很「懒」——不找零日,专攻最易入口。 ↩

  9. 出处:「54. Authentication」第 103–155 段(text/56-ch54-54-authentication.txt:106,搜「inherits」)。原文:子进程继承父进程身份——OS 查父进程控制块、为子进程建新控制块、复制身份;用户登录时 OS 把新进程的所有者设成该用户。 ↩ ↩2

  10. 出处:「54. Authentication」第 54–120 段(text/56-ch54-54-authentication.txt:82,搜「who」)。三分类:你知道的、你有的、你是什么。 ↩

  11. 出处:「54. Authentication」第 290–333 段(text/56-ch54-54-authentication.txt:302,搜「90%」)。 ↩ ↩2

  12. 出处:「54. Authentication」第 334–368 段(text/56-ch54-54-authentication.txt:354,搜「salt」)与:355(搜「Morris」)。 ↩ ↩2

  13. 出处:「54. Authentication」第 400–441 段(text/56-ch54-54-authentication.txt:404,搜「login process」)。 ↩

  14. 出处:「54. Authentication」第 430–437 段(text/56-ch54-54-authentication.txt:432,搜「which condition failed」)。原文:不区分两种失败,防止枚举合法用户名。 ↩

  15. 出处:「54. Authentication」第 445–459 段(text/56-ch54-54-authentication.txt:458,搜「converted」)。原文:静态信息泄露后,「something you have」退化为「something you know」。 ↩

  16. 出处:「54. Authentication」第 460–479 段(text/56-ch54-54-authentication.txt:468,搜「multi-factor」)。「学者与现实差距」的自嘲在同段附近(:473)。 ↩ ↩2

  17. 出处:「54. Authentication」第 600–647 段(text/56-ch54-54-authentication.txt:602,搜「false positive」)。 ↩

  18. 出处:「54. Authentication」第 552–621 段(text/56-ch54-54-authentication.txt:570,搜「bit-for-bit」)与交叉错误率(:609,搜「crossover error rate」)。原文:两张照片位模式必然不同,只能提取高层特征、允许「够接近」;两种错误率此消彼长,交点是交叉错误率;调松调紧取决于更怕哪种错(手机指纹 vs 金库视网膜的例子在 :612–:621)。 ↩ ↩2

  19. 出处:「54. Authentication」第 631–646 段(text/56-ch54-54-authentication.txt:637,搜「Bits are bits」)。原文:网络对面送来的只是位,而位就是位——任何人都能造出任意位模式。 ↩

  20. 出处:「54. Authentication」第 369–379 段(text/56-ch54-54-authentication.txt:372,搜「technology of the past」)。 ↩

  21. 出处:「54. Authentication」第 661–739 段(text/56-ch54-54-authentication.txt:668,搜「light bulb」)与 sudo 用法(:706,搜「sudo -u webserver」)。原文:给非人类用户挂身份的几条路——带密码登录后起进程、特权用户直接创建别属进程、或临时改身份;都需要强管控。 ↩

  22. 出处:「54. Authentication」第 740–767 段(text/56-ch54-54-authentication.txt:759,搜「arbitrary number of groups」)与 :766(搜「second path」)。原文:组成员资格是获得资源访问的第二条路径,有好处也有危险。 ↩

On this page