浅谈DevSecOps工具链中的源代码安全保障

近期,很多企业开始关注DevSecOps,下面根据作者对其理解,简单分析一下在DevSecOps的源代码安全该如何考虑和建设。

主要分5部分:

1、DevSecOps建设的背景和目的

2、安全才是提升研发交付质量的第一要素

3、安全自动化是安全交付的保障

4、企业如何实施DevSecOps

5、企业落实DevSecOps的动力

正文:

1 DevSecOps建设的背景和目的

随着信息化技术的不断发展,以及国际、国内政治、经济所面临的新形势,新变化,软件行业也需要不断调整自身,以适应社会变革,企业才能生存和发展。这些变化主要体现在:

  1. 以美国为首的西方国家对中国的围追堵截,从国际贸易发展高科技领域。中兴、华为事件是比较典型的事件。处处设置障碍,对中国断供、卡脖子,政府不断推出高科技领域的发展政策和投资基础建设,倡导自主、可控的国产化软硬件,包括芯片、主板、CPU、服务器、操作系统、中间件、办公软件、安全软件等等,这给国内企业带来了机遇,把握这个机会才能未来国产化竞争中利于不败之地;
  2. 信息化安全问题日益突出,2019年12月1日网络安全等级保护2.0正式发布实施,对软件安全,尤其是源代码安全漏洞检测提出了多项要求。不管是政府、国防军工,还是金融、互联网等企业越来越重视软件安全,采购国产化软件替换具有潜在风险的国外安全软件,同时各企业越来越重视代码安全审查,把代码安全看作是软件安全的第一步;
  3. 与软件相关的行业经过多年发展,遇到了很多问题和瓶颈,近几年提出的DevSecOps理念,是比较好的一个模式,通过整合工具链和流程,能够打通壁垒,优化和减少部门或团队之间的沟通成本,提升工作效率,各企业都在不断尝试,如何结合本企业的特点,进行落地;同时强调把关注安全融入开发和运维的每一个环节中;
  4. 当前国内一线城市的办公成本居高不下,除了办公场地成本之外,就是用人成本。各大企业除了把非核心业务逐渐转移到二线、三线城市,也在不断尝试引入工具和机器人代替人工劳动,从而减少用工成本。另外,软件研发企业通过优化研发流程,生产管控,减少风险,减少后续不必要的成本。

总结,通过前面分析软件行业所面临的形势分析和面临的问题,企业应借鉴同行在DevOps或DevSecOps方面建设经验,根据企业实际情况,优化研发流程,尤其是软件安全相关的流程,建设自动化工具链,提升开发效率,减少团队沟通成本,减少返工成本,是企业必经之路。在整个DevSecOps流程中,使安全成为每个人工作的一部分,将预防性控制集成到我们的代码库中,在每个工作流管道中融入安全。通过引入度量机制和过程优化机制,不断评估实施DevSecOps所带来的效果。如何实施DevSecOps需要软件研发相关企业能够根据自身的特点,做好战略规划,适应社会变化和行业变化,掌握主动,积极应对,才是企业长期发展的基石。

 

2 安全才是提升研发交付质量的第一要素

     自上个世纪末和2000年之初,很多软件生产企业就非常重视软件产品质量,在生产实践中,运用新方法、新流程不断改进生产工艺,提升交付产品质量,像ISO 9001、CMM/CMMI、精益生产和精益管理等等,软件行业的Ration统一过程软件工程方法、结对编程、螺旋开发模型、敏感开发等,近几年开始流行的DevOps模式等,目的都是为了优化软件研发流程,提升产品交付质量。下图是微软早期的安全开发生命周期模型。

 

 自2004年起,安全开发生命周期(SDLC)即Security Development Life Cycle,就成为Microsoft全公司的计划和强制施行政策。SDLC是一个帮助开发人员构建更安全软件、满足安全合规要求的同时降低开发成本的软件开发过程。其核心理念就是将安全考虑集成在软件开发的每一个阶段:需求分析、设计、编码、测试和维护。从需求、设计到发布产品的每一个阶段都增加了相应的安全活动与规范,以减少软件中漏洞的数量并将安全缺陷降低到最小程度。安全开发生命周期 (SDLC)是侧重于软件开发的安全保证过程,旨在开发出安全的软件应用。

