No Patch For Stupid!
在有人参与的情况下,再好的程序都有可能出现各种各样不可预知的情况。在安全领域也普遍认为,最大的漏洞是人!比如管理员的密码可能泄漏等,安全问题往往发生在一些意想不到的地方。
安全是什么?
安全问题的本质是信任的问题。把握信任条件的度,使其恰到好处,是设计安全方案的难点所在。
安全是一个持续的过程
防御技术和攻击技术都在不断发展,两者是相互促进的辩证关系。安全检查应该贯穿于整个软件生命周期中。
安全三要素
安全三要素分别是机密性(Confidentiality)、完整性(Integrity)和可用性(Availability)。
机密性要求包含数据内容不能泄漏,加密是实现机密性要求的常见手段。
完整性要求保护数据内容是完整、没有被篡改的。常见的技术手段是数字签名。
可用性要求保护资源是“随需而得”的。比如拒绝服务攻击(DoS)破坏的就是安全的可用性。
安全评估过程
资产等级划分--威胁分析--风险分析--确认解决方案
互联网安全的核心问题,是数据安全的问题。
资产等级划分就是对数据做等级划分。需要和业务负责人沟通了解最看重的数据是什么。
接下来要划分信任域和信任边界。最简单的例子是,简单网站信任模型,其中最重要的数据放在数据库里,其次是Web服务器(可以读写数据库,并对外提供服务),最外面是不可信任的Internet。
信任域划好后,就需要把所有的威胁找出来。一般采用头脑风暴法,也可以使用威胁建模的方法来避免遗漏。威胁建模的方法,又叫做STRIDE模型,STRIDE是以下6个单词的首字母缩写
Spoofing伪装
Tampering篡改
Repudiation抵赖
InformationDisclosure信息泄漏
Denial of Service拒绝服务
Elevation of Privilege提升权限
风险分析
影响风险高低的因素,除了造成损失的大小外,还需要考虑到发生的可能性。微软提出了一个DREAD模型,它可以更科学得指导我们从哪些方面去判断一个威胁的风险。
设计安全方案
安全评估的产出物是安全解决方案。解决方案要有针对性,基于上述的资产等级划分、威胁分析、风险分析的结果给出的。优秀的安全方案应该具备以下特点:
1)能够有效解决问题
2)用户体验好
3)高性能
4)低耦合
5)易于扩展和升级
设计安全方案的方法
Secure By Default原则
该原则是最基本也是最重要的原则,也可归纳为白名单、黑名单的思想。
在使用白名单时,应避免出现通配符的问题。
最小权限原则
该原则要求系统只授予主体必要的权限,而不过度授权,从而有效减少系统、网络、应用、数据库出错的机会。在使用最小权限原则时,需要认真梳理业务所需要的权限,在了解业务时,多设置一些反问句,来确定业务的最小权限。
纵深防御原则
Defense in Depth(纵深防御)包含两层含义:
1)要在不同层面、不同方面实施安全方案,不同安全方案之间互相配合,构成一个整体;
2)在正确的地方做正确的事情,即在解决根本问题的地方实施针对性的安全方案。
数据与代码分离原则
这一原则广泛适用于各种由于“注入”而引发安全问题的场景。比如XSS,SQL注入、CRLF注入等。
不可预测性原则
让可能被攻击的对象具有一定的随机性,能有效对抗基于篡改、伪造的攻击。不可预测性的实现往往需要用到加密算法、随机数算法、哈希算法,利用好这条原则,往往事半功倍。