微软发布安全开发周期流程能否拥抱敏捷?

近日,微软发布了《安全开发周期(Security Development Lifecycle,下文简称SDL)流程指南4.1a》, 以指导开发团队将安全需求无缝地引入到软件开发过程之中。SDL是微软内部全公司软件项目强制使用的安全流程,并在众多旗舰级产品得到应用。鉴于敏捷方法 在社区和微软内部的广泛应用,此次发布的指南专门列出了一章讲解如何将SDL与敏捷方法集成。由于SDL一贯应用在微软内部的传统瀑布式开发方法之上,所 以此次发布引发了社区的激烈讨论。

为了响应对软件安全性的要求,微软根据微软内部的软件开发流程定义了安全开发周期流程(SDL),以指导开发团队将安全需求无缝地引入到软件开发过程之中,其目标是:

使设计、代码和文档中与安全相关的漏洞减到最少,在软件开发的生命周期中尽可能早地清除漏洞。

SDL针对整个软件开发流程——从软件开发的开始阶段到整个开发周期结束——定义了每个开发阶段的安全需求和实施措施,来达到最终软件的安全性和保密性。SDL的完整生命周期分为五个阶段——需求定义、设计、实现、验证和发布,再加上前期的团队培训和后期的响应。SDL在每个阶段都定义了相应的安全任务,指明了团队需要分别关注的安全问题,比如在设计阶段对安全威胁进行建模(Threat Modeling)。团队通过在软件开发过程中相应地采纳这些改进,最终减少软件中的缺陷漏洞,改善软件安全特性。经典的SDL流程如下图所示:

图1 SDL与传统瀑布开发方法的结合

自从2004年起,SDL就是微软内部全公司软件项目强制使用的安全流程,并且在众多旗舰级产品,比如Vista和SQL Server等软件的开发过程中,都得到了广泛的应用。随着敏捷方法在软件开发社区以及微软内部广泛受到拥蹙,SDL 4.1a专门列出了一章分析如何裁剪SDL,使之能与轻量的敏捷软件开发方法结合在一起使用,其出发点是:

以一种同时保障敏捷方法和SDL流程原则的方法,把经受考验的微软安全性开发周期(SDL)方法与敏捷方法学结合在一起。

为了能在敏捷方法中顺利采纳SDL流程,SDL指出了两个必要的调整:

  1. 纳入敏捷开发流程的SDL必须足够精益。这意味着对于每个特性,开发团队只是完成足够的SDL工作即可。
  2. 与传统瀑布型开发方法吻合很好的SDL中各个阶段(设计、实现、验证和发布)与敏捷方法并不吻合,必须采用更敏捷的方式。

对于SDL与敏捷方法结合,最大的问题是敏捷发布周期可能短到一周,团队在每次发布之中实施完整的SDL需求显然时间不够。但是,它也不是“不可能完成的任务”:

  • SDL定义了一系列的安全任务,这些任务可以很好地嵌入到敏捷开发流程里面
  • 相对而言,SDL文档量很少,除了安全威胁模型可能产生一定的文档

接下来,SDL以敏捷方法族中的Scrum为例,介绍了如何将SDL定义的任务与Scrum中的Sprint结合在一起。开发团队可以将SDL任务划为不同的特征,然后作为非功能性需求添加到Sprint backlog里面。结合Scrum和SDL的各自特点,SDL将包含的任务划分为三类:

  1. 每次Sprint都必须执行的需求
    最关键的一部分安全性需求,必须在每次Sprint里面都执行检查,比如不要使用被禁止的API等等
  2. 桶内需求(bucket )
    这些需求仍然需要定期地执行,但不需要每次Sprint里面都执行
  3. 一次性需求
    这些需求只需要在整个项目开发过程执行一次即可

如此之后,SDL任务在整个Scrum流程中的分布示意图如下:

图2 SDL-Scrum结合后的示意图

随后,SDL-Agile介绍了将SDL任务应用到每个Sprint里面的具体实践:其中包括对团队成员安全知识培训,引入并熟悉工具等等。特别指出的是,因为安全威胁建模(threat modeling)在传统的SDL中是主要的产出物来源,同时又是每个项目必须采取的安全性检查,SDL专门介绍了如何将敏捷开发方法与安全威胁建模流程结合在一起。最后,SDL-Agile通过一个小例子介绍了在Scrum项目Sprint的具体开发里面,开发团队如何计划、完成SDL任务,以及SDL 如何帮助团队改善产品的安全特性。

在SDL 4.2指南发布之后,社区里面也是传来不少声音。如Jon Oltsik认为:这次发布非常重要,因为:

  1. 敏捷开发方法被广泛应用。微软也在内部使用,因此将敏捷与SDL结合起来是一项非常重要的企业目标。
  2. 软件安全性普遍很差 —— 特别是一些web应用系统。
  3. 软件安全性在很多网络安全改进计划中,比如由SAIC和SAFECode.org研究并提出的Cyber Supply Chain Assurance Model等都是处于核心位置。

虽然指南中给出了一个Scrum团队拥抱SDL的例子,但也有一些人士对该指南仍然抱有一些疑虑,David West就指出

这里要解决的问题还包括谁来负责(SDL与敏捷方法结合的)工作。......该工作的复杂性会导致一些任务被分解成一部分使用敏捷开发,一部分使用传统方法进行开发。这样,专家需要既驱动传统开发和测试,同时又指导团队进行敏捷方法的开发和测试。

Rex Black也提出:

SDL里面的一些实践,比如使风险文档流线化和风险分析流程等等对SDL进入“真实的敏捷世界”可能会挑战重重...这些出现在SDL实践实施到敏捷开发方法过程中的挑战对于最终的采纳会是一个显著的障碍。

当然,有人也从4.2指南之中闻出了不同的味道,Sean Michael Kerner指出:

对我而言,如果说微软没有敏捷开发方法的安全实践,那实在是有些奇怪。同时也说明,大型项目,如windows或者office办公软件等并没有采用敏捷方法。
……微软看上去现在前进得越来越快,这样他们能拥抱开源社区开发者们一直所知道的一切。快速编码迭代可以引向更好的软件。而且,没错,它也能同样安全。

亲爱的读者,您可以从这里下载该《安全性开发周期(SDL)流程指南4.1a》。您是如何看SDL-Agile呢?您觉得敏捷和安全特性是冲突的吗?如果不是,您在实际项目上又是如何做到两者结合的呢?留下您的意见,跟大家一起分享吧。

你可能感兴趣的:(微软发布安全开发周期流程能否拥抱敏捷?)