全设计原则在产品和系统的开发中占据着至关重要的地位。这些原则强调了从一开始就将安全性融入到设计过程中的重要性,而不是作为事后补救措施。通过遵循这些原则,开发者能够创建更加健壮和安全的产品,有效减少潜在的安全漏洞和威胁。接下来博主通过一些有趣案例带大家轻松理解这些原则!
1. 安全设计原则介绍
安全设计原则是指那些在安静业界实践中已经证明是成功的抽象概念的集合,设计师可以运用这种基本的设计原则来进行与开发语言、平台无关的架构设计,保护整个计算机系统避免受到从研发到运营过程中的各种安全故障。
自从1974年麻省理工学院的Jerry Saltzer教授提出了安全设计的八大原则,快50年过去了,后人在其基础上又扩展了2条,共计10条。如果你恰好是架构师、系统工程师或是开发组长,那这十大原则一定要熟记于心!
2. 安全设计十大经典原则
2.1. 最小化权限原则(Least Privilege)
指的是每个用户或程序都应该使用满足其工作需求的最少权限(即知其所需,Need to Know)。这样可以减少潜在的安全风险和攻击面。
在物理安全领域,“最小化权限”意味着员工只能进入他们工作所需的区域。例如,生产线上的工人只被允许进入生产区域,而不是研发实验室
以明朝皇帝直属的特务机构锦衣卫为例,由于其特殊的地位和职责,锦衣卫拥有很大的权力,为了防止其滥用权力,锦衣卫内部有明确的分工。
不同部门负责不同的任务,如监察、缉捕、审讯等,每个部门只拥有完成其职责所需的最低权限。比如南镇抚司管军匠以及本卫的内部监察。北镇抚司管刑狱,狱情可以直接奏报皇帝,不通过锦衣卫上层官员。
2.2. 失败-默认安全原则(Fail-safe Defaults)
访问策略应该基于允许(如白名单策略)而非拒绝(如黑名单策略),即默认情况下不允许访问,保护机制仅用来识别允许访问的场景。这个原则实际包含如下两个子原则:失败安全、默认安全。
2.2.1. 失败安全原则
任何一个复杂系统都应该有一个处理失败后的应急安全机制。
比如在《生化危机》第1部电影中,位于浣熊市地下的蜂巢的一名工作人员被病毒感染后,病毒迅速传播,导致蜂巢内的人员相继感染并变成丧尸,蜂巢为防止T病毒泄露而启动了自毁程序。这是为了防止病毒扩散到外界,确保其不被公众知晓。
2.2.2. 默认安全原则
系统在初始状态下,默认配置应该是安全的,通过使用最少的系统服务来提供最大的安全性,只有经过明确授权之后才能降低安全级别。比如产品应该默认打开密码复杂度策略,即不允许用户使用不符合密码复杂度策略的密码。
《碟中谍4》是一部动作冒险电影,讲述了特工团队执行高风险任务的故事。在电影中,主角伊桑·亨特和他的团队需要进入一家高度安全的银行内部窃取重要文件。这家银行采用了最先进的生物识别技术和复杂的访问控制系统,只有经过正式授权的员工才能进入银行的各个区域。
银行安全机制如下:
- 默认状态:银行的门禁系统默认是关闭的,只有在通过指纹、虹膜扫描或其他形式的身份验证后,才允许进入。这意味着除非经过正式授权,否则任何人都无法进入银行。
- 授权过程:银行员工需要通过多层身份验证,才能获得访问权限。即使对于银行员工来说,进入特定区域也需要经过进一步的身份验证。这确保了只有在经过明确授权的情况下,才能降低安全级别并进入受保护的区域。
这种设计不仅保护了银行资产的安全,还确保了在未经授权的情况下,任何人都无法轻易进入银行内部,这种设计就是应用了“默认安全”原则。
不过在许多场景中,安全和产品的体验经常会发生冲突,这时应当选择安全优先,在安全的前提下,可以允许通过手动关闭安全配置或策略来提升产品体验。
2.3. 经济适用原则(Economy of Mechanism)
保持系统的设计和实现尽可能简单:
- 软件设计越复杂,代码中出现Bug的概率就越高;
- 删除不需要的冗余代码和功能模块,减少系统的攻击面;
- 设计可以重复使用的组件减少代码冗余。
《速度与激情7》是一部著名的动作电影,其中有很多涉及高科技和高成本安全措施的场景。然而,在某些场景中,我们可以看到经济适用原则的应用。
在电影中,主角们需要潜入一个高度安全的地下车库,盗取几辆豪车。这个地下车库配备了先进的监控系统、门禁系统和警报系统。然而,主角们并没有使用昂贵的高科技设备,而是利用一些低成本的方法来完成任务。
- 低成本监控规避:主角们使用了一些简单的手段,比如遮挡摄像头、制造噪音干扰监控等,这些方法成本低廉但效果显著。
- 利用已有资源:主角们利用了车库本身的安全系统,比如通过破解车库的门禁系统密码,而不是去购买昂贵的新设备。
- 分阶段实施:他们将任务分为几个小步骤,每一步都尽量减少对昂贵设备的依赖,而是依靠团队成员的专业技能和协作来完成任务。
通过这种方式,主角们成功地进入了车库(安全控制系统),并盗走了几辆豪车,而没有花费大量资金购买昂贵的安全设备。
2.4. 权限分离原则(Separation of Privilege)
一种保护机制应该需要至少两把"钥匙",从而避免个人权力滥用,导致受保护的对象容易被非法获取。
比如阿里的PolarDB-X数据库支持三权分立模式,改进了传统数据库运维由DBA行使特权的独立控制体系,使得数据库管理员DBA、安全管理员DSA(Department Security Administrator)和审计管理员DAA(Data Audit Administrator)三者的权责更加清晰。其中:
- 数据库管理员(DBA):只具备DDL(Data Definition Language)权限。
- 安全管理员(DSA):只具备管理角色(Role)或用户(User)以及为其他账号授予权限的权限。
- 审计管理员(DAA):只具备查看审计日志的权限。
另一个典型的例子来自唐朝的“三省六部制”。唐朝的中央政府采用了三省六部制来实现行政权力的分权和制衡,从而提高政府运作的效率和安全性。
2.5. 完全仲裁原则(Complete Mediation)
对于每个对象的每次访问都必须经过安全检查,即主体试图访问客体时,系统每次都会校验主体是否拥有此权限。
2.6. 心理可承受原则(Psychological Acceptability)
一般涉及人机交互的安全机制可能会降低用户体验,增加用户的额外负担,但这种负担必须是最小的且是合理的。
注:如果系统安全配置方法过于复杂,系统管理员可能无意配置了一个错误选项反而也会让系统变得不安全。
比如携程的用户登录就应用到了心理可承受原则,用户在第一次输入账户和密码正确时直接可以登录平台,但如果多次输入错误就会弹出拼图验证界面。毫无疑问,如果第一次用户信息填写正确的情况下,让用户多做一次拼图验证会降低平台使用体验。
2.7. 开放设计原则(Open Design)
多数人可能认为只要产品的实现细节不公开就是安全的,最典型的例子就是不少公司或个人自研了私有的加密算法,他们认为只要算法不公开,加密的数据就是安全的,但实际应用中存在如下问题:
- 攻击者可以通过网络抓包或二进制逆向加密算法进行破解;
- 对公司不满的员工故意公开算法;
- 算法源码被恶意软件窃取。
以上任意一种条件满足,此算法就不在安全了。此外,即便以上条件均不满足,私有的加密算法也容易被客户质疑,认为是故意设计的存在缺陷的算法,甚至会认为是预留的后门。
正确的做法是使用业界成熟的加密算法。封闭的算法安全性依赖于算法本身的保密,而业界成熟的公开加密算法的安全性依赖于数学难题(如大数的质因数分解)和密钥管理。
注:虽然密码算法要遵循开放设计原则,但密钥却不能随意泄露。
安全性不应该依赖于机制设计与实现的保密性,应当使产品的设计经受充分的检验。
2.8. 最小公共化原则(Least Common Mechanism)
尽量避免多个对象共享同一资源,任意一个对象的潜在问题都会影响到其他对象。
在阿波罗计划中,NASA 设计了多个航天器和模块,其中包括指令舱、服务舱和登月舱。为了确保宇航员的安全,NASA 在设计这些模块时严格遵循了“最小公共化原则”。
为了避免一个模块的故障影响到其他模块,NASA 尽量减少了各个模块之间的直接连接和依赖。例如,指令舱和服务舱在大部分时间内是分离的,只有在关键操作(如发射和返回)时才短暂连接。
2.9. 纵深防御原则(Defense in Depth)
纵深防御体本质是多层防御,使得入侵者必须突破层层堡垒才能接触到核心数据资产。防守方建立起纵深防御体系后,攻击方的入侵难度和入侵成本将大幅度提高,通常远未到终点时就会被发现,这就使得防守方有充足的时间响应和处置,从以前相对被动的地位转为相对主动。
但是,纵深防御机制设计得过于复杂时,也增加了系统的复杂性,从而导致为了解决某些安全问题而引入了其它的安全问题。
2.10. 保护最薄弱环节原则(Protecting the weakest link)
护最薄弱环节是指在安全设计中,系统的安全性往往是由其最薄弱的环节决定。以下介绍一个案例说明这一原则。
凯文.米特尼克(Kevin Mitnick)是美国著名的黑客,他在20世纪80年代-90年代通过社会工程和技术手段进行了一系列高调的黑客攻击,最终被捕入狱。在一次著名攻击中,他成功入侵了一家大型公司的内网,这次攻击中就反向应用了“保护最薄弱环节原则”。
尽管这家大型公司拥有强大的技术防御措施(IPS等),但尼克知道公司员工很可能是其最薄弱的环节,便通过电话伪装成公司的IT支持人员,与一名普通员工取得联系,声称需要进行紧急系统维护,并要求这名员工提供他的用户名和密码。由于这名员工缺乏安全意识,便把敏感信息提供了出去。尼克通过此用户名和密码成功绕过了公司的所有技术防御措施,窃取了大量敏感数据,并进一步的扩大了攻击范围。
注:基于此原则,企业应该考虑将安全预算花费在保护最严重问题和高危漏洞上,将钱花在刀刃上。
如果你对安全设计感兴趣,推荐你阅读:
- 软件安全的未来之路:构建默认安全的软件
- 安全设计 | 安全设计不得马虎!微软STRIDE威胁建模方法可快速发现应用安全隐患
- 安全设计 | Microsoft 威胁建模工具Threat Modeling Tool安装及使用详解(含样例)
参考链接
- https://nob.cs.ucdavis.edu/classes/ecs153-2000-04/design.html
- https://doc.polardbx.com/dev-guide/topics/triple-authority-introduction.html
- https://www.tonghaoinfo.com/news/211.html