Saltzer [1974] 以及后来的 Saltzer 和 Schroeder [1975] 列出了以下安全保护系统设计原则,这些原则至今仍然有效
最小权限原则。每个用户和程序都应尽可能使用最少的权限进行操作。此原则限制了事故、错误或攻击造成的损害。它还减少了特权程序之间潜在交互的数量,从而减少了特权意外、不必要或不当使用的可能性。这个想法可以扩展到程序的内部:只有程序中需要这些权限的最小部分才应该拥有它们。有关如何执行此操作的更多信息,请参阅第 7.4 节。
机制经济性/简洁性。保护系统的设计应尽可能简单和小巧。用他们的话说,“诸如逐行检查软件和物理检查实现保护机制的硬件等技术是必要的。为了使这些技术获得成功,小巧而简单的设计至关重要。”这有时被描述为“KISS”原则(“保持简单,笨蛋”)。
开放设计。保护机制不得依赖于攻击者的无知。相反,该机制应该是公开的,依赖于相对较少(且易于更改)的项目(如密码或私钥)的保密性。开放设计使得广泛的公众审查成为可能,并且也使用户能够确信即将使用的系统是足够的。坦率地说,试图对广泛分布的系统保持机密是不现实的;反编译器和被破坏的硬件可以快速暴露实现中的任何“秘密”。Bruce Schneier 认为,聪明的工程师应该“要求与安全相关的任何东西都使用开源代码”,并确保它得到广泛的审查,并且任何已发现的问题都得到修复 [Schneier 1999]。
完全中介。必须检查每次访问尝试;定位机制使其无法被破坏。例如,在客户端-服务器模型中,通常服务器必须执行所有访问检查,因为用户可以构建或修改自己的客户端。这是第 5 章以及第 7.2 节的全部要点。
故障安全默认值(例如,基于权限的方法)。默认值应为拒绝服务,然后保护方案应识别允许访问的条件。有关更多信息,请参阅第 7.7 节和第 7.9 节。
权限分离。理想情况下,对对象的访问应取决于多个条件,以便击败一个保护系统不会启用完全访问。
最小公共机制。最大限度地减少共享机制的数量和使用(例如,使用 /tmp 或 /var/tmp 目录)。共享对象为信息流和意外交互提供了潜在的危险通道。有关更多信息,请参阅第 7.10 节。
心理可接受性/易于使用。人机界面必须设计得易于使用,以便用户能够常规且自动地正确使用保护机制。如果安全机制与用户对其保护目标的心理图像密切匹配,则可以减少错误。
Peter Neumann 的Principled Assuredly Trustworthy Composable Architectures中提供了对各种安全设计原则的良好概述。