在数字经济时代,软件已经成为社会正常运转的基础组件。工业和信息化部(以下简称“工信部”)2021年印发的《“十四五”软件和信息技术服务业发展规划》明确提出,软件是新一代信息技术的灵魂,是数字化经济发展的基础,是制造强国、网络强国、数字中国建设的关键支撑。在数字经济时代背景之下,软件及相关供应链正以各种形式服务于金融、电信、能源、制造、交通、政务等各个重点领域,并越来越深地融入国家重要信息系统与关键基础设施建设。
软件最早诞生于20世纪50年代,早期主要是由使用软件的专业技术人员或特定机构自主开发,基本处于自给自足的情况。彼时软件的通用性非常有限,软件开发也没有可遵循的系统流程,设计过程即开发人员头脑风暴的过程,可参考内容除了源代码之外,没有对应的需求说明、架构设计说明、使用说明等文档。随着软件需求日趋复杂化,软件开发若仍然沿用早期无序的开发方式,不免会出现无法贴合用户需求、软件质量良莠不齐、维护难度高等问题,由此导致软件产品寿命缩短,甚至夭折,使得软件开发活动失败率较高。我们一般称这种由于落后的软件生产方式无法满足日益增长的软件需求而使软件开发与运营过程出现一系列严重问题的现象为“软件危机”(Software Crisis)。
北大西洋公约组织科学委员会(NATO Science Commitiee)于1968年10月7日至11日在联邦德国加尔米施(Garmisch)召开的第一届软件工程会议(Software Engineering Conference)上第一次正式提出“软件危机”的概念,并就如何克服当时的软件危机(即“第一次软件危机”)提出了“软件工程”(Software Engineering)的概念,以期借工程方法解决那次软件危机中存在的一系列问题。
随着相关理论和实践的不断发展,软件工程已经成为覆盖面相当广的综合性学科。一般认为,今天的“软件工程学”主要涉及软件开发技术和软件工程管理两方面内容。而软件开发技术又可细分为软件开发方法学、软件工具和软件工程环境,软件工程管理又可细分为软件工程管理学和软件经济学。其中,软件开发方法学旨在回答软件开发过程中“怎么做”的问题,可以理解为一门专门研究软件开发方法的学问,主要为软件开发提供方法论支撑;软件工具是指向以软件开发方法论为依据的软件开发活动提供半自动化或自动化的支撑工具;软件工程环境是指软件开发过程中所需要搭建的开发框架或平台。在软件工程管理中,软件工程管理学主要是指对软件项目的开发管理,故通常也称软件项目管理;软件经济学则是一门研究软件工程和软件产业关系的学问,主要研究软件工程在经济发展中的作用、软件开发项目的经济效益评价等。
在软件工程中,针对软件危机中的具体问题,将软件开发工作划分为更小的、并行的或连续的步骤或子过程并按照既定安排(即路线图)进行设计改进和产品管理,是解除软件危机进而交付高质量软件产品的重要保障。软件开发中所遵循的路线图又被称为软件开发过程(Software Development Process),或简称为软件过程。
过程是活动的集合,活动是任务的集合。为了获得高质量的软件产品,软件过程要涵盖为达成该目标所需要完成的一系列任务以及完成各项任务的工作步骤。在相关实践中,人们通常以软件开发过程模型(Software Development Process Model,习惯上称为软件开发模型)来描述软件过程。典型的软件开发模型有瀑布式模型、增量模型、基于构件的开发模型等。任何软件开发模型都可以被看作一种软件开发过程、活动和任务的结构框架。因此,换个角度不难发现,软件过程也可以认为是一种软件生命周期。
事实上,软件开发生命周期(Software Development Life Cycle,SDLC,简称“软件生命周期”)指的是软件从产生到消亡的全生命过程。软件生命周期是软件工程中的重要概念,它的提出对软件工程的发展产生了深远影响。伦敦南岸大学教授Geoffrey Elliott认为软件生命周期是最早被确定下来的软件开发方法论。
软件生命周期对软件工程范畴下的软件开发方法论及软件项目管理等的形成和发展均具有重要且深远的指导意义。一般认为,软件生命周期的相关指导意义在于:指导开发人员将具有复杂结构的大规模软件开发项目进行阶段划分,以便明确各阶段的开发目标和分工职责。待每个阶段顺利通过审查才能开启下一个阶段,否则退回到上个阶段直至审查通过。这种方式使得项目易于控制和管理,从而在保质保量的前提下高效地实现软件研发和迭代。
软件生命周期一般划分为6个阶段。
1)问题定义阶段:该阶段需要完成的任务是明确“软件要解决什么问题”。这对于任何项目的启动都是至关重要的,如果不清楚要解决的问题,那么接下来的任何推进将是盲目的。
2)需求分析阶段:该阶段是针对问题定义阶段的结果进行分析,进而明确软件的定位,以及软件需要具备哪些功能。
3)软件设计阶段:该阶段包含总体设计和详细设计两个子阶段。总体设计是指概要地描述该目标软件如何实现;详细设计则是将概要设计中提出的解决方案进一步细化,即该目标软件实现的具体方案。
4)软件开发阶段:也称软件编码阶段,即通过编码完成需求功能的实现。
5)软件测试阶段:该阶段主要包含单元测试、集成测试、系统测试、用户测试等内容,旨在评估软件是否达到预定的标准。
6)运行和维护阶段:该阶段的任务是在软件交付并上线运行后通过一系列维护活动来保证软件产品持久可靠地供用户使用。
除了以上6个阶段的划分以外,在日常软件工程实践中,软件生命周期的阶段划分还可分为5个阶段(后文统称“SDLC 5阶段”),如图1-1所示。
1)软件准备阶段:对应上述软件问题定义及软件设计阶段。
2)软件开发阶段:对应上述软件开发及软件测试阶段。
3)软件部署阶段:为了软件上线运营而进行的相关环境部署和配置阶段。
4)软件运营阶段:对应上述运行和维护阶段,但在此基础上要求运营人员具备更多的业务经营思维,以客户交付价值为导向不断迭代,不仅对软件稳定运行有技术要求,还强调规划管理和持续优化能力。
5)软件废弃阶段:软件下线、消亡阶段。
图1-1 软件生命周期
实际上,这种划分方式不仅更加贴合日常数字化业务的实际运营方式,也更方便理解接下来将要讨论到的SDLC安全挑战及安全活动。
需要指出的是,各种软件开发模型的出现主要是为了解决软件开发质量和开发效率等软件危机问题,并不是针对安全问题,而软件开发过程中的安全挑战事实上覆盖软件生命周期的各个阶段。下面以SDLC 5阶段为例进行说明。
1)软件准备阶段的安全挑战:从广义的角度出发,软件准备阶段的安全挑战不仅包括如何从问题定义、需求分析和软件设计过程中发现风险并通过梳理出的安全需求提出符合要求的安全设计,还包括团队安全意识缺失和安全能力不足。
2)软件开发阶段的安全挑战:在开发阶段,开发团队对软件进行编码、集成以及展开一些针对性的测试。在软件开发阶段,团队主要考虑的是如何实现安全开发,面临的挑战包括如何提高团队的安全开发能力,以及采取什么措施、引入哪些工具来确保开发安全。
3)软件部署阶段的安全挑战:如果软件部署上线后才发现安全漏洞,甚至引发安全事件,相关的漏洞修复和安全事件处置的成本会呈指数级增加。因此,软件部署阶段的安全挑战包括如何在软件上线部署前及时发现任何可能存在的安全隐患。
4)软件运营阶段的安全挑战:软件运营阶段也就是软件发布后用户上线使用的阶段,这通常也是整个软件生命周期中持续时间最长的阶段。即便被认为是“安全”的软件(即经过一系列安全审核和评审后部署上线的软件),在上线后仍然可能爆出新的漏洞,甚至引发安全事件。因此,软件运营阶段的安全挑战包括如何实现对系统的有效监控以及如何有效应对突发安全事件。
5)软件废弃阶段的安全挑战:到了软件废弃阶段,团队主要考虑隐私数据的存毁与合规性等,需要严格依照国家法律法规对服务和数据进行下线和销毁处理,避免产品和用户的敏感数据流入社会。因此,软件废弃阶段的安全挑战包括企业相关制度的缺失和执行落地难等。
透过前面的示例分析,不难发现安全挑战确实广泛存在于软件生命周期的各个阶段。然而,现实的软件开发过程中,开发团队往往不会全面性地考虑到软件安全问题。过去,企业应对安全问题往往是在上线前甚至上线后通过人工渗透测试、自动化安全扫描等方式发现漏洞,然后反馈至开发人员修改。但这种试图毕其功于一役的应急式安全管理带来的问题是显而易见的,具体如下。
1)开发人员修复漏洞的周期长、成本高;
2)问题发现滞后,可能会限于当下技术而搁置安全问题;
3)同样的安全问题频繁出现,安全维护成本居高不下。
面对日新月异的攻击手法和越来越严峻的安全形势,传统的安全防护机制难以建立真正有效的积极防御体系,无法从根本上改善软件产品及上下游供应链的安全现状,还会较大程度影响软件产品的正常交付,导致软件供应商和用户持续遭受不同程度的安全威胁甚至经济损失。因此,软件安全问题不仅成为软件开发过程中的重要问题之一,还是软件供应链安全的核心挑战。