一、什么是安全?
笔者在上大学之前就有听过“黑客”这个神乎其神的名字(那时候还不知道黑帽子对应的白帽子),觉得黑客就是一群很牛逼的人,可以通过电脑上天入地,在如今互联网的时代,拿到任何他想拿到的东西。包括看到的各种科幻类电影,比如最为经典的黑客帝国,当时为之震撼。还有前段时间看的-我是谁:没有绝对安全的系统。觉得这些人真的好厉害,如果我们有这种技术就好了,肯定就很炫酷。 前者这个电影呢,让我感受到了黑客技术的牛逼之处,后者呢,让我思考,我认为最厉害的安全攻击应该是社会工程攻击。笔者认为黑客技术是处于一种初级或者中级的攻击手段(在此澄清,并没有贬低之意,我深知,技术牛是真的牛),那么再往上层走,就应该是基于社会工程的攻击。因为只要人的心理一旦被攻破,那什么都会暴露出来。然而事实上,在安全里面,技术类的攻击和社会工程类的攻击是应该相融合在一起的。
我看安全
前文说了那么多废话,那么安全是什么呢?什么样的情况下会产生安全问题?我们要如何去看待安全问题?
可能大家都看过小说,那么在武侠小说中,一个真正的高手,对武功都有着最透彻、最本质的理解,比如什么剑术高手啊,都说什么人剑合一,天下无敌。那么怎么才能人剑合一呢,就是要彻底的理解剑术,搞清楚其本质。正所谓天下武功万变不离其宗,当搞清了事物发展的原理即其本质,在遇到其他武功之后也能触类旁推,应对自如。安全亦是如此。
安全的本质
那么一个安全问题是怎么产生的呢? 在现实生活中,大家都亲身经历过,比如坐火车、飞机,包括参加一些重要的会议入场啊都要过安检,会检查我们的行李,包括身上携带的东西,有没有违禁的。如果有,将会对我们进行拦截。为什么会这样做呢?因为火车、飞机、会议场所是一个相对特殊的,敏感的,重要的场所,有别于外部空间,只要是有对这一场所有威胁甚至危害的都应该被拦截下来,以保证他们空间的安全。所以说这些安全检查是有必要的。那么放在咱们的网络上呢,也是同样的道理。这种检查机制就叫做过滤,根据事前配置的规则,放行符合条件的,拦截不符合的。这就将不同的区域,以过滤的方式,抽象的划分了出来。
通过安全检查机制,可以过滤掉未知的东西,使其进入的变为信任区域。那么这个内部空间就称之为信任域,相对的外部空间就是未知域即不信任区域。那么这个边界,就称之为信任边界。而且,这个信任域等级会随着区域重要等级的提升而提升,数据从高等级的信任域流向低等级的信任域是不需要进行安全检查的,相反则需要经过信任边界的安全检查。 所以,安全问题的本质是信任的问题。
一切的针对安全防范的的方案的设计,都是建立在信任的关系之上。我们首先必须信任一个东西,安全方案才得以成立。如果我们否定一切,那么将无法设计。举个例子:假设我们有份机密文件需要保管起来,其中最常用的方法是将它锁在柜子里。那么这个问题就包含了几个安全假设。a:制作柜子的工匠是信任的,他没有私自在柜子里安装后门;b:制作这把锁的工匠是可以信任的,他没有克隆钥匙;c:钥匙保管的地方是可以信任的。这三个条件,如果都不信任,那么这份文件就不可能是安全的。
那么还有一个问题就是把握信任条件的度,使其恰到好处。这也是设计安全方案的难点所在。即根据威胁程度对信任条件进行排名。就好比上文这个机密文件的保存。有三个条件,首先对于安装后门这个,可以从外观上可以检测出来有没有后门,相对来说威胁要小一点,但是不排除检测不出来。对于钥匙的保管,人的主观方面有很大因素,所以相对威胁也较小。那么对于钥匙克隆来说,这种不容易被发现,也容易入侵,所以她的威胁在三个条件里面是最高的。相对的,信任度的检查也应该占大比重。
安全是个麻烦
大家都知道,如今互联网技术发展迅速,安全问题也在发展中暴露出来。在安全问题上,不乏简单粗暴的认为就是攻击和防御,矛与盾的关系。在某一时期,可能某一方占了上风;但也许下一个时期,另外一方就会碾压对方。从宏观来看,在某一时期的攻击和防御技术,都不可能永远有效,永远的用下去。科技在变革,技术在更新。这就是发展所带来的问题。当然,也正是因为发展,才促成了两者相辅相成,互相促进的辩证关系。所以说安全是个麻烦的东西,它总是在变化。
安全三要素(CIA)
机密性:
要求保护数据内容不能泄露,加密是实现机密性的常见手段。
完整性:
要求保护的数据内容是完整的、没有被篡改的。常见的保证一致性的技术手段是数字签名。
可能性:
要求保护资源是“随需而得”
二、如何实施安全评估
资产等级划分
这是所有工作的基础,它能帮助我们明确目标是什么,要保护什么。互联网安全的核心问题,是数据安全的问题。所以,我们要对公司的资产数据进行等级的划分。有的公司关心员工数据,有的关系客户数据,根据公司业务的不同,侧重点也有不同。做资产等级的划分,需要同各个业务部门的负责人进行沟通,了解清楚什么对他们来说才重要,他们所看重的数据是什么。然后根据不同的数据的重要程度,为后续的安全评估指明反向。
当完成资产等级划分后,接下来就是划分信任域和信任边界了。一个最简单的划分方式:重要的数据在数据库,将数据库服务器圈起来;web应用可以从数据库中读写数据,对外提供服务,再把web应用圈起来;最外面的就是不可信任的internet。实际情况更为复杂。
威胁分析
在安全领域中我们把可能造成危害的来源称为威胁,把可能会出现的损失称为风险。风险一定是和损失联系在一起的。什么是威胁分析?就是把所有的威胁都找出来。一般是采取头脑风暴,但是会有遗漏。所以科学的方法是使用一个模型,称之为威胁建模。比如:STRIDE
在威胁分析的时候,安全漏洞的方面一定要尽可能的全面。威胁分析跟前面提到的信任度相似,也有高低之分,需要根据实际情况对威胁进行分析排名,制定方案。
风险分析
风险的高低直接影响损失的大小,要考虑到发生的可能性。
DREAD模型指导我们从哪些方面去判断一个威胁的风险程度。
设计安全方案
安全评估的产品,就是安全解决方案。解决方案一定要有针对性,这个针对性是由资产等级划分、威胁分析、风险分析等阶段的结果给出的。
安全也是产品的一种属性,一个从未考虑过安全的产品,至少是不完整的。
对于互联网来说,安全是要为产品的发展保驾护航的。我们不能用简单粗暴的安全方案去阻碍产品的正常发展,所以应该形成这样一种观点:没有不安全的业务,只有不安全的实现方式。作为安全工程师,思考的是:如何通过简单而有效的方案,解决遇到的安全问题,能够抵御威胁,同时不能过多的干涉正常的业务流程,在性能上不能拖后腿。好的方案对用户应该是透明的,尽可能地不改变用户的使用习惯,还要易于持续的改进扩展。
一个优秀的安全方案应该具备以下特点:
a:能够有效解决问题
b:用户体验好
c:高性能
d:低耦合
e:易于扩展和升级
三、安全方案设计原则
在安全方案中,最重要的是“”“secure by default”。可以归纳为白名单、黑名单的思想。
黑白名单
白名单即只允许白名单中规定的应用访问,其他的一律拒绝。比如,在制定防火墙网络访问控制策略时,如果网站只提供web服务,那么正确的做法就是只允许网站服务器的80和443端口对外提供服务,屏蔽其他的端口。
黑名单即拒绝黑名单中的应用访问,其他没在名单中的默认都可以访问。在实际项目中,黑名单的方式可能会出现问题。假设黑名单的策略是不允许ssh端口对internet开放,那么就要审计ssh默认端口:22端口是否开放了internet。但在实际工作中,可能会存在工程师私自改变了ssh的监听端口,比如讲22改成2222,那么这就绕过了安全策略。
总的来说,基于黑白名单的思想,白名单是比黑名单更为安全的策略。但是设置了白名单也并不一定就安全了。前文提到,安全的本质是信任问题,处在白名单中的都将被认为是信任的,认为是好的安全的。那么一旦这个信任的基础不在了,安全的城墙当然也就随之崩塌了。
最小权限原则
最小权限原则也是安全设计的基本原则之一。secure by default的另一层含义就是“最小权限原则”。最小权限原则要求系统只给予主题必要的权限,而不要过度授权,这样就能够有效的减少系统、网络、应用、数据库的出错的机会。
比如在linux中一个良好的习惯就是用普通用户登录,在需要执行root权限的时候,再使用sudo命令完成。在使用最小权限的原则的时候,需要认真梳理业务所需要的权限,我们可以通过访谈了解业务,设置一些反问句来了解确定业务所需要的最小权限。比如您确定您的程序一定需要访问internet吗?
纵深防御原则
纵深防御包含两层含义:首先在各个不同层面不同方面实施安全方案,避免出现疏漏,不同的安全方案之间相互配合,构成一个整体。 其次要在正确的地方做正确的事情即在解决根本问题的地方实施针对性的安全方案。
纵深防御方案不是同一个方案做多遍,而是要从不同的层面。不同的角度对系统 做出整体的解决方案。 木桶效应告诉我们,整体的容量取决于最短的的那块木板。安全设计也是如此,我们要找到那块最短的板子,设计针对性的方案,让它与其他各块完美的融合在一起。
纵深防御第二层含义就是要在正确的地方做正确的事。这要求我们深入理解威胁的本质,从而做出正确的应对措施。
数据与代码分离原则
数据与代码分离是安全原则非常重要的原则。这一原则广泛的适用于“注入”而引发安全问题的场景。实际上缓冲区溢出也可以认为是程序违背了这一原则,程序在栈或者堆中,将用户数据当做代码执行,混淆了代码与数据的边界,从而导致安全问题的发生。再比如web安全中xss、sql注入、crlf注入等,都可以根据数据与代码分离原则设计出真正安全的解决方案。
不可预测原则
secure by default是要时刻牢记的总则;纵深防御是要更全面更正确的看待问题;数据与代码分离则是从漏洞成因上看问题。那么不可预测性则是从克服攻击方法的角度看问题。
当然,任何软件都不可能没有漏洞。那么针对无法修复的漏洞该怎样去防御呢? 可以让漏洞的攻击方法失效。 比如缓冲区溢出攻击,可以使用dep来保证堆栈不可执行,使用aslr让进程的栈基址随机变化,从而施工及程序无法准确的猜测到内存地址,大大提高了攻击的门槛。不可预测性能有效地对抗基于篡改、伪造的攻击。
最后引用道哥一句话收尾——安全是一门朴素的学问,也是一种平衡的艺术。
参考文献《白帽子讲web安全》