1.1 编写背景
从20世纪50年代世界上第一台电子计算机诞生以来,计算机技术发展十分迅速,并且广泛应用于生产、科研和社会生活的各个领域。伴随着计算机的广泛应用,计算机软件在计算机系统中的地位越来越重要。人们需要的软件越来越多,而且趋向大型化和复杂化,使软件开发变得越来越复杂,从而产生了所谓的“软件危机”,即软件开发从质量、效率等方面均不能满足应用需求。为确保能够快速、高效地研发出满足需求且高质量的软件,软件工程技术随之出现,并日趋成熟和完善。至此,软件开发开始从“艺术”“技巧”向“工程”“群体协同工作”转化。
软件工程(Software Engineering)是应用计算机科学理论和技术,以及工程管理原则和方法,按照预算和进度实现满足用户要求的软件产品的定义、开发、发布和维护的工程或以之为研究对象的学科。
软件工程的基本目标是生产具有正确性、可用性及合算性的产品。正确性是指软件产品达到预期功能的程度;可用性是指软件基本结构、实现及文档达到用户可用的程度;合算性是指软件开发、运行的整个开销用户可承担。
为实现上述目标,软件工程涵盖了软件需求、设计、编码、测试和维护所需的知识、方法和工具。它不局限于理论,更强调开发实践,能够指导开发团队运用有限的资源,按照既定的软件工程规范,通过一系列可复用的、有效的方法,在规定的时间内实现预先设定的目标。
在软件工程中,有一项重要的工作就是确保软件质量,以解决软件开发速度慢、软件不可靠、维护困难、可复用性低等问题。软件质量主要保证软件与预定义的显式需求和隐式需求相一致。显式需求是指用户在软件产品创建之前就可以清晰地向开发者表达的要求。隐式需求是指用户在软件系统创建之前无法清晰地表达,但在软件系统使用后必须实现的要求。例如,在市场买一部智能手机,对于手机的通话功能、App管理功能、上网功能的要求是显式需求,但是对于手机是否会黑屏、是否容易死机等特性的要求则是隐式需求。隐式需求被默认为是产品必须满足的需求。
成功的软件必须满足显式和隐式的各种需求。而软件产品为满足显式及隐式需求所具备的要素称为质量。质量是一个过于宏观的概念,无法进行管理,所以人们通常会选用软件的某些质量要素进行量化处理,建立质量特征,这些特征称为质量属性(Quality Attribute)。
这些属性包括功能性、可靠性、易用性、效率、可维护性、可移植性等。其中每个属性还包含一些子属性,例如,功能性包括完备性、正确性、兼容性和互操作性等。
除软件产品自身的质量外,软件过程的质量也是开发者需要关注的要素,因为软件过程的质量能够反映软件产品的质量。一方面,软件开发过程是不可见的;另一方面,越早发现缺陷,修复的成本越低。所以对软件质量的保障活动要贯穿于软件的整个开发过程。
软件质量保障(Software Quality Assurance,SQA)要求在项目启动时,就要进行质量保障计划,明确需要执行的质量保障活动。在软件开发过程中,要监控和执行质量保障计划,在开发活动到达一个里程碑时,要及时根据质量保障计划进行质量验证。
通过不断完善软件质量保障措施,有效地提高了软件产品的质量,确保软件行业持续健康发展,使软件应用的领域和规模日趋扩大。然而,到了20世纪90年代,随着计算机网络的广泛使用,软件工程又面临着新的挑战。由于软件本身在设计或实现过程中可能存在一些漏洞,在隔离的运行环境中,这些漏洞通常不会暴露给外部攻击者,因此造成的风险较低。而在因特网这种开放的环境下,软件产品一旦存在可被利用的漏洞,则这些漏洞就会完全暴露给所有的网络攻击者,由于攻击者可以主动发起攻击行为,且攻击的方式、攻击的对象也多种多样,因此,如果仅依赖传统的软件质量保障措施,将不能实现预期的质量目标。于是,软件安全需求应运而生。
软件安全(Software Security)是指将开发的软件存在的风险控制在可接受的水平,以保证软件的正常运行。由于软件的开发、集成和维护日益复杂,与此同时,软件安全相关的研究还远未成熟,软件存在漏洞无法避免,而这些漏洞可能被攻击者利用,以破坏软件的安全性,或迫使软件运行到不安全的状态。因此,软件很容易成为攻击者的攻击目标,软件安全需求越来越迫切。
软件安全是一个相对较新的领域,直到2001年才出现了软件安全方面的著作及学术课程,这说明开发人员、软件架构师、计算机科学家直到近20年才开始系统地思考如何构建安全的软件。McCraw博士提出“使安全成为软件开发的必需部分(Build Security In,BSI)”的观点,已经得到业界和政府机构的认同。
为确保软件的安全性,需要采用系统化、规范化和数量化的方法来指导软件的开发活动,而这些开发活动的集合就是软件安全保障。软件安全保障是指确保软件能够按照开发者的预期,提供与威胁相适应的安全能力,从而维护软件自身的安全属性,避免存在可以被利用的安全漏洞,并且能从被入侵和失败的状态中恢复。
软件安全保障的目标是使软件可以规避安全漏洞,按照预期的方式执行其功能,以增强开发者和使用者的信心,这种信心依赖于开发者能够提供的所采取的安全技术证据的“数量”。由于信息系统所承载业务的风险在很大程度上与软件安全息息相关,软件安全保障已经成为当前信息安全需要解决的关键问题。
有一个与软件保障相关的术语称为“信息保障”,是指访问信息的能力及保证信息的安全性。信息保障和软件安全保障的不同之处在于,信息保障关注对信息的威胁及保护信息的技术,而软件安全保障则关注软件需求的正确性、完整性和一致性,以及这些需求的实现机制。