IT 论文精读 · PAPER 69
Saltzer & Schroeder · MIT · Proceedings of the IEEE · 1975
1975 年,MIT 的 Saltzer 与 Schroeder 把「怎么让共用的计算机不容易被攻破」从零散经验收拢成八条设计原则。今天手机弹的「是否允许访问相册」、网银的双重验证、防火墙默认什么都不放行,背后都是它们。
更早的计算机一人一台,安全就是把机房门锁上。到了六七十年代,分时系统出现——一台大机器同时伺候几十个互不认识的人,程序和数据全挤在一起,「墙」第一次必须建在机器内部。当时的做法是打地鼠:出一个洞补一个补丁,补到谁也说不清它究竟防住了什么。
两位作者说:别再一个个补洞,先问「一个安全的系统,设计时该长什么样」。八条答案全是大白话:
八条拧成一个画面:系统里有个门卫,碰任何东西都得先过他这关。他先确认你是谁,再查你能不能——认出你是张三,不等于张三能进财务室。
「你能不能」说到底是一张大表格:行是人、列是东西,格子里写着这人对这东西能干什么。表太大没人整张存,于是两种拆法——把名单贴在东西门口(文件权限走这条),或把钥匙发到人手上(门禁卡、登录令牌走这条):名单能随时划掉一个名字,钥匙发出去就不知道被配了几把。
而最难的不是门卫本身,是「有没有哪扇窗户忘了装门卫」——留一条绕得过去的小路,前面所有功夫都白费。
这八条给了整行业一份能照着查的清单:默认是关还是开?有没有绕过检查的路?说句诚实的:它们是警示牌、不是能打勾验收的清单,没人能证明自己真做到了「只给够用的权限」。
安全不是出事后补洞,而是设计时守住八条常识:默认关门、每次都查、机制小到能读完、图纸公开钥匙保密、两把钥匙、只给够用的权限、少用公用部件、让人用着顺手。
想看门卫模型、访问矩阵两种切法与保护环的结构图? → 切到精读版
一篇 1975 年的教程式综述:它把散落在 Multics 等系统的保护经验收拢成一套至今通用的词汇(主体与客体、认证与授权、访问矩阵、访问控制表与能力)和八条设计原则。它没提出新算法,却定义了「安全地设计一个系统」该怎么谈。
Jerome H. Saltzer 与 Michael D. Schroeder,同出自 MIT 的 Project MAC,论文刊于 1975 年 9 月的《Proceedings of the IEEE》。两人都是 Multics 的亲历者,全文的实感来自那个真造出来、也真被攻过的系统。它上承 Lampson 1971 年的访问矩阵与 Anderson 1972 年的引用监视器,下启 1983 年的 TCSEC 标准与今天的零信任。
1970 年代初,计算机正从「一人一台、排队上机」变成分时共享,一台机器上同时跑着互不信任的用户,机房那把锁不再是边界。当时的保护实践两个毛病:零散,各家各发明一套机制,「A 比 B 安全」无从谈起;事后,先做功能、被攻破了再补。
作者先把词分清:隐私是「信息该给谁看」这个社会问题,安全是控制谁能用系统与信息的整套手段,保护是系统内部的具体机制——这篇只谈最后一个。再定义「被攻破」:三类违规,未授权的泄露、篡改、拒绝使用,即后来的 CIA 三性。最后把保护能力排成一道阶梯(图 1),并坦白最高一级做不到。
这八条不是定理,而是「你要是违反了它,请停下来想清楚为什么」的警示牌——作者自己就这么定位。
另有两条借自物理安全,作者诚实指出都搬不太动:工作因子(攻破要花多少资源)——可多数攻击不是穷举而是绕过缺陷;入侵留痕(至少事后看得见)——可复制数据不留痕迹。
把原则落成结构,核心是一个门卫:认证问「你是谁」,授权问「这身份能不能做这件事」,完全仲裁则要求它没有旁门——后来形式化为引用监视器三条:不可绕过、防篡改、小到可验证。
硬件怎么托住它?机器分两态,程序不能自己编地址,只能经描述符访问内存,描述符寄存器只有内核态能装填。这里有个常被忽略的精妙处:把寻址和授权绑在同一条硬件路径上,是让「每次都查」不至于慢到不可接受的关键——查权限成了取地址的顺带动作。
权限的全貌是一张矩阵(Lampson 1971):行是主体、列是客体,格子里是允许的操作。真实系统不存这张稀疏大表,而是切开来存,切的方向不同取舍就完全不同。
这组取舍五十年没变:UNIX 文件权限、云上的访问策略是名单派;OAuth 令牌、预签名链接是钥匙派——钥匙派在分布式系统里流行,正因为「出示即用」不必回中心问一次。
还有个容易被略过的想法:保护不该只有「内核 vs 其余」两级。普通程序也能有私有数据和受保护的入口(gate)——外界只能从少数公开入口调进来,碰不到内部数据。这是今天沙箱与对象能力系统的祖型,Multics 用保护环落了地。
诚实地说:这篇没有实验、没有数据表、没有基线对比,它是教程综述,该期待的不是数字。
它的说服力来自一个真造出来、也真被攻过的系统。1974 年美国空军对 Multics 的渗透评估(Karger 与 Schell)确实找到了可利用的漏洞,但结论是它明显强于同代系统;两位评估者 2002 年的回顾进一步指出:被攻破处大多正是违反了上述原则的实现细节。原则不是空谈,是复盘出来的——而后来五十年里,八条没有一条被推翻。
它给了这门学科一套共同语言:主体与客体、认证与授权、访问控制表与能力成为常识,很大程度上因为这篇把它们摆在一起给了统一讲法,此后「A 比 B 安全」才是可讨论的命题。
八条一一活到了今天:默认拒绝的防火墙与安全组(失败即拒);零信任「每个请求都重新校验、不因来自内网就放行」(完全仲裁);把可信计算基压到最小、乃至 seL4 那样约一万行且被完整形式化验证的微内核(机制经济性);公开征集、公开分析选出的 AES(开放设计);双因素与多签(权限分离);IAM 角色、seccomp 白名单(最小权限);Spectre / Meltdown 这类因共享缓存而跨界泄密的教训(最少公共机制);默认开启 HTTPS、用密码管理器而不是逼人记口令(心理可接受性)。
更根本的是,它立住了「安全是设计属性」——不是发布前加挂的模块,而是从第一天就约束结构。
① 定位:1975 年的教程综述,不发明算法,发明的是「怎么谈论系统安全」的词汇与框架。
② 背景:分时系统让互不信任的人共用一台机器,「墙」第一次必须建在机器内部;三类违规(泄露 / 篡改 / 拒绝使用)即 CIA 三性的雏形。
③ 八条:机制经济性、失败即拒、完全仲裁、开放设计、权限分离、最小权限、最少公共机制、心理可接受性。
④ 门卫模型:认证与授权分开、完全仲裁不留旁路;硬件靠两态机加描述符,把查权限变成寻址的顺带动作。
⑤ 访问矩阵两种切法:按列切是访问控制表(撤销易、查全局难),按行切是能力(快且易委托、撤销难)。
⑥ 证据不是实验,而是 Multics 渗透评估的复盘:被攻破处多是违反原则处。
⑦ 影响与局限:默认拒绝、零信任、可信计算基最小化、双因素、IAM 一一对应;但原则不可度量、彼此冲突,「给信息拴绳子」至今未解。