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