《白帽子讲web安全》笔记一
一、安全三要素
安全三要素是安全的基本组成元素,分别是机密性( Confidentiality)、完整性( Integrity)、可用性( Availability)。
二、安全评估
一个安全评估的过程,可以简单地分为 4 个阶段:资产等级划分、威胁分析、风险分析、确认解决方案。
1)资产等级划分是所有工作的基础,这项工作能够帮助我们明确目标是什么,要保护什么。
互联网安全的核心问题,是数据安全的问题。当完成资产等级划分后,对要保护的目标已经有了一个大概的了解,接下来就是要划分信任域和信任边界了。 通常我们用一种最简单的划分方式,就是从网络逻辑上来划分。比如最重要的数据放在数据库里,那么把数据库的服务器圈起来; Web 应用可以从数据库中读/写数据,并对外提供服务,那再把 Web 服务器圈起来;最外面是不可信任的 Internet。
2)威胁分析就是把所有的威胁都找出来。
在安全领域里,我们把可能造成危害的来源称为威胁( Threat),而把可能会出现的损失称为风险( Risk)。
威胁分析,一般是采用头脑风暴法。当然,也有一些比较科学的方法,比如使用一个模型,帮助我们去想,在哪些方面有可能会存在威胁,这个过程能够避免遗漏,这就是威胁建模。
在本书中介绍一种威胁建模的方法,它最早是由微软提出的,叫做 STRIDE 模型。
STRIDE 是 6 个单词的首字母缩写,我们在分析威胁时,可以从以下 6 个方面去考虑。
在进行威胁分析时,要尽可能地不遗漏威胁,头脑风暴的过程可以确定攻击面( AttackSurface)。
3)风险由以下因素组成:
Risk = Probability * Damage Potential
影响风险高低的因素,除了造成损失的大小外,还需要考虑到发生的可能性。
如何更科学地衡量风险呢?这里再介绍一个 DREAD 模型,它也是由微软提出的。 DREAD
也是几个单词的首字母缩写,它指导我们应该从哪些方面去判断一个威胁的风险程度。
在 DREAD 模型里,每一个因素都可以分为高、中、低三个等级。在上表中,高、中、低三个等级分别以 3、 2、 1 的分数代表其权重值,因此,我们可以具体计算出某一个威胁的风险值。
Risk = D(3) + R(1) + E(1) + A(3) + D(1) = 3+1+1+3+1=9
4)安全评估的产出物,就是安全解决方案。 解决方案一定要有针对性,这种针对性是由资产等级划分、威胁分析、风险分析等阶段的结果给出的。
一个优秀的安全方案应该具备以下特点:
能够有效解决问题;
用户体验好;
高性能;
低耦合;
易于扩展与升级。
三、白帽子兵法
1、Secure By Default 原则
1)黑名单、白名单
实际上,“ Secure by Default”原则,也可以归纳为白名单、黑名单的思想。如果更多地使用白名单,那么系统就会变得更安全。
2)最小权限原则
Secure By Default 的另一层含义就是“最小权限原则”。最小权限原则也是安全设计的基本原则之一。最小权限原则要求系统只授予主体必要的权限,而不要过度授权,这样能有效地减少系统、网络、应用、数据库出错的机会。
2、纵深防御原则
纵深防御包含两层含义:首先,要在各个不同层面、不同方面实施安全方案,避免出现疏漏,不同安全方案之间需要相互配合,构成一个整体;其次,要在正确的地方做正确的事情,即:在解决根本问题的地方实施针对性的安全方案。
纵深防御并不是同一个安全方案要做两遍或多遍,而是要从不同的层面、不同的角度对系统做出整体的解决方案。(比如:“木桶理论”)
在常见的入侵案例中,大多数是利用 Web 应用的漏洞,攻击者先获得一个低权限的 webshell,然后通过低权限的 webshell 上传更多的文件,并尝试执行更高权限的系统命令,尝试在服务器上提升权限为 root;接下来攻击者再进一步尝试渗透内网,比如数据库服务器所在的网段。
在这类入侵案例中,如果在攻击过程中的任何一个环节设置有效的防御措施,都有可能导致入侵过程功亏一篑。但是世上没有万能灵药,也没有哪种解决方案能解决所有问题,因此非常有必要将风险分散到系统的各个层面。就入侵的防御来说,我们需要考虑的可能有 Web 应用安全、 OS 系统安全、数据库安全、网络环境安全等。在这些不同层面设计的安全方案,将共同组成整个防御体系,这也就是纵深防御的思想。
纵深防御的第二层含义,是要在正确的地方做正确的事情。 如何理解呢?它要求我们深入理解威胁的本质,从而做出正确的应对措施。
UTM,全称是“统一威胁管理”( Unified Threat Management)。 UTM 几乎集成了所有主流安全产品的功能,比如防火墙、 VPN、反垃圾邮件、 IDS、反病毒等。 UTM 的定位是当中小企业没有精力自己做安全方案时,可以在一定程度上提高安全门槛。但是 UTM 并不是万能药,很多问题并不应该在网络层、网关处解决,所以实际使用时效果未必好,它更多的是给用户买个安心。
3、数据与代码分离原则
这一原则广泛适用于各种由于“注入”而引发安全问题的场景。
在 Web 安全中,由“注入”引起的问题比比皆是,如 XSS、 SQL Injection、 CRLF Injection、X-Path Injection 等。此类问题均可以根据“数据与代码分离原则”设计出真正安全的解决方案,因为这个原则抓住了漏洞形成的本质原因。
4、不可预测性原则
前面介绍的几条原则: Secure By Default,是时刻要牢记的总则;纵深防御,是要更全面、更正确地看待问题;数据与代码分离,是从漏洞成因上看问题;接下来要讲的“不可预测性”原则,则是从克服攻击方法的角度看问题。
微软使用的 ASLR 技术,在较新版本的 Linux 内核中也支持。在 ASLR 的控制下,一个程序每次启动时,其进程的栈基址都不相同,具有一定的随机性,对于攻击者来说,这就是“不可预测性”。
ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。据研究表明ASLR可以有效的降低缓冲区溢出攻击的成功率,如今Linux、FreeBSD、Windows等主流操作系统都已采用了该技术。
不可预测性原则,可以巧妙地用在一些敏感数据上。比如在 CSRF 的防御技术中,通常会使用一个 token 来进行有效防御。这个 token 能成功防御 CSRF,就是因为攻击者在实施 CSRF攻击的过程中,是无法提前预知这个 token 值的,因此要求 token 足够复杂时,不能被攻击者猜测到。(具体细节请参考“跨站点请求伪造”一章。)
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性
不可预测性的实现往往需要用到加密算法、随机数算法、哈希算法,好好使用这条原则,在设计安全方案时往往会事半功倍。