培训

要求

设计

实施

验证

发布

响应

核心安全培训

确定安全要求

确定设计要求

使用批准的工具

动态分析

实践响应计划

执行时间响应计划

培训对象:开发、测试、产品经理、项目经理

创建质量门限

分析攻击面

弃用不安全的技术

校验测试

最终安全评析

 

安全和隐私/风险评估

威胁建模

静态分析

攻击面评析

 

 

Microsoft安全开发生命周期

从上面微软的安全开发生命周期可以看出,在整个研发生命周期中,安全被摆在了第一位置。随着软件系统越来越复杂,模块之间的依赖关系也越来越复杂,缺陷或安全漏洞距离开发阶段越久,其修复成本就越高。所以,企业要优化流程,尽量把发现和修复缺陷和安全漏洞的时间左移,减少风险的同时,减少成本。

 

    SDLC实施的效果本身是隐性的,很难用度量体系将SDLC实施效果可视化。所以对于研发部门还是其他部门,都很难有主动实施SDLC的动力。微软首先提出了SDLC(Security Development Life Cycle的简写)并由比尔.盖茨亲自发邮件要求员工停下手上所有的工作后才在全公司开始实施。而华为则是由CEO担任全球网络安全委员会主任来推行实施。虽然微软实施SDLC也没法给出量化的效果,但是我们从Windows操作系统的安全性比实施SDLC之前的Windows XP安全性强多了,虽然说目前Windows还有很多安全漏洞,但是不能从数量上进行简单对比,而更应该从漏洞发现的难度、漏洞利用的难度和漏洞被利用的影响等方面进行评估。虽然说我们并一定采用SDLC模型,但是我们可以在其它模型中注入SDLC的思想。

这几年软件相关行业开始建设Devops,下面我引用ITSS标准规范中的一张图:

 

在这张图中,虽然没有明确安全测试相关内容,但是在持续集成阶段,也是特别强调了源代码审查,可以看出,对于代码交付质量收到各方重视。

企业要推行 DevOps,企业需要:确保采用时间短、频率高的开发周期;采取安全措施,最大限度地缩短运维中断时间;及时应用创新技术,如容器微服务;同时,还要促使以往各自为阵的团队加强合作——这一切对所有企业来说都是艰巨的任务。上述所有措施都是以人员为根本,都需要企业内部协同合作;但是,要想在 DevSecOps 框架中实现这些人员的变革,自动化是关键所在。

 

DevSecOps 意味着,安全防护要贯穿应用开发的整个过程。要实现集成进管道,我们既需要一种全新的思维方式,也需要合适的新工具。因此,DevOps 团队应该实现安全防护自动化,从而保护整体环境和数据,同时实现持续集成/持续交付流程——可能还要确保容器中的微服务的安全。CI/CD流程安全防护涉及到的自动化包括:

  1. 集成适用于容器的安全扫描程序;
  2. 自动化CI流程中的安全测试,包括在构建过程中运行静态安全分析工具;以及在构建管道中拖入任何预构建容器映像时,都要进行扫描,以检查是否存在已知的安全漏洞。
  3. 在验收测试流程中加入针对安全功能的自动化测试。
  4. 自动化安全更新,例如修补已知漏洞。

如何提升开发交付质量呢?

软件研发流程中,影响成本最大的两个地方,1是需求变更;2是软件质量问题;需求变更有多种因素引起,不在本次讨论范围。本文主要探讨软件质量本身问题。我们一般企业的研发部门至少有两类角色,一个是开发工程师,另一个测试工程师。传统的开发模式往往是几个开发工程师对应一个测试工程师。开发工程师完成代码编写后,由测试工程师进行基于黑盒的集成测试和系统测试。整个研发过程基本上就是开发、测试的不断迭代。如果想减少测试工程师的工作量和迭代次数,就不得不提升开发工程师的代码交付质量。在开发进度排期已经确定情况下,开发工程师交付代码质量就成为项目成败的关键问题。

