1.3 开发安全现状分析
1.3.1 开发安全概述
国际标准化组织(ISO)定义信息安全是为数据处理系统建立和采取的技术与管理的安全保护。广义上来说,信息安全是指保护资源免受各式各样的威胁、干扰和破坏,从而保证信息的安全性,即保密性、完整性、可用性、可预测性、可靠性和不可否认性等[1]。
1)保密性:保证敏感或私有信息不被未授权人所知悉,对未授权人进行一定的限制访问,以及允许授权人在权限范围内自由访问,确保信息不会因非法泄露而扩散。
2)完整性:在信息传输、存储或处理过程中,保证不破坏、不修改和不丢失信息,以及未经授权信息不可修改等。
3)可用性:保证授权人访问网络和信息系统时的随时可用,而未授权人则无法获取信息或资源。
4)可预测性:软件的运行情况可预测(例如软件输入、运行环境等),软件的功能、属性和行为始终符合预期。
5)可靠性:软件在规定条件和时间下,能完成规定功能。
6)不可否认性:防止所有参与者抵赖曾经完成的操作和承诺。不可否认性与可审计性相对应,为系统中的每项活动、每项变化和每项任务都能够追溯到个人或授权后的行动提供了技术基础。
多年来,网络安全行业主要专注于网络运行安全和网络信息安全。随着软件供应链安全事件频发,软件供应链安全成为业界关注的焦点。假设软件本身是安全的,那么软件的安全控制是只要避免企业和机构在软件运行时发生故障即可。然而,我们在回顾信息系统安全的最佳实践时不难发现:在信息系统中,网络和软件应用都应该是网络安全纵深防御体系的重要组成部分;软件应用作为人们进行信息交互的直接媒介,对信息系统安全的重要性不言而喻。因此,软件安全,尤其是软件应用的安全,应该是信息系统安全的第一步,而不应该是最后一步。这里需要明确的一点是,只有解决软件安全本质问题——代码安全问题,我们才能真正解决信息系统中的网络安全问题。
在软件生命周期方法论建立后,人们认识到软件安全同软件产品的质量属性一样,也需要重视软件生命周期中的各个阶段并提出相应对策,而且越早采取有力措施,后期相关问题的弥补成本越低。因此,人们开始关注软件生命周期中各个阶段的安全,并逐步将安全属性纳入软件生命周期方法论的考量与研究中。
对于软件安全与软件生命周期安全之间关系的理解,为了便于讨论,我们引入了“开发安全”这一概念。对于软件安全来说,广义的“开发安全”是指软件生命周期的安全,即对软件在准备、开发、部署、运营、废弃等阶段进行安全管理,以提升各阶段的安全性,最终实现软件系统安全。狭义的“开发安全”是指仅在开发阶段的安全。在本书中,如无特别注明,提及的“开发安全”则主要是指软件生命周期中涉及软件开发的安全。
谈到“开发安全”,这里有必要再简单介绍一下业界经常提及的几个概念。
1)SDL(Security Development Lifecycle,软件安全开发周期),最早是由微软提出的一种从安全角度出发为软件开发过程管理提供指导建议的实践模型。严格来说,SDL最初的含义仅限于是一种软件安全开发管理模型。然而,随着SDL模型在实践中的推广和改进,以及人们对开发安全的认知加深,从更广泛的意义上来看,SDL已经超出它原有的含义,泛指包括SDL模型、SDL相关的软件安全开发管理模式实践以及由它们延伸出来的软件安全开发方法论等的一种传统安全开发框架。SDL作为一种新的软件安全开发方法论被讨论时,对于业界开展软件安全开发实践、践行开发安全从文化到组织团队、流程管控、技术工具等有着全方位的指导意义。
2)S-SDLC(Secure Software Development Life Cycle)按照字面意思可以理解为安全的SDLC,具体来说是一套将安全活动内建到软件生命周期的各个阶段的安全工程方法。S-SDLC的理念源于微软SDL(即MSSDL)。广义的S-SDLC指包括微软SDL在内的基于安全软件生命周期的安全开发方法,狭义上的S-SDLC则具体指软件安全开发生命周期的研究和实践项目,相当于对早期的微软SDL模型的发展和延伸。事实上,在大多数软件安全开发实践中,开发者仍会将微软SDL体系作为指导安全开发的首选,而将S-SDLC作为学术研究和探索。
[1] 引自《ISO/IEC 27000:2018术语与定义》。