当前位置: 首页 > 科技观察

浅谈如何有效实施DevSecOps

时间:2023-03-20 15:01:26 科技观察

前言随着业务更新迭代的加快和面向客户的系统的增多,大多数企业往往由于安全资源有限而忽略了信息系统开发生命周期中的安全活动,或者仅仅运维安全活动只在前期开展,造成各种难以解决的问题:安全问题长期暴露。在系统建设之初就进行相关的安全活动,以便更早地解决安全问题。安全活动滞后,增加了信息系统安全问题的暴露时间。纠正安全问题的成本很高。目前,企业的安全人员通常在系统上线或运行时就开始介入安全活动,安全问题正是在这个阶段被发现的。由于漏洞大多是在上线前或运行中才被发现,因此安全问题的数量往往较多,而这一阶段的安全问题整改需要重新安排人力和时间,增加了整改安全问题的成本,影响启动信息系统时间表。不重视安全活动的企业拥有大量信息资产,安全工具没有完全自动化或集成,信息安全人员更多地沉浸在资产的日常安全维护中,使信息安全人员处于非常被动的状态。安全活动的实施没有计划、没有重点、没有制度化,实施效果不尽如人意。安全人员不能为所欲为企业专职安全人员非常有限,在安全方面的人力投入无法与互联网公司相提并论,但面临着与互联网公司相同的安全风险。再加上行业的高监管要求,面对诸多风险,安保人员往往力不从心。开发交付团队很难平衡“速度”和风险,甚至管理层也过分强调“速度”。随着发布速度和频率的不断提高,传统的应用安全团队已经无法跟上发布的节奏来确保每次发布都是安全的。为了解决这个问题,组织需要在开发过程的每个阶段不断构建安全性,以便DevOps团队能够快速、高质量地交付安全的应用程序。越早将安全性引入工作流程,就能越早识别和修复安全缺陷和漏洞。这个概念是“shifleft”的一部分,它将安全测试转移给功能测试人员甚至开发人员,使他们能够近乎实时地修复代码中的安全问题。借助DevSecOps,企业可以将安全性无缝集成到其现有的持续集成和持续交付(CI/CD)实践中。开发运营?在了解DevSecOps之前,让我们先了解一下DevOps。DevOps由三个组成部分组成:组织文化、流程、技术和工具,可帮助开发和IT运营团队以比传统软件开发流程更快、更敏捷、更迭代的方式构建、测试和发布软件。根据DevOps手册,“在DevOps哲学中,开发人员收到关于他们工作的快速、持续的反馈,这使他们能够快速、独立地实施、集成和验证他们的代码并将其部署到生产中。简单地说,DevOps是关于消除两个传统孤岛团队(开发和运营)之间的障碍。在DevOps模型中,开发和运营团队在整个软件应用程序生命周期中协同工作,从开发、测试、部署到运营。什么是DevSecOps?为什么?DevSecOps是Gartner在2012年的一份报告中提出的概念,在应用安全(AppSec)领域是一个相对较新的术语,它在DevOps活动中扩展了开发和运维团队之间的紧密协作,包括安全团队,在早期引入安全软件开发生命周期(SDLC)。DevSecOps意味着安全是每个人的共同责任,每个人都参与SDLC正在将安全构建纳入DevOpsCI/CD开始发挥作用。DevOps是关于应用程序交付速度的,而DevSecOps通过尽可能快地交付最安全的应用程序来提高速度和安全性。Devops使开发团队更快,更好的协作可以在几天到几周内交付和部署软件。然而,快速创新与安全之间的冲突使得安全成为Devops的瓶颈。DevSecOps(DevOps+Sec=DevSecops)通过DevOps流程阶段或检查点的各个阶段来构建安全性,以消除DevOps与信息安全之间的壁垒,从而更快、更安全地生产出高质量的代码。根据DevSecOps的理念,企业应该将安全融入到DevOps生命周期的每一个环节,包括Initialize、design、build、test、release、support、maintain等。在DevSecOps中,安全是DevOps中每个人的共同责任价值链。DevSecOps涉及持续、灵活的协作。如果开发组织从一开始就考虑代码中的安全性,DevSecOps可以更早地、有目的地将安全性纳入SDLC,从而在漏洞进入生产之前或发布之后发现并修复漏洞,这将变得更加容易且成本更低。DevSecOps工具DevSecOps工具是整个DevSecOps的核心。扫描开发代码,模拟攻击行为,帮助开发团队发现开发过程中潜在的安全漏洞。从安全的角度来看,DevSecOps工具可以分为以下四类:StaticApplicationSecurityTestingTools(SAST)静态应用程序安全测试(SAST)技术通常在编码阶段分析应用程序的源代码或二进制文件的语法、结构、进程、接口等信息,用于查找程序代码中的安全漏洞。SAST主要用于白盒测试。检测问题类型丰富,可以准确定位安全漏洞代码,更容易被程序员接受。但误报多,人工成本高,扫描时间随着码量的增加而显着增加。相关工具有:Checkmarx、Fortify、CodeGuard等。动态应用程序安全测试工具(DAST)动态应用程序安全测试(DynamicApplicationSecurityTesting)技术分析应用程序在测试或运行阶段的动态运行状态。它模拟黑客动态攻击应用程序的行为,通过分析应用程序的响应来判断Web应用程序是否存在漏洞。该工具不区分测试对象的实现语言。它使用攻击特征库进行漏洞发现和验证,可以发现大部分高危问题。因此,它是业界非常普遍的Web安全测试安全测试方案。但是由于这类工具对测试人员有一定的专业要求,所以大部分都不能实现自动化。测试过程中产生的脏数据会污染业务测试数据,无法定位漏洞的具体位置。因此,它们不适合DevSecOps环境。相关工具包括:AWVS、Burpsuite、OWASPZAP等InteractiveApplicationSecurityTestingTool(IAST)交互式应用安全测试(InteractiveApplicationSecurityTesting)是Gartner在2012年提出的一种全新的应用安全测试方案。通过在其上部署Agent程序服务器端,收集并监控应用运行时的WebFunction执行、数据传输、与扫描器的实时交互,可以高效准确地识别安全漏洞和漏洞,同时准确判断代码文件、行漏洞所在的数字、函数和参数。IAST相当于结合了DAST和SAST的相互关联的运行时安全检测技术。IAST检测效率和准确率高,能够准确定位漏洞位置,漏洞信息详细度高。但其部署成本略高,且无法测试业务逻辑漏洞。相关工具包括:ContrastSecurity、Mo'anIAST、玄境等开源软件安全工具(FOSS)现在很多开源软件安全工具都比较成熟,比较有名的有:X-ray,SonatypeIQServer,DependenciesCheck等。一般来说,功能齐全的IAST或DAST可以解决大部分的安全问题。如果想再往左走,可以继续推进SAST和FOSS的建设,将漏洞发现提前到开发阶段。这里有一点需要说明。该工具仅解决一般漏洞问题。对于逻辑性比较强的逻辑漏洞,比如0元支付这样的逻辑漏洞,需要在上线前进行人工安全测试才能发现并解决,或者在设计阶段通过安全需求进行规避。DevSecOps具体实践的关键在于CI/CD流程的安全嵌入。笔者根据实践经验,绘制了DevSecOps自动化安全测试流程图如下,供大家参考。在需求分析阶段,需求管理平台Confluence接入JIRA,JIRA获取需求和任务调度,下发开发任务给开发人员。在系统开发之前,为了保证应用程序的安全,可以对开发人员进行信息安全知识和必要的安全编码技能的培训。这里可以使用一些在线课程或者在线安全平台:SecureCodeWarrior。在安全培训周期方面,要提供全方位、多角度的培训,包括新人初期培训和阶段性培训。还需要密切观察开发人员存在的问题,及时进行有针对性的专项培训,让研发人员在了解漏洞原理后,能够编写出高质量、安全的代码。开发者收到JIRA下发的开发任务,按照《编码安全指南》进行系统开发。在开发阶段,IDE引入了开源组件&内部依赖组件的安全扫描。如果发现有风险的组件,开发人员会通过同步到JIRA得到通知。系统开发完成后,开发人员通过GIT/SVN提交代码到代码仓库。当代码提交到代码仓库时,触发SAST进行增量源码安全扫描,风险同步到JIRA。此外,先科科技还会对代码仓库进行定期巡检。这里,安全编码基线要求可以配置为源代码安全检查工具扫描规则,使得源代码安全工具扫描的源代码能够保证满足安全编码要求。自动构建代码时,会自动扫描构建的代码以确保安全。如果扫描发现缺陷,将缺陷信息同步到JIRA,由JIRA推送给研发人员,同时终止流水线运行。研发人员完成缺陷修复后,再次重启自动发布流水线。为减少流水线因源代码缺陷频繁挂起和重启,建议在编码过程和日常代码合并过程中自动进行源代码安全扫描,提前发现并修复代码中的缺陷发布。在测试阶段,使用交互式安全检测工具,在单元测试和回归测试时自动采集测试流量,分析测试流量并自动构造漏洞测试请求,在进行功能测试的同时完成安全测试。如果发现漏洞,可以实时同步到JIRA,JIRA会将漏洞信息推送给研发团队。总结DevSecOps是组织文化、流程和技术的统一。如何有效实施,离不开这三个方面:组织文化,人和文化尤为重要。DevSecops的实施,不仅需要上级领导乃至最高领导的重视和投入,更需要业务团队对安全的重视。“自上而下”而不是“自下而上”,在落地过程中与不同部门的团队协作也很重要。工具链构建工具链构建是整个DevSecOps的核心。软件开发是一个复杂的问题,需要DevSecOps提供相应的自动化工具支持。关键是CI/CD过程的安全嵌入。建立流程和制度传统的IT治理模型和流程不适合跨团队协作。如何解决各个开发团队之间的沟通协作,需要根据各自的业务情况来制定。