目录
即将考试周了,考前死盯着那几门复习不是我的作风,但花大功夫去学一些新的技术时间会有些吃紧。所以翻出这本尘封已久的道哥著作,挑战这本让三个月前的自己败下阵来的小部头,希冀每天有所思考有所沉淀,深化对web安全的理解。
冷静下来,暂时从具体的技术细节脱身,冷静审视安全本身为何。
“种一棵树的最好时间是十年前,其次是现在。”
在计算机安全领域,黑客是一群破坏规则、不喜欢被拘束的人,因此总想着能够找到系统的漏洞,以获得一些规则之外的权力。
不想拿到root的黑客,不是好黑客。
有的黑客,精通计算机技术,能自己挖掘漏洞,并编写exploit;而有的黑客,只对攻击本身感兴趣,对计算机原理和各种编程技术的了解比较粗浅,因此只懂得编译别人的代码,自己并没有动手能力,这种黑客被称为“Script Kids”,即“脚本小子”。
中国黑客的发展分为了:启蒙时代、黄金时代、黑暗时代。
启蒙时代:20世纪90年代,中国互联网刚刚处于起步阶段,这时候的黑客们多是由于个人爱好而走上这条道路,好奇心与求知欲驱使他们前进,没有任何利益瓜葛,崇尚分享、自由、免费的互联网精神。
黄金时代:以中美黑客大战为标志,各种黑客组织如雨后春笋般冒出。此阶段的中国黑客,其普遍的特点是年轻,有活力,充满激情,在技术上也许还不够成熟。此时期开始出现以盈利为目的的攻击,黑色产业链逐渐形成。
黑暗时代:大多数黑客组织没有坚持下来,在上一个时期非常流行的黑客技术论坛式微没落,所有门户型的漏洞披露站点也不再公布漏洞相关的技术细节。整个互联网笼罩在黑色产业链的阴影之下,纯粹的黑客精神(开放、分享)实质已经死亡。
因为早期的web技术发展远远不成熟,加之通过攻击系统软件,黑客们往往能直接获取root权限,所以初期黑客的攻击目标以系统软件居多。
在早期互联网中,web并非互联网的主流应用,因此黑客们主要的攻击目标是网络、操作系统以及软件等领域,web安全领域的攻击与防御技术均处于非常原始的阶段。
运营商、防火墙对于网络的封锁,使得暴露在互联网上的非web服务越来越少,且web技术的成熟使得web应用的功能越来越强大,最终成为了互联网的主流。黑客们的目光也渐渐转移到了web上。
在web1.0时代,人们更多的是关注服务器端动态脚本的安全问题,比如将一个可执行脚本(俗称webshell)上传到服务器上,从而获得权限。
SQL注入的出现是web安全史上的一个里程碑,黑客们发现通过SQL注入攻击,可以获取很多重要的、敏感的数据,甚至能够通过数据库获取系统访问权限,这种效果不比直接攻击系统软件差。
XSS的出现则是web安全史上的另一个里程碑。
伴随着web2.0的兴起,XSS,CSRF等攻击已经变得更为强大。web攻击的思路也从服务端转向了客户端,转向了浏览器和用户。
web安全将紧跟着互联网发展的脚步,不断演化出新的变化。
在黑客的世界中,往往用帽子的颜色来比喻黑客的好坏。白帽子,是指哪些精通安全技术,但是工作在反黑客领域的专家们;而黑帽子,则是指利用黑客技术造成破坏,甚至进行网络犯罪的群体。
对于黑帽,只要能够找到系统的一个弱点,就可以达到入侵系统的目的;而对于白帽,必须找到系统的所有弱点,不能有遗漏才能保证系统不会出现问题。
从对待问题的角度来看,黑帽为了完成一次入侵,需要利用各种不同漏洞的组合来达到目的,是在不断地组合问题;而白帽在设计解决方案时,要不断分解问题,再对分解后的问题逐个予以解决。
随着防御技术的不断完善,攻击技术也在不断发展。谁能在技术上领先,谁就能占据主动。互联网技术日新月异,在新技术领域的发展中,也存在着同样的博弈过程。
安全问题的本质是信任的问题。
一切安全方案设计的基础,都是建立在信任关系上的。我们必须相信一些东西,必须有一些最基本的假设,安全方案才能得以建立;如果我们否定一切,安全方案就会如无源之水,无根之木,无法设计,也无法完成。
把握信任条件的度,使其恰到好处,是设计安全方案的难点所在,也是安全这门学问的艺术魅力所在。
在解决安全问题的过程中,不可能一劳永逸,即“没有银弹”。
安全是一个持续的过程。
自从互联网有了安全问题以来,攻击和防御技术就在不断碰撞和对抗的过程中得到发展。以不变的防御手段对抗不断发展的攻击技术,就犯了刻舟求剑的错误。
黑客们在不断地研究和寻找新的技术攻击,作为防御的一方,没有理由不持续跟进。
安全三要素,简称CIA,是安全的基本组成元素,分别是机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)。
机密性要求保护数据内容不能泄露,加密是实现机密性要求的常见手段。
完整性则要求保护数据内容是完整的、没有被篡改的。常见的保证一致性的技术手段是数字签名。
可用性要求保护资源是“随需而得”。
一个安全评估的过程,可以简单分为4个阶段:资产等级划分、威胁分析、风险分析、确认解决方案。
互联网公司除了拥有一些固定资产,如服务器等死物外,最核心的价值就是其拥有的用户数据。
互联网安全的核心问题,是数据安全的问题。
在本书中介绍一种威胁建模的方法,它最早是由微软提出的,叫做STRIDE模型。
?
风险由以下因素组成:
Risk=Probability * Damage Potential
本书中用微软提出的DREAD模型来更科学地衡量风险。
在上表中,高、中、低三个等级分别以3、2、1的分数代表其权重值,因此我们可以具体计算出某一个威胁的风险值。
高危:12~15分 中危:8~11分 低危:0~7分
安全评估的产出物,就是安全解决方案。
作为安全工程师,要想的就是如何通过简单而有效的方案,解决遇到的安全问题。安全方案必须能够有效抵抗威胁,但同时不能过多干涉正常的业务流程,在性能上也不能拖后腿。
好的安全方案对用户应该是透明的,尽可能地不要改变用户的使用习惯。
最终,一个优秀的安全方案应该具备以下特点:能够有效解决问题;用户体验好;高性能;低耦合;易于扩展与升级。
本节将讲述在具体设计安全方案时的技巧,在实战中可能用到的方法。
如果更多地使用白名单,那么系统就会变得更安全。
但并不是用了白名单就一定安全了。选择白名单的思想,基于白名单来设计安全方案,其实就是信任白名单是好的,是安全的。但是一旦这个信任基础不存在了,那么安全就荡然无存。
最小权限原则也是安全设计的基本原则之一,其要求系统只授予主体必要的权限,而不要过度授权,这样能有效地减少系统、网络、应用、数据库出错的机会。
在使用最小权限原则时,需要认真梳理业务所需要的权限。
纵深防御(Defense in Depth)是设计安全方案时的重要指导思想。
“木桶理论”
纵深防御包含两层含义:
首先,要在各个不同层面、不同方面实施安全方案,避免出现疏漏,不同安全方案之间需要相互配合,构成一个整体。
其次,要在正确的地方做正确的事情,即:在解决根本问题的地方实施针对性的安全方案。
这一原则广泛适用于各种由于“注入”而引发安全问题的场景。
在Web安全中,如XSS、SQL Injection、CRLF Injection、X-Path Injection等由“注入”引起的问题均可以根据“数据与代码分离原则”设计出真正安全的解决方案,因为这个原则抓住了漏洞形成的本质原因。
不能让用户输入的数据变为可执行的代码。(如防止SQL注入的参数化查询就符合这一原则)
Secure By Default是时刻要牢记的总则;纵深防御,是要更全面、更正确地看待问题;数据与代码分离,是从漏洞成因上看问题;接下来要讲的“不可预测性”原则,则是从克服攻击方法的角度看问题。
不可预测性能有效地对抗基于篡改、伪造的攻击。
不可预测性原则可以巧妙地用在一些敏感数据上。比如在CSRF的防御技术中,通常会使用一个token来进行有效防御。
不可预测性的实现往往需要用到加密算法、随机数算法、哈希算法,好好使用这条原则,在设计安全方案时往往会事半功倍。
本章归纳了笔者对于安全世界的认知和思考,从互联网安全的发展史说起,揭示了安全问题的本质,以及应该如何展开安全工作,最后总结了设计安全方案的几种思路和原则。
安全是一门朴素的学问,也是一种平衡的艺术。