中国领先的IT技术网站
|
|

1.2 软件安全和软件开发生命周期

《软件安全:从源头开始》本书阐述什么是人类可控制管理的安全软件开发过程,书中给出一种基于经验的方法,来构建最好用的安全软件开发模型,以应对安全问题。本节为大家介绍软件安全和软件开发生命周期。

作者:丁丽萍 等译来源:机械工业出版社|2016-09-22 15:21

Tech Neo技术沙龙 | 11月25号,九州云/ZStack与您一起探讨云时代网络边界管理实践


1.2 软件安全和软件开发生命周期

多年来,安全业界对于软件安全和应用安全存在着一个严重的误解。Gary McGraw提供了关于两者之间差异的一个清晰描述:

一方面,软件安全是关于构建安全软件的:将软件设计成安全的;确保软件是安全的;培训软件开发人员、架构师和用户如何构建安全到软件中。另一方面,应用程序安全是关于保护软件和该软件发布后运行的系统,当且仅当开发完成后。[15]

从第一个大规模针对软件的攻击开始,到20世纪80年代后期,软件安全已经走过了漫长的道路。当时软件并没有过多地考虑安全问题(如UNIX代码、TCP/IP协议栈)。随着微软Windows以及网页(Web)的出现,攻击开始变得复杂和频繁,因此软件的安全性才逐渐得到重视。工业界开始通过各种辅助手段短期修复安全问题。这些因素推动了杀毒软件、防火墙、反间谍软件的出现。然而,真正的问题—代码是如何开发和编写的—并没有得到重视。这个问题直到最近十年来出现了SDL实践才得到重视。许多企业(如微软)由于软件安全缺陷的影响开始意识到通过改善软件开发实践,以确保安全的软件代码的重要性。这导致学术界和软件巨头都推荐SDL实践,如微软等。现在我们有理论和指导原则来帮助我们从软件开发一开始就构建安全的代码,从而降低出现可能被攻击者利用的软件漏洞的可能性。

机密性、完整性和可用性是业界认为在任何软件安全开发过程中最重要的三个主要目标。开发人员保护、增强、确保这些主要目标满足安全代码定义的“高可信度”部分。开发人员能够编写非常高效的代码,这些代码易于维护并可复用。然而,如果该代码允许未经授权的用户访问应用程序的资源,那么无论该代码是否被披露,都没有第二次机会来修复它。

SDL不应该与标准软件开发生命周期混淆。顾名思义,SDL方法的真正目的是开发安全的软件,不一定是高质量的软件。正如IT维基百科定义的,“安全开发生命周期是一个软件开发过程,用来降低软件维护成本,提高软件的可靠性(涉及与bug相关的软件安全)”。[16] 2002年1月,微软的许多软件开发团队使用“安全推”(security push)来改进现有的安全代码。在这个方法的指导下,可信赖计算(Trustworthy Computing, TwC)团队形成了微软安全开发生命周期(Microsoft Security Development Lifecycle)。2004年,微软SDL作为强制策略成为微软软件开发过程中的一个组成部分。[17]后来SDL这一术语也被其他软件公司使用,随着时间推移,SDL既代表微软开发过程的一个组成部分,也代表前面提到的IT维基百科定义的开发过程。在本书中使用的术语SDL表示一个安全的开发过程,由以下几个方面组成:基于比较研究微软SDL的软件安全最佳实践,从2004年开始开发的替代模型,作者的经验以及对最前沿开发组织的研究有效和无效的工作,商业上对软件开发的苛刻需求再加上不断增长的需求,以在源头通过相关的、划算的和现实的软件安全实践确保代码安全。

SDL的目标是双重的:第一个目标是减少安全漏洞和隐私问题的数量;第二个目标是减轻遗留漏洞的严重性。有行业标准定义在软件开发中需要做些什么,比如ISO/IEEE定义了面向软件工程的传统软件开发方法的主要阶段。SDL的元素通常适应性很强,很容易纳入组织的标准开发生命周期中。