如果控制和保证开发工程师交付代码的质量呢?除了主观因素之外,可以总结出以下几点:

  1. 规范代码开发,执行编码规范,编码规范能够落地执行,执行情况可检查和可反馈;
  2. 提升交付代码本身的质量,尽量少的缺陷和安全漏洞,不能奢望开发人员自身能够保证高质量,需要流程和机制保证,特别是希望引入自动发现缺陷和安全漏洞的自动化工具;
  3. 控制好代码交付标准,在关键点设置检查点,例如开发人员提交到代码库,代码集中构建,发布版本等关键点,通过检查设定的标准,满足标准的代码才能被接受,不满足标准拒绝走到下一步,这需要流程和工具支撑。
  4. 保证软件安全,确保交付软件能够通过等保2.0的审查。需要在研发阶段引入安全编程规范,防止系统交付验收时,出现安全上的问题。

 

3 安全自动化是安全交付的保障

  在下图中,列出了企业将安全性融入到DevOps流程和工具链后,与安全相关的活动,用圆圈单独标记处。这些安全活动需要企业有基于整个开发流程的安全解决方案。

   

 

在这张DevSecOps图中,涉及很多与安全相关的活动,通过下面一张表,在研发生命周期中融入这些安全活动。

步骤

活动名称

活动内容

备注

1

安全可行性风险评估

基于需求中对系统安全的要求,结合安全架构师的经验,对项目的安全可靠的情况进行分析和评估,确保在安全可控下开展研发工作。一般不需要工具

必选

2

轻量威胁建模

基于安全可行性风险评估以及架构设计,对系统建设所可能遇到的威胁进行分类、来源分析、风险之间的关系、威胁的演变等建立模型。一般不需要工具

可选

3

安全编码指南

是安全编码规范的落地文件,指导开发工程师如何编写安全代码。一般是文档形式。通过工具来检验

必选

4

源代码本地扫描

通过安全安全扫描工具,对尚未提交的本地代码,进行安全扫描,目的是找到缺陷和安全漏洞,以及不符合安全编码规范的地方。需要检测工具

必选

5

第三方库安全扫描

对源代码中引用的第三库进行扫描,找到缺陷和安全漏洞。需要检测工具。

可选

6

源代码安全扫描

提交代码后,在CI之前,对于提交代码进行源代码安全扫描,以发现缺陷和安全漏洞。需要检测工具

必选

7

第三方增量扫描

提交代码后,在CI之前,对于新引入的第三库进行增量扫描。需要检测工具。

可选

8

Docker安全扫描

CI之后,对于所涉及的Docker进行安全扫描,找到缺陷或安全漏洞。需要检测工具。

可选

9

灰盒安全测试

CI之后,可借助代码逻辑,进行安全分析,找到风险点。需要借助前面工具分析的结果。

可选

10

黑盒安全测试

CI之后,通过基于需求中对安全的要求进行测试,往往是数据安全、账号安全、权限安全等。不需要借助工具。

必选

11

内渗透测试

CI之后,内部团队开展的渗透测试。可借助开源工具集。

可选

12

外渗透测试

CI之后,借助外部团队所开展的渗透测试。借助外部团队的渗透测试工具集。

可选

13

自动化安全测试

CI之后,对常见的系统安全风险进行测试。例如SQL注入、跨站攻击等。可借助开源工具集。

可选

14

安全风险报告

基于前面的所有安全相关活动的结果分析和汇总,形成安全风险总结报告内容。不需要工具。

必选

 

