2012年,Gartner首次提出DevSecOps概念,旨在将安全性嵌入开发过程中的每个部分;十年后,DevSecOps已经成为端到端安全能力构建的事实标准。所以,在了解DevSecOps为什么重要以及如何落地之前,我们先从软件开发的角度弄明白什么是DevOps。
软件开发进入现代化之旅
回望过去,软件开发大概经历了四个重要阶段:
第一阶段,90年代以前,软件开发是瀑布式,像交付硬件一样交付软件,最大的特点是项目庞大、开发周期长、出现原始问题时修复难度比较大。
第二阶段,2000年左右,敏捷开发逐渐成型,更关注微小变更,开发团队可以只交付部分功能,或者一个功能的框架。这种开发模式加快了软件交付速度,确保了主线上的代码在任何时间都可以工作。
第三阶段,2008 年前后,DevOps成为实现敏捷开发的最佳方法论之一。"敏捷"强调的是速度,要实现快速开发目标,自动化成为重要手段;而DevOps最核心的能力就是自动化。从概念来看,DevOps要打通开发、运维环节,通过更自动化的方式交付软件和架构变更过程,使得构建、测试、发布等整个流程能够更快捷、频繁和可靠,这便是DevOps。
第四阶段,2010年以后,容器开始流行,尤其是2015年原生基金会CNCF的诞生,标志着云原生时代到来。所谓"云原生",是将应用部署在云上,更强调动态环境构建,让软件交付变得更快捷、灵活和高效。可以说,云原生不仅解决了软件交付的"最后一公里难题",最重要的是推动软件开发流程或者方法进入了现代化之旅。
极狐(GitLab)高级解决方案专家
温小刚在1月8日由msup主办的第十届TOP100全球软件案例研究峰会上,极狐(GitLab)高级解决方案专家 温小刚带来了精彩的案例分享,其中总结了云原生时代的软件开发十大关键能力!
具体如下:
1.通过轻量化容器打包;
2.使用最佳语言和框架开发;
3.设计为松耦合的微服务;
4.微服务都是通过API来连接;
5.无状态和有状态服务区分清晰;
6.从操作系统和服务器层面抽象出来;
7.部署到自服务的云服务环境中;
8.通过敏捷的DevOps过程管理;
9.自动化能力;
10.有明确定义且被策略驱动的资源分配。
只是,从应用安全的角度来看,这些新的服务能力,在推动软件开发走向更高阶段的同时,也带来了新的安全风险。
云原生时代面临新的安全挑战
Containers,容器是一个新应用,所以在安全体系构建中,如何把容器的内容纳入进来,是企业拥抱现代化业务架构的第一个挑战。包括如何使用云原生应用的库和进程解决业务问题,如何共享底层操作系统,如何使应用可移植等等,涉及很多新的安全问题。有了容器,我们需要把它编排起来,需要新的编排工具。如果,安排容器运行的方式和位置不合理,也容易被攻击。云原生时代,很多企业希望通过微服务架构改变之前单体式架构,会将应用拆解为较小的服务,通过API进行连接。其实,传统软件开发时代,也有API,只不过不像今天这样,有如此大的体量。并且,很多API都需要单独的管理工具,所以在安全策略上也必须做出相应的调整。
所以,从大的开发环境来看,传统安全模式已经不能满足云原生时代的需求。首先,云原生采用的是敏捷开发方式,通过DevOps过程进行发布,在高速开发模式下,传统安全和部署模式显然无法跟上,如果把跟不上安全的云原生应用投向生产环境,会成为重点攻击对象。另外,传统安全工具扫描速度慢,无法适应云原生环境的敏捷需求。最后,还有人为因素。传统安全模式下,人员较少,缺乏专业技能。如何从根本上解决云原生环境下面临的安全挑战呢?很多企业会采用安全左移的方式!
安全左移成为最佳方法论
为了从根本上解决安全团队的低效问题,高效团队会将信息安全 (InfoSec) 目标整合到日常工作中,团队可以实现更高水平的软件交付,并以更好的性能构建更安全的系统,这种想法称为"左移"。说白了,安全左移就是在软件开发生命周期的较早阶段,解决各种安全问题。因为,越早检查到安全漏洞,企业修复漏洞的成本就越低。
问题是,安全左移方法论该如何落地? 很多企业首先会考虑使用传统安全工具实现安全左移,但是一看到各种工具链,就会感觉力不从心。因为,不同企业对安全工具的需求不同;并且不同发展阶段,也会采用不同工具类型;如果使用不同厂商提供的产品,还要做各种测试,包括静态、动态页面扫描、供应链扫描、容器扫描等等。不仅要进行相关工具的匹配,还要将所有工具以及整个流程衔接起来。有时候,工具集成的成本,可能比工具本身的费用还要高,包括很多企业提供的安全看板,还要单独收费。所以,实现安全左移目标,就像企业把所有DevOps工具串起来一样,不仅花费巨额成本,最重要的是耗时费力,根本不可能完成。具体而言,安全左移要具备如下能力:
1.便捷、高效的扫描。每次代码提交即扫描,开发人员可以第一时间得到反馈;
2.扫描能力要可靠,能全面覆盖。扫描不同的安全类型,这样才能降低安全合规风险,进而降低总体成本;
3.自动化的安全策略,针对不同等级的安全漏洞,在做代码合并或者上线部署的时候都需要一些自动化策略。比如:和环境无关的因素可以考虑忽略,也有一些不确定的因素需要人来参与,这些都需要从扫描结果中自动化,保证整个应用的高效、准确、可靠,防止安全漏洞进入生产环境。
4.与现有工具的集成。平台开放性,也很重要。从保护既有投资的角度看,原有工具确实有着自己的特有能力,需要和新应用进行集成和互补,不能搞"一刀切",完全抛弃旧有工具。
5.扫描次数、行数无限制。你如果想左移,在成本可预计、可控的前提下,就尽量多扫。
只有具备上述能力,最终才能真正达到安全左移的效果,让需求、代码、测试、报告全流程可跟踪、可追溯,进而实现端到端的打通,以更合理的许可模式和成本实现漏洞检测。
DevSecOps带来成本优势
如前文所述,传统业务模式下,反馈周期长、成本高、修复难度大,而新的DevSecOps可以从基础的应用安全扫描能力开始,构建端到端安全能力,将安全左移方法论嵌入到CI/CD里。
在极狐GitLab 里,安全扫描涵盖多种扫描能力,除了常见的静态应用安全测试(SAST),还有依赖扫描,也叫供应链扫描。另外,还有许可合规扫描、容器扫描、动态应用安全测试(DAST)、IaC安全测试、Fuzz Testing模式测试,真正将安全测试内嵌于合并请求中。
极狐GitLab 之所以被称为是DevSecOps的最佳范式,是因为可以做到多重检测和检查。
第一,检查代码。更通俗的说法是,检查自己。比如:6次攻击里面4次是针对应用,而应用是从代码里面出来的,代码是应用的基础,静态安全测试是根据已知的漏洞特征代码进行白盒扫描,然后通过扫语言、代码,和代码管理工具连在一起。对于极狐GitLab 来说,管理工具就是管理自己,极狐GitLab在这儿,仓库也在这儿。不同的语言需要不同的特征库,按照不同的规则来检查,涉及的语言包括.net、C/C++、Python、Java、JavaScript、Kotlin、Go、Ruby等等。另外,还要按照不同语言密码/密钥检测Secret Detection,检查无意提交的密码/密钥。除了特征库维护,扫描引擎需方便易用,并保定期更新。
第二,检查依赖。随着开源软件/组件的使用率的提高,以及开源组件生态中的漏洞数的升高,软件供应链安全变得越发重要。面对不同开源软件,如果基于某些管理体系来扫描,会让整个检测过程更方便、快捷,不用像静态检查一样,一行一行扫。比如:基于软件成分分析(SCA)的安全测试,我们可以依赖组件安全分析,还可以依赖组件开源许可合规分析。除了SCA安全测试,软件供应链也存在容器镜像,因容器镜像本身也是分层的,对于容器镜像安全扫描,和开源组件供应链扫描一样,也是分层模式,并在每一层报出已知漏洞。
第三,检查应用。一般,网站类应用容易被攻击,所以需要在网站正式上线之前进行测试。比如:大家熟悉的OWASP Top 10,被称为是动态扫描模拟标准。如果你希望每一次提交都能够进行动态扫描,那么整个体系都需要具备动态部署的能力。动态应用安全测试DAST(Dynamic Application Security Testing)类似于黑盒测试,像外部攻击一样测试运行中的应用。
只是,对于保持传统开发及应用模式的企业来说,如何从根本上解决传统安全和云原生安全的矛盾呢?很多人可能会说,如果开发人员不具备掌控云原生安全的能力,我们就提高人员素质,进行安全培训、教育等等!这虽然是企业拥抱云原生的一种方式,但是教育成本往往很高;最重要的是,学习时间太长,会影响整个业务的发展。
面对陌生的应用工具,只通过参数的微调,就能使用预配置,达到应用检查和扫描的目的,极狐GitLab为开发人实现了安全赋能。在极狐GitLab带来的DevSecOps能力中,实现了代码层的简化,很多应用工具已经内置于模板中,开发人员不需要一行行写代码,可通过资源配置,直接进行应用。
在极狐GitLab 界面中,你的新代码出现了哪些安全漏洞,或者你修复了哪些老的既有的安全漏洞,安全人员和开发人员都能一目了然。如果你发现有误报,或者是和你实际情况不相关,可以选择忽略,比如:密钥检查时,结果和测试密匙无关,希望后续再处理,可以临时创建issue,把漏洞信息带进去。
可能有些人会认为,有了极狐GitLab,安全团队是不是就没用了?的确,安全策略的自动化,会减少很多重复性的工作,解放安全人员的双手。但是,并不代表安全团队不再重要,而是要参与到更重要的工作中去。比如:存量漏洞怎么解决,如何批量更改状态等等,可以与开发人员实现更紧密的协作。
以扫描应用场景为例,如果遇到 log4shell 漏洞检测和修复,应该如何处理呢?首先,要进行配置。通过菜单"安全与合规"-> "配置"->"依赖项扫描"启用,然后在极狐GitLab CI配置中启用依赖扫描。实际扫描的时候,会在扫描流水线上出来结果,扫描工具在默认分支上面跑,然后进入漏洞,在漏洞报告中查看结果。如果有新的漏洞,会在新的分支里进行修复。和漏洞相关的信息都会带过来,比如:标识码、相关链接、解释、相关扫描工具实践等,下次进行查看、追溯就非常方便。
总之, DevSecOps最佳方法论的核心是,在各个阶段把安全因素考虑进去,越早解决安全问题,成本收益以及最终结果越好。而极狐GitLab可以为更多开发人员和安全人员带来从代码到应用集成,再到系统测试以及生产阶段的一站式解决方案。