软件开发中,如何为你的代码构建三层防护体系
本文分享自华为云社区《构建DevSecOps中的代码三层防护体系》,作者:Uncle_Tom。
在 DevSecOps 的应用过程中,静态分析工具在开发阶段承担着非常重要的代码质量和安全的看护任务。本文根据开发过程的不同位置的开发环境、代码特征以及检测工具能力的差异,提出了需要因地制宜地部署检查工具,形成递进的三层代码安全防御体系,从而提高应用软件整体安全性,同时又能有效的贯彻安全左移的策略,降低安全问题的维护成本。
1. DevSecOps
近年来,大型企业 DevSecOps 引入占比逐年递增,从 2020 年的 41.3%增至 2022 年超 63.5%, 其复合增长率超过 20%。
DevSecOps 一词最早由 Gartner 在 2012 年提出,并在最近几年逐步成为软件开发种的热点。DevSecOps 在开发人员、测试人员、安全团队和运维团队之间架起了桥梁;它改善了团队之间的沟通和协作,其目标是更快、更高效地交付。DevSecOps,在 DevOps 的基础上增加了安全的活动,在保障快速开发、快速的部署的基础上,提高了安全性,内嵌安全到应用程序中,能够更迅速地应对安全威胁。
下图是美国国防部(Department of Defense(DOD)) 定义的 DevSecOps 软件生命周期的 9 个阶段:计划、开发、构建、测试、发布、交付、部署、操作和监控。安全嵌入到每个阶段。DevSecOps 生命周期具有很强的适应性,并且有许多反馈循环来驱动持续改进。DevSecOps 在管理理念、管理方法、组织结构、开发流程、软件开发、开发平台、工具集成、以及企业文化等方方面面对传统的软件开发提出了新的挑战。
在 DevSecOps 的应用过程中,静态分析工具在开发阶段承担着非常重要的代码质量和安全的看护任务。本文重点讲述软件静态分析工具在 DevSecOps 的开发域中的重要作用。
2. DOD DevSecOps
美国防部自 2021 年起发布一系列关于 DevSecOps 相关文件:《国防部企业 DevSecOps 战略指南》、《国防部企业 DevSecOps 基础》、《DevSecOps 参考设计》《DevSecOps 行动手册》等相关支撑文件。
今年五月又补充了《DevSecOps 基础指南:活动和工具》。在这个文档中更加清楚的定义了在 DevSecOps 的生命周期中,需要完成的安全活动和对应的工具。涉及的安全活动如下表:
从这个活动表我们可以看到在开发过程中,有三个关键的安全检测点, 即表格中我们标红的部分),以及文件中关于这三个检测点的信息合并成下表:
从这个表格我们可以看到,在代码的开发阶段在以下检测点需要完成相应的静态分析检测:
在 IDE,通过 IDE 安全插件,对需要提交的代码完成安全检测;
在代码仓,通过安全插件,进行的代码提交扫描,也是我们常说的“门禁”;
在构建,通过静态分析工具,完成静态应用程序安全测试和扫描(SAST)
《DevSecOps 基础指南:活动和工具》中,只提出了对流程检测点的需要有的活动要求和工具的粗略的要求,并没有给出具体的流程融合和该怎么在不同的检测点如何选择工具。
3. OWASP DevSecOps
开放全球应用程序安全项目(Open Worldwide Application Security Project (OWASP)) 是一个非营利性基金会,致力于提高软件的安全性。基金会致力于通过其社区主导的开源软件项目,全球数百个分会,数万名成员以及举办本地和全球会议来提高软件的安全性。
《OWASP DevSecOps 指导(OWASP DevSecOps Guideline》)指导我们如何实现安全管道和使用最佳实践,并介绍了可以在这件事上使用的工具。
指导在 DevSecOps 的实践中,还特别用一个章节介绍了预提交(pre-commit)的流程。如下图:
这张图清楚的给出了预提交的检查流程,并给出了在预提交中需要完成的两种检查:
确保代码中没有密码、密钥问题;
代码遵循 Linter 规则。
这里的 Linter 我找不到一个合适的中文来翻译这个英文。Linter 本意指的是衣服上在洗衣机洗完后,由于滚动摩擦会使衣物的纤维聚集在一起形成绒毛或纤维等的小球。以前想把这些多出来的"小球"去掉, 后来人们发明了叫 Linter 的神器,一滚就能清除掉这种"小球"。
1978 年,工作于贝尔实验的 Stephen C. Johnson 在 Debug 自己的 C 语言项目时,突然想到为什么不做一个工具来提示自己写的代码哪里有问题呢? 这个工具也被称为 Linter。Linter 是一种静态分析工具,主要用于发现代码中语法错误、潜在 Bug、代码风格等。我们常见的以 lint 命名的各种工具就是这一类型的静态检查工具。几乎每种语言都有自己语言的 Linter 工具,例如我们熟悉的:Java:checkstyle,Javascript:ESLint,Python:PyLint,C/C++:cpplint、Go:golint等等。
《OWASP DevSecOps 指导》中,给出了 Linter 的作用:
检测代码中的错误以及可能导致安全漏洞的错误;
检测格式或样式问题,并使代码更具可读性,从而获得更安全的代码;
检测建议的最佳实践;
可以提高代码的整体质量;
由于每个人都遵循相同的 linting 规则,因此代码的维护变得更加容易。
《OWASP DevSecOps 指导》中,将静态检查工具的按检查问题的不同定义成 Linter 和 高级静态检查工具:
Linter 工具是静态分析的最基本形式。使用 lint 工具有助于识别常见错误,例如:
数组索引越界;
空指针解引用;
(潜在)危险的数据类型组合;
无法访问的代码(死代码);
不可移植的结构。
高级静态分析工具。高级静态分析工具通常提供:
基于模式的检查;
质量和复杂性指标;
面向开发人员的最佳实践建议;
支持多种以安全和安保为重点的编码标准;
用于开发安全关键型应用, 例如:开箱即用的认证。
《OWASP DevSecOps 指导》给出不同工具检查缺陷类型的不同,主要还是说明在不同的检测点,需要配置不同类型的检查工具。
4. 安全左移
Capers Jones 在《应用软件测量:生产力和质量的全面分析》中阐述了从软件工程实践角度出发,说明了大部分的问题在编码阶段引入,同时随着缺陷在开发过程中发现的越晚,修复成本越高。
所以我们希望通过将开发完后的测试工作融入到开发过程中,这样可以有效的降低开发过程中引入缺陷的修复成本。
测试向开发阶段左移
测试左移,缺陷在开发阶段减少
在 DevSecOps 概念提出后,人们很自然的就提出了"安全左移"的概念。“安全左移”(引自《OWASP DevSecOps 指导》中的定义) 是一种将安全性嵌入到开发过程中的方法或解决方案,并从应用程序或系统设计的初始步骤开始考虑安全性。换句话说,安全性对从事软件开发和操作过程的每个人负责。当然,安全是一种职业,我们需要高技能的人来扮演与安全相关的角色;但在这种方法中,任何设计师、软件架构、开发人员、DevOps 工程师和…与安全人员一起对安全负有责任。
从这个描述中我们可以看到安全左移包括几个具体的活动:
安全从设计开始,贯穿整个流程;
全员参与安全活动;
根据前面我们对美国国防部《DevSecOps 基础指南:活动和工具》,以及 OWADSP 的《OWASP DevSecOps 指导》的了解,在开发过程的编码阶段有三个检查点:IDE、门禁、持续构建(CI)。按照"安全左移"的理念,我们是不是也可以"一路向左", 将静态检查工具放到 IDE 或门禁中,实现静态检查工具的左移,从而去掉持续构建(CI)中的检查环节?是不是可以一路向左?
4.1. 成语故事“因地制宜”
好久没在博客里讲故事了。中国历史悠久、先贤们将各种为人、处事的道理、哲学融汇在一个个故事里,通俗易懂,并炼成了让人津津乐道的成语故事,源远流长,让普通人都能牢记这些哲理精髓,一代代传承。最近刀郎红火起来的歌曲,除了歌曲本身,人们更喜欢挖掘的是歌曲中包含的各种凄美故事。
春秋末年,楚王听信谗言,杀了伍子胥一家,伍子胥逃到了吴国。伍子胥为了借助吴国给自己报仇,给吴王献计:要想使国家富强,人民安定,首先要高筑城墙,这样才能加强防御力量,使其他国家不敢进犯。还要加强军事力量,充实武器及物资的储备,这样就能够对别的国家形成威慑之势。同时还要发展农业,只有农业发展了,国家才能富强,百姓才能安居乐业,将士们才有充足的给养,而且要充实粮仓,以备战时之需。
这样国家才能安定,才有可能发展。吴王非常赞同伍子胥的战略。于是巧妙利用吴国的地形,建立起一座依山傍水的城郭。城中有多个城门,且其中三个筑有城楼。大城中还有东西两座小城,西城为吴王的王宫所在地,东城则是驻扎军队、存放军备的地方。就这样在城中设置守备、积聚粮食、充实兵库,为称霸诸侯做准备。经过一段时间的准备,吴国逐渐强盛起来。最后吴军大举进攻楚国,五战五胜,最后攻陷了楚国的国都:郢都。伍子胥终于报了杀父兄之仇。这就是“因地制宜”成语的故事。
从这个成语我们也悟出一个道理,对于开发阶段中,对静态分析的工具使用并不能"一路向左", 需要考虑检测点的差异, 选取合适的检测工具,才能建立有效的防御体系。
4.2. 建立三层代码的防护体系
我们通过下表可以清楚的看到三个检测点的差异,以及根据差异选用不同的静态检查工具,从而达到“因地制宜”的效果。
DevSecOps 在实施过程中除了强调工具的配合实现各个检测点的自动化,更主要的是需要提供一套完整的工具整合平台,实现整体流程的自动化运行和监管。这也是为什么大部分的企业在实施 DevSecOps 的时候,都选择了通过云平台支撑 DevSecOps 的实施方式。
5. 华为云的三层检查体系
优秀的代码质量保障实践,往往将代码检查融入到开发作业流中,在用户代码编写、代码提交时进行自动化的审计检查,并对团队每日产出的代码进行持续编程规范和质量检查。
这一活动实践要求已是安全开发过程 SDL、DevSecOps 等众多优秀开发模式推荐进行的实践要求。
华为云代码检查服务(CodeArts Check)提供丰富的 API 接口、涵括任务新建、任务设置、任务扫描、任务报告解析等检查业务全流程,支持用户使用接口方式无缝集成到自建 CI/CD 或者 CodeArts,作业数据灵活对接到客户看板,代码质量可视、可管理。
同时通过灵活的任务管理,支持排除目录设置避免无效扫描,并支持混合语言检查、简化部署、一次获取整个版本代码质量。
详见:“代码编写、代码合并、版本发布”三层缺陷防护,兼顾效率与质量
6. 参考
DevSecOps Fundamentals Guidebook: Activities & Tools
DoD Enterprise DevSecOps Strategy Guide
DoD Enterprise DevSecOps Fundamentals
DevSecOps Fundamentals Playbook
DoD Enterprise DevSecOps-Pathway to Reference Design
OWASP devsecops guidelien
Capers Jones, Applied Software Measurement: Global Analysis of Productivity and Quality.
What Is Shift-Left Testing? - Parasoft
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/e7c089ef4d7ef07e18f8ecddf】。文章转载请联系作者。
评论