注:原文来自《白帽子讲Web安全》
安全的本质
安全是什么?什么样的情况下会产生安全问题?我们要如何看待安全问题?只有搞明白了这些最基本的问题,才能明白一切防御技术的出发点,才能明白为什么我们要这样做,要那样做。
在武侠小说中,一个真正的高手,对武功有着最透彻、最本质的理解,达到了返璞归真的境界。在安全领域,笔者认为搞明白了安全的本质,就好比学会了”独孤九剑“,天下武功万变不离其宗,遇到任何复杂的情况都可以轻松应对,设计任何的安全方案也都可以信手拈来了。
那么,一个安全问题是如何产生的呢?我们不妨先从现实世界入手。火车站、机场里,在乘客们开始正式旅途之前,都有一个必要的程序:安全检查
。机场的安全检查,会扫描乘客的行李箱,检查乘客身上是否携带了打火机,可燃液体等危险物品。抽象地说,这种安全检查,就是过滤掉有害的、危险的东西。因为在飞行的过程中,飞机远离地面,如果发生危险,将会直接危害到乘客们的生命安全。因此,飞机是一个高度敏感和重要的区域,任何有危害的物体都不应该进入这一区域。为了达到这一目标,登机前的安全检查就是一个非常有必要的步骤。
从安全的角度来看,我们将不同重要程度的区域划分出来,如下图所示,安全检查的过程按照需要进行过滤:
通过一个安全检查(过滤、净化)的过程,可以梳理未知的人或物,使其变得可信任。被划分出来的具有不同信任级别的区域,我们称之为信任域
,划分两个不同信任域之间的边界,我们称之为信任边界
。
数据从高等级的信任域流向低等级的信任域,是不需要经过安全检查的;数据从低等级的信任域流向高等级的信任域,则需要经过信任边界的安全检查。
我们在机场通过安检后,想要从候机厅出来,是不需要做安全检查的;但是想要再回到候机厅,则需要再做一次安全检查,就是这个道理。
笔者认为,安全问题的本质是信任的问题
。
一切的安全方案设计的基础,都是建立在信任关系上的。我们必须相信一些东西,必须有一些最基本的假设,安全方案才能得以建立;如果我们否定一切,安全方案就会如无源之水,无根之木,无法设计,也无法完成。
举例来说,假设我们有份很重要的文件要好好保管起来,能想到的一个方案是把文件”锁“到抽屉里。这里就包含了几个基本的假设。首先,制作这把锁的工匠是可以信任的,它没有私自藏一把钥匙;其次,制作抽屉的工匠没有私自给抽屉装一个后门;最后,钥匙还必须要保管在一个不会出问题的地方,或者交给值得信任的人保管。反之,如果我们一切都不信任,那么也就不可能认为文件放在抽屉是安全的。
当制锁的工匠无法打开锁时,文件才是安全的,这是我们的假设前提之一。但是如果那个工匠私自藏有一把钥匙,那么这份文件也就不再安全了。这个威胁存在的可能性,依赖于对工匠的信任程度。如果我们信任工匠,那么在这个假设前提下,我们就能确定文件的安全性。这种对条件的信任程度,是确定对象是否安全的基础。
在现实生活中,我们很少设想最极端的前提条件,因为极端的条件往往意味着小概率以及高成本,因此在成本有限的情况下,我们往往会根据成本来设计安全方案,并将一些可能性较大的条件作为决策的主要依据。
比如在设计物理安全时,根据不同的地理位置、不同的政治环境等,需要考虑台风、地震、战争等因素。但在考虑、设计这些安全方案时,根据其发生的可能性,需要有不同的侧重点。比如在大陆深处,考虑台风的因素则显得不太实际;同样的道理,在大陆板块稳定的地区,考虑地震的因素也会带来较高的成本。而极端的情况比如”彗星撞击地球后如何保证机房不受影响“的问题,一般都不在考虑之中,因为发生的可能性太小。
从另一个角度来说,一旦我们作为决策依据的条件被打破、被绕过,那么就会导致安全假设的前提条件不再可靠,变成一个伪命题。因此,把握住信任条件的度,使其恰到好处,正是设计安全方案的难点所在,也是安全这门学问的艺术魅力所在
。
安全三要素
安全方案的设计与实施过程中没有银弹,注定是一个持续进行的过程,那么我们该如何开始呢?其实安全方案的设计也有着一定的思路与方法可循,借助这些方法,能够理清我们的思路,帮助我们设计出合理、优秀的解决方案。
因为信任关系被破坏,从而产生了安全问题。我们可以通过信任域的划分、信任边界的确定,来发现问题是在何处产生的。这个过程可以让我们明确目标,那接下来该怎么做呢?
在设计安全方案之前,要正确、全面地看待安全问题。
要全面地认识一个安全问题,我们有很多种方法,但首先要理解安全问题的组成属性。前人通过无数实践,最后将安全的属性总结为安全三要素,简称CIA
。
安全三要素是安全的基本组成元素,分别是机密性(Confidentiality)
、完整性(Integrity)
、可用性(Availability)
。
机密性要求保护数据内容不能泄露,加密是实现机密性要求的常见手段。
比如前面的例子中,如果文件不是放在抽屉里,而是放在一个透明的玻璃盒子里,那么虽然外人无法直接取得文件,但是如果给文件增加一个封面,掩盖了文件内容,那么也就起到了隐藏的效果,从而满足了机密性要求。可见,我们在选择安全方案时,需要灵活变通,因地制宜,没有一成不变的方案。
完整性则要求保护数据内容 是完整、没有被篡改的。常见的保证一致性的技术手段是数字签名。
传说清朝康熙皇帝的遗诏,写的是“传位十四子”,被当时还是四阿哥的胤禛篡改了遗诏,变成了“传位于四子”。姑且不论传说的真实性,在故事中,对这份遗诏的保护显然没有达到完整性要求。如果在当时有数字签名等技术,遗诏就很难被篡改。从这个故事中也可以看出数据的完整性、一致性的重要意义。
可用性要求保护资源是“随需而得”。
假设一个停车场里有100 个车位,在正常情况下,可以停100 辆车。但是在某一天,有个坏人搬了100 块大石头,把每个车位都占用了,停车场无法再提供正常服务。在安全领域中这种攻击叫做拒绝服务攻击,简称DoS(Denial of Service)。拒绝服务攻击破坏的是安全的可用性。
在安全领域中,最基本的要素就是这三个,后来还有人想扩充这些要素,增加了诸如可审计性、不可抵赖性等,但最重要的还是以上三个要素。在设计安全方案时,也要以这三个要素为基本的出发点,去全面地思考所要面对的问题。