把保障措施具体落实到优化Devops流程上,我们借鉴一些知名软件企业的最佳实践,需要我们在以下几点进行重点改进:

   

  1. 制定和完善编码规范,增加安全编码内容;尤其是针对Java、C++/C#等主要开发语言,把安全编码内容融入到开发人员日常工作要求中。同时通过咨询、培训、技术交流等手段,逐步提升开发人员的安全编码水平;
  2. 定制研发或引入安全编码规范的工具;工具能够自动检查编码规范的执行情况,决定给开发亮绿灯还是红灯;
  3. 引入代码审查或代码检测工具,能够检查代码中的缺陷、安全漏洞,这样能够减少软件测试人员和渗透测试工程师的工作量;
  4. 设置入口检查标准,这个标准可以包括编码规范、缺陷、安全漏洞的数量,风险程度等指标,开发人员每天提交代码时,进行入口检查;
  5. 研发团队和人员画像,通过各维度量化分析,得到多方面数据给开发人员和开发团队评估,通过对开发人员、代码数量、缺陷数量、完成质量、时间进度、人员技能等各种维度度量开发效率、开发质量,技术能力水平等,为优化团队提供决策。

 

    在源代码安全扫描上,借助自动化安全扫描工具的同时,有时需要人工接入进行自动化扫描结果的审核工作,其流程如下:

   

 

扫描检测模式如下图:

 

目前,业界普通采用Jenkins做持续集成和持续构建,扫描工具可以与Jenkins集成的部署方式,此场景一般可以支持大规模持续集成的检测分析。程序员的开发环境中无须安装任何插件,代码扫描服务器同Jenkins服务器进行集成,代码扫描可通过命令行的方式向Jenkins派发编译、检测任务,检测结束后自动将结果发至相关人员的邮箱中。

Jenkins部署方案

 

4 企业如何落实DevSecOps

      

    根据保障方案所述,我们制定初步的落实措施主要包括以下几个步骤:

  1. 进一步调研,与软件行业的一些大企业进行沟通、访谈,了解Devops建设思路以及软件安全保障措施;
  2. 对现有的编码规范进行梳理,给出需要完善部分内容;
  3. 对国内代码安全审查或代码检测类工具和供应商进行调研,是否能够满足对代码安全检测的功能;例如能够定制检查规则,能够按时间、按条件等触发检测、自动发送检测缺陷报告等,能够跟我们现有工具进行整合等;
  4. 软件工具供应商能够参与我们定制流程过程中,能够结合流程实现定制化开发,包括咨询、培训能力,能够帮助我们建立入口检查标准。

在方案落实过程中,需要关注以下几个方面,才能获得比较好的执行效果。

  1. 企业必须自上而下推行DevSecOps的实施,且有响应的组织架构做支撑;
  2. 要与企业本身的质量管理体系相结合;
  3. 配套合适的人员培训体系;
  4. 用度量体系将DevSecOps实施效果可视化;
  5. 产品的安全目标决定DevSecOps的过程,而过程的执行情况决定了结果达到何种程度。

5 企业落实DevSecOps的动力

      目前,很多企业已经实施了Devops或者DevSecOps,例如华为、中兴、百度、腾讯等知名企业,取得了非常不错的效果。现在像东方航空公司、中国银行、建设银行、上海证券交易所等企业也正在建设DecOps之中。在工具链中整合安全测试工具尤其是在开发环节引入源代码检测或安全审查类工具已是必须选择。这个方案的优势主要在于:

  1. 把发现和修复缺陷和安全漏洞的时间左移,减少风险的同时减少企业研发成本;
  2. 在整合工具链中,代码安全扫描是重要的一个环节,可以在开发人员、单元测试、CI集成测试等阶段进行不同程度的扫描检测,通过设置入口标准、出口标准以及质量阈值,能够有效管控开发交付质量;
  3. 通过扫描获得的量化数据,可以分别对开发人员、测试人员及相应的团队进行量化分析,有利于组织优化改进和个人绩效的提升。
  4. 在越来越注重软件安全的形势下,把安全放在第一位,对于不管产品研发类企业还是IT服务类企业,与时俱进,与形势所适应,才能够在竞争中立于不败之地。  

(结束)

----------------------------------------------------------------------------------------------

关注安全  关注作者

 

发布了309 篇原创文章 · 获赞 31 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/manok/article/details/104267067
今日推荐