来源:时刻头条
百度、腾讯、小米、OPPO……似乎今年谈起开发安全,不说自己从传统SDL转型到DevSecOps就不能称为创新。
的确,DevSecOps越来越受到周期短、迭代快的互联网业务的欢迎,也成为安全界的流行趋势。但在笔者看来,“一个好、另一个不好”的思想是不成熟的。软件开发过程的目标是多样性的,有些是质量、人员效率优先,有些是速度优先,也有些是安全优先,由此可见目标决定过程。因此,需要根据不同的目标来有机整合相关的实践以实现目标。
作为专业人员,我们必须从更高阶与成熟的软件工程管理角度考虑如何做好软件安全开发。国际标准最广泛采用的基于WSR软系统工程方法论告诉我们:要解决组织的问题需要基于战略方向,从人、流程、技术与工具、方法等多个维度系统化思考。工具很重要,但也不是解决问题的万能药,用什么工具,不是看是不是技术先进,而是在战略指导下,从成本效益角度综合考虑的结果。
SDL与DevSecOps对比又进入了历史误区
“DevSecOps”被评为年度网络安全行业热点词汇,然而历史似乎总在重演。正如当年在软件工程领域爆发“CMMI与敏捷开发”的争论一样,现在安全领域出现了类似的争议。
现在网络上很多文章,开始宣传DevSecOps优于SDL,甚至出现SDL已死的论调。其实SDL是一种安全开发模型,其对应的所谓实践,实际就是模型的要求,用什么方法满足这个要求,组织可以根据具体情况决定,SDL目前实际已经涵盖DevSecOps。而DevOps是软件敏捷开发方法的发展,DevSecOps是基于DevOps的软件安全开发方法。因此,如果作类比,SDL相当于CMMI,而DevSecOps相当于敏捷开发方法,总而言之:
SDL是一种模型,DevSecOps是一种具体的方法,两者相辅相成,一起进步,而不是对立的;
SDL本身也在演进中,并已经涵盖了DevSecOps方法;
解决安全运维一体化的并非只有DevSecOps一种选择,S-SDLC也行;
DevSecOps与传统瀑布模式的S-SDLC方法相比,也没有优劣之说,只是解决问题场景不同,DevSecOps也不能替代瀑布式S-SDLC。
从软件工程学的角度看软件安全开发
软件安全开发的本质目标,是开发出安全的软件。“安全”即保密性、可用性、完整性。基于软件工程管理“过程控制、预防为主”的原则,应该在软件开发过程中内建,而不是“亡羊补牢”:先开发、再检验、最后修补。
根据《GB/T-软件工程术语》的定义,“软件开发过程(2.)”是把用户要求转化为软件产品的过程,此过程包括:把用户要求转换为软件需求,把软件需求转化为设计,用代码来实现设计,对代码进行测试,有时包括安装和验收。因此,软件开发生命周期(SDLC)通常定义为:需求、设计、实现、验证、发布、运维6个生命周期阶段。
软件开发的过程阶段可以遵循不同的“软件开发生命周期模型”,也被称为“软件开发过程模型”。每个过程模型都遵循其在软件开发生命周期所独有的一系列阶段,以确保软件开发成功。不同的软件开发生命周期类型,本质是为了应对不同问题域。目前行业最主流的SDLC是瀑布与敏捷,而选择哪一种SDLC开发软件,需要根据不同场景的特征。见下表。
为了实现软件的安全特性,需要在软件开发生命周期的各阶段融入安全实践过程,以保障开发过程能产出安全的软件,也就构成了安全软件开发生命周期S-SDLC。因此,在瀑布型SDLC或敏捷型SDLC融入相应的安全实践过程就可以衍生出安全的瀑布开发生命周期与安全的敏捷开发生命周期。因此,S-SDLC实际是泛指安全软件开发生命周期,可以是瀑布模式,也可以是敏捷模式。
SDL的诞生和演进
微软在21世纪初期的软件产品开发实践中,就意识到无法通过技术层面彻底解决软件面临的安全风险。因此,微软尝试从流程和管理的角度解决这个问题,并探索在各软件开发环节加入安全过程、把控安全风险,确保每个环节交付到下一环节的交付物都安全可控。于是,微软产生了“SDL软件安全开发周期(SecurityDevelopmentLifecycle)”。
年,微软的SDL安全开发生命周期模型(见下图)并作为软件开发的强制策略开始在公司实行。该模型帮助开发人员构建高安全性的软件,并取得了巨大成功。应该说早期的这个模型,确实没有将运维层面的实践纳入该模型。
早期的微软SDL
年,随着移动、云计算、大数据、物联网、人工智能和其他新技术的兴起,微软对SDL进行调整,使得无论使用经典的瀑布或更新的敏捷方法(如DevSecOps),在开发的每个阶段提高软件应用程序的安全性。其中,适用于瀑布开发场景的SDL包括12个安全开发实践,适用于敏捷开发场景的SDL包括8个安全开发实践。
适用于瀑布开发场景的新版微软SDL
适用于敏捷开发场景的新版微软SDL
新版微软SDL具有以下特征:
不再强调在哪个软件开发阶段执行哪个实践,这使得模型能适用更广泛的SDLC模式;
重视软件开发过程中的自动化安全检测,包含:静态安全测试、动态安全测试、渗透测试;
不再