静态分析和威胁建模是用于开发安全代码的工具。静态分析工具使用类似于病毒检查程序的方式,寻找代码中一组固定的模式或者规则。由于这类工具是基于定义好的规则工作的,它永远无法找到规则以外的问题,因此高级的静态分析工具允许将新的规则加入到规则库中。静态分析工具最大的好处是有能力自动识别许多常见的编码问题。但是,开发者错误带来的bug往往只是问题的一部分。静态分析工具无法评估设计和架构的缺陷。它们不能识别设计不当的加密库或者选择不当的算法,也不能指出可能会导致身份验证和授权混乱的设计问题。它们也不能识别内嵌在代码中密码或幻数。但是,静态分析工具可以比动态分析窥探到程序更多的阴暗角落,因为后者需要实际地运行代码。静态分析同样具备在软件达到完成程度前,就执行有效测试的潜质。在软件开发生命周期中,越早发现并管理安全风险越好。

虽然这些SDL实践在理论上已经很好了,但是当应用到企业中时,结果有好有坏。导致这一现状有多种原因。用SDL实践管理软件开发生命周期的历史并不长,因此未使用这一方法编写的(可能存在风险的)代码在软件行业的代码库中依旧占有很大比重,想要回溯并以SDL实践方法将这些代码再开发一遍是很困难的。软件外包和海外代工是另一个导致SDL很难有效落实的原因。软件开发人员往往在时间非常紧迫的情况下进行开发,导致软件的安全性被抛到脑后。在缺乏有效管理SDL实践的快速开发环境下,往往最后才考虑安全问题。

尽管一些安全实践对于软件和应用程序安全来说是通用的,比如渗透测试、源代码扫描以及安全教育,但有一个东西是任何方法都无法替代的,这就是人。这个过程中,人的因素是最关键的,成功的软件开发过程需要经验丰富的软件安全架构师和工程师。威胁建模需要应用最小授权策略和纵深防御策略,是软件开发生命周期中最为重要且任何工具都无法替代人工来完成的工作。必须收集一个系统的真正安全需求,并考虑合规性、安全性问题、合同要求、应用程序能够处理什么样的数据以及业务风险。

培训是以人为关键元素的SDL活动。培训有助于降低安全成本,一个好的培训方案能够促使开发团队减少软件中出现的安全问题,更高效、更划算地完成开发任务。应当强调的是,软件的安全问题不是通过某一个方法可以解决的;而是通过以人为核心,融合了管理流程和技术手段,具有整体性和纵深性的系统性方法解决的。尽管工具可以比人工更快地对大量代码进行安全性分析,但它依旧无法取代人工的作用。在可预见的未来,软件安全依然被认为是一门艺术,可以通过技术和管理流程两方面进行考量,软件安全并不是不可企及的神话,而是可以通过有经验的软件安全架构师和工程师传授。团队中有一些具有丰富经验、可以在整个开发过程中以攻击者的角度考虑问题的员工是SDL成功的关键因素。有些SDL实践者将代码安全的最佳实践和安全设计原则分开考虑;本书中,我们将它们放在一起,由经验丰富的软件安全架构师和工程师来完成这些工作。

软件的安全性并不能通过传统的软件开发管理流程得到实现,即使是那些有高质量代码开发传统的开发小组也无法不通过努力就自然而然地实现这一目标;软件安全性,应该是衡量软件代码成熟度的一个关键因素,需要集中力量专门地对待。如本书所述,安全的代码并不一定意味着高质量的代码,高质量的代码也并不一定意味着安全的代码,软件应用程序开发应该基于包含代码高质量和代码安全性的共同最佳实践。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢
24H热文
一周话题
本月最赞

读 书 +更多

数据库系统概念

本书是数据库系统方面的经典教材之一。国际上许多著名大学包括斯坦福大学、耶鲁大学、得克萨斯大学、康奈尔大学、伊利诺伊大学、印度理工学...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× CTO训练营(深圳站)