最近读了 大佬的《白帽子讲Web安全》对信息安全有了更加深刻的理解,
故写此文章 以总结。

web 安全

在互联网中,root(administrator),也是黑客们最渴望能够获取的系统最高权限,黑客们使用的漏洞利用代码,被称为“exploit”。

但现实中root的获取是困难的,且有的黑客,则只对攻击本身感兴趣,对计算机原理和各种编程技术的了解比较粗浅,因此只懂得编译别人的代码,自己并没有动手能力,这种黑客被称为“Script Kids”,即“脚本小子”。
在现实世界里,真正造成破坏的,往往并非那些挖掘并研究漏洞的“黑客”们,而是这些脚本小子。

而相对于那些攻击系统软件的exploit而言,基于Web的攻击,一般只能让黑客获得一个较低权限的账户,对黑客的吸引力远远不如直接攻击系统软件。但黑客们有可以通过这个小小的漏洞,一步步接近root,或获得用户信息,web安全应用而生。

安全的本质

安全问题的本质是信任的问题。

工程师们很喜欢一句话:“No Patch For Stupid! ”,在安全领域也普遍认为:“最大的漏洞就是人!”所有的程序本来也没有漏洞,只有功能,但当一些功能被用于破坏,造成损失时,也就成了漏洞。程序可以不出错,但人一定会犯错。但你永远也别指望让最终用户来买单。

同时程序离不开人

零信任的安全体系会导致安全的框架非常的庞大,而且涉及的环节非常琐碎,还是应该坚持有所为,有所不为,一些东西是要靠技术解决的,而有一些东西必须要靠人的管理,没有了人的管理,技术就是泛滥的洪水,反而可能会出现一些不可控的问题。 如果我们否定一切,安全方案就会如无源之水,无根之木,无法设计,也无法完成。

安全的艺术

把握住信任条件的度

在现实生活中,我们很少设想最极端的前提条件,因为极端的条件往往意味者小概率以及高成本,因此在成本有限的情况下,我们往往会根据成本来设计安全方案,并将一些可能性较大的条件作为决策的主要依据。因此,把握住信任条件的度,使其恰到好处,正是设计安全方案的难点所在,也是安全这门学问的艺术魅力所在。

安全的要素

安全三要素,简称CIA安全三要素是安全的基本组成元素,分别是机密性 (Confidentiality)、完整性(Integrity)、可用性(Availability)。

在设计安全方案时,也要以这三个要素为基本的出发点,去全面地思考所面对的问题。互联网安全的核心问题,是数据安全的问题。
在安全领域里,我们把可能造成危害的来源称为威胁(Threat),而把可能会出现的损失称为风险(Risk)

Risk = Probability * Damage Potential

安全与产品

从产品的角度来说,安全也应该是产品的一种属性。

没有不安全的业务,只有不安全的实现方式。产品需求,尤其是商业需求,是用户真正想要的东西,是业务的意义所在,在设计安全方案时应该尽可能地不要改变商业需求的初衷。作为安全工程师,要想的就是如何通过简单而有效的方案,解决遇到的安全问题,以减少不必要的麻烦。

最终,一个优秀的安全方案应该具备以下特点:

❍ 能够有效解决问题;❍ 用户体验好;❍ 高性能;❍ 低耦合;❍ 易于扩展与升级。

“Secure by Default”原则

“Secure by Default”原则,也可以归纳为白名单、黑名单的思想。如果更多地使用白名单,那么系统就会变得更安全。

Secure By Default的另一层含义就是“最小权限原则”。最小权限原则也是安全设计的基本原则之一。最小权限原则要求系统只授予主体必要的权限,而不要过度授权,这样能有效地减少系统、网络、应用、数据库出错的机会。如 数据与代码分离原则。

纵深防御(木桶理论)

安全是一个水桶,不是看哪块木板最高,而是看哪块木板最低。当我们保护住这些“低木板”的时候,才能真正守护住水桶。诚然,列目录相比于读、写具体文件,都鸡肋了很多。但很多时候,就是这些看似“鸡肋”的漏洞组合技完成了绝杀。当列目录可以列出备份文件、整站源码的时候,你还能说列目录是个鸡肋的漏洞么?

纵深防御包含两层含义:

首先,要在各个不同层面、不同方面实施安全方案,避免出现疏漏,不同安全方案之间需要相互配合,构成一个整体;其次,要在正确的地方做正确的事情,即:在解决根本问题的地方实施针对性的安全方案。

例如
就入侵的防御来说,我们需要考虑的可能有Web应用安全、OS系统安全、数据库安全、网络环境安全等。在这些不同层面设计的安全方案,将共同组成整个防御体系,这也就是纵深防御的思想。

Secure By Default,是时刻要牢记的总则;纵深防御,是要更全面、更正确地看待问题;数据与代码分离,是从漏洞成因上看问题;接下来要讲的“不可预测性”原则,则是从克服攻击方法的角度看问题。

例如
使用DEP来保证堆栈不可执行,使用ASLR让进程的栈基址随机变化,从而使攻击程序无法准确地猜测到内存地址,大大提高了攻击的门槛。经过实践检验,证明微软的这个思路确实是有效的——即使无法修复code,但是如果能够使得攻击的方法无效,那么也可以算是成功的防御。
不可预测性的实现往往需要用到加密算法、随机数算法、哈希算法,好好使用这条原则,在设计安全方案时往往会事半功倍。

安全是一门朴素的学问,也是一种平衡的艺术。