软件的安全设计应该尽量遵循一些安全设计原则,这些原则是软件开发和软件测试中有
关安全经验的高度总结,用于指导安全开发人员(特别是软件架构师和设计师)开发更为安
全的软件。下面是一些基本的安全设计原则。
1)最小特权原则
对于请求存储资源的主体,只应该分配最少的必要权限,而且应该保证赋予权限分配的
必要时间最短。如果授予一个用户或进程、组件超过其行为必要的权限范围的许可,该用户
或进程、组件就有可能获得或修改其没有权限处理的信息。
2)权限分离原则
尽量把软件划分为不同独立的组件,把权限分离成不同的权限许可和认证条件,把用户
分离成不同的权限角色。不要将权限一次性授予给一个用户,而是根据需要提供多重的认证
与检查机制再进行授予。
3)最少共享机制原则
避免多个主体共享同一个资源,因为敏感的信息可能通过相同的机制在这些主体之间共
享导致被其他用户获取。每个主体应该有不同的机制或不同的机制实例,在保证多用户存取
访间的灵活性的同时,防止由单一的共享机制导致潜在违背安全性的行为。
4)完全中立原则
每次主体对资源的请求,系统都应该实行认证和执行检查,特别是和安全相关的内容。
以避免错误的赋予主体过高的权限或者在第一次授予权限之后,主体被攻击之后攻击者
滥用相关权限。为了提高性能,一些系统会缓存主体的权限,这种做法易使系统具有较高的
安全风险。
5)心理可接受度原则
安全机制应该尽可能对用户透明,只引入少量的资源使用障碍,对用户友好,才能在使
用时方便用户的理解和使用,真正起到安全防护的作用。如果安全机制妨碍了资源的可用性
或使得资源难以获取,那么用户很可能会选择关闭这些安全机制或功能。
6)默认故障处理保护原则
当系统失效或产生故障时,必须是以安全的方式来处理系统信息,系统故障处理默认应
该是安全的设置。例如:即使丧失了可用性,也应该保障系统的机密性和完整性;故障发生
时必须阻止未授权的用户获得访问权限;发生故障后,应该不向远程未授权的用户暴露敏感
信息,如错误号和错误信息,服务器信息之类。
7)经济机制原则
复杂性是评估一个系统安全性的重要因素之。如果设计、实现的功能是非常复杂的,那
么系统存在安全漏洞的可能性则大大增加,一些问题在复杂的系统中很难被及时发现。系统的设计和实现应该尽量简单,以降低因复杂性带来的安全问题。
8)不信任原则
开发者应该假定系统环境是不安全的。减少对用户,外部系统,其他组件的信任,对外
部实体所有的输入都需要进行检查,即使对于可信的外部用户输入。另外也不应该信任每次
对函数或系统的调用操作都必然会成功,如内存的分配,因此必须对每次函数或系统的调用
的返回值进行检查,并进行正确的处理。
9)纵深防御原则
软件应该设置多重安全措施,并充分利用操作系统提供的安全防护机制,形成纵深防御
体系,以降低攻击者成功攻击的机率和危害。结合多重安全措施使攻击者要绕过每一个机制
才能达到目的,提高了攻击者的攻击成本和要求,降低了安全危害。
10)保障最弱环节原则
攻击者一般从系统最薄弱的环节发起攻击,而不是针对已经加固的组件。相对于破解一
个数学上已经证明了比较安全的算法,攻击者更喜欢利用软件的安全漏洞。因此软件开发者
必须了解自己软件的薄弱点,针对这些弱点实施更强的安全保护措施。
11)公开设计原则
应该假定政击者有能力获取系统足够的信息来发起攻击,而不是依赖于攻击者不可能知
道来保护系统的安全。如果设计的加密算法存在弱密钥,或者系统设有万能口令,等等,攻
击者通过反汇编分析能够获取这些信息,攻击者还可能是内部被辞退的员工,因此,依赖于
攻击者无法掌握某些特定信息来保护自己的安全是不可靠的。
12)隐私保护原则
系统收集到的用户信息都必须实施妥善和安全的保护。攻击者获得了用户的隐私数据之
后,可以发起进一步针对用户的各种攻击,如:欺骗等,不应该向其他用户泄露用户的隐私
信息。
13)攻击面最小化原则
攻击面(Attack Surface),通常也称受攻击面,是指对一个软件系统可以采取的攻击方
法集合。因为攻击者对软件的攻击是从其暴露在外部的接口、功能、服务和协议等资源来实
施的,通过对每种资源计算其被攻击成功的可能性,并将这些可能性综合归纳,即可以衡量
软件的攻击面大小。
可以看出,一个软件的攻击面越大,其安全风险也就越大。
减少攻击面是安全设计中的一个重要步骤,软件设计人员需要仔细评估软件中所有的功
能模块和接口的特性,分析其可能存在的安全风险,并设定相应的限制措施。如果一个功能
/数据接口不是必要的,则应该取消或禁止,或者默认不开启的。如果一个功能/数据接口的
配置没有特殊的理由,默认则应该按安全的方式进行设置。
本文作者:CIO之家的朋友 来源:CIO之家的朋友们
CIO之家 www.ciozj.com 微信公众号:imciow