安全的本质
安全的本质是信任的问题。
一切的安全方案设计的基础,都是建立在信任关系上的。我们必须相信一些东西,必须有一些最基本的假设,安全方案才能得以建立;如果我们否定一切,安全方案就会如无源之水,无根之木,无法设计,也无法完成。
从另一个角度来说,一旦我们作为决策依据的条件被打破、被绕过,那么就会导致安全假设的前提条件不再可靠,变成一个伪命题。因此,把握住信任条件的度,使其恰到好处,正是涉及安全方案的难点所在,也是安全这门学问的魅力所在。
安全三要素
机密性、完整性、可用性
机密性要求保护数据内容不能泄露,加密是实现机密性要求的常见手段。
完整性则要求保护数据内容是完整、没有被篡改的。常见的保证一致性的技术手段是数字签名。
可用性要求保护资源是“随需而得”。
如何实施安全评估
分为四个阶段:资产等级划分、威胁分析、风险分析、设计安全方案。
资产等级划分
资产等级划分是所有工作的基础,这项工作能够帮助我们明确目标是什么,要保护什么。
互联网安全的核心问题,是数据安全的问题。
对互联网公司拥有的资产进行等级划分,就是对数据做等级划分。(每个公司最重要的资产,最看重的数据不同。)
完成资产等级划分后,对要保护的目标已经有了一个大概的了解,接下来就是要划分信任域和信任边界了。(比如两个应用之间存在数据交互业务,那么就要考虑这里的数据交互对于各自应用来说是否是可信的,是否应该在这两个应用之间划一个边界,然后对流经边界的数据做安全检查。)
威胁分析
信任域划好之后,我们如何才能确定危险来自哪里呢?在安全领域里,我们把可能造成危害的来源称为威胁(Threat),而把可能会出现的损失称为风险(Risk)。
威胁分析就是把所有的威胁都找出来,一般会使用一些模型来找。
威胁分析是非常重要的一件事情,因为如果在确定攻击面的时候想得不够全面,攻击者就可以利用事先完全没有想到的漏洞完成入侵。但是另一方面,并非每个威胁都会造成难以承受的损失。一个威胁到底能够造成多大的危害,如何去衡量他?这就要考虑到风险了。我们判断风险的高低的过程,就是风险分析的过程。
风险分析
风险由以下因素组成:
Risk = Probability * Damage Potential
影响风险高低的因素,除了造成损失的大小外,还需要考虑到发生的可能性。
设计安全方案
安全评估的产出物,就是安全解决方案。解决方案一定要有针对性,这种针对性是由资产等级划分、威胁分析、风险分析等阶段的结果给出的。
作为安全工程师,要想的就是如何通过简单而有效的方案,解决遇到的安全问题。安全方案必须能够有效抵抗威胁,但同时不能过多干涉正常的业务流程,在性能上也不能拖后腿。
好的安全方案对用户应该是透明的,尽可能地不要改变用户的使用习惯。
设计安全方案的原则
Secure By Default,是时刻要牢记的总则;纵深防御,是要更全面、更正确地看待问题;数据与代码分离,是从漏洞成因上看问题;不可预测性,是从克服攻击方法的角度看问题。
Secure By Default原则
这个原则可以归纳为白名单、黑名单的思想,如果更多地使用白名单,那么系统就会变得更安全。Secure By Default的另一层含义就是“最小权限原则”。最小权限原则要求系统只授予主体必要的权限,而不要过度授权,这样能有效地减少系统、网络、应用、数据库出错的机会。
纵深防御原则
纵深防御包含两层含义:首先,要在各个不同层面、不同方面实施安全方案,避免出现疏漏,不同安全方案之间需要相互配合,构成一个整体;其次,要在正确的地方做正确的事情,即:在解决根本问题的地方实施针对性的安全方案。
纵深防御并不是同一个安全方案要做两遍或多遍,而是要从不同的层面、不同的角度对系统做出整体的解决方案。
就入侵的防御来说,我们需要考虑的可能有Web应用安全、OS系统安全、数据库安全、网络环境安全等。在这些不同层面设计的安全方案,将共同组成整个防御体系,这也就是纵深防御的思想。
数据与代码分离原则
这一原则广泛适用于各种由于“注入”而引发安全问题的场景。将用户数据当作代码执行,混淆了代码与数据的边界,就会导致安全问题的发生。
不可预测性原则
不可预测性能有效地对抗基于纂改、伪造的攻击。实现往往需要用到加密算法、随机数算法、哈希算法,好好使用这条原则,在设计安全方案时往往会事半功倍。