DevOps 作为软件交付生命周期管理领域的方法论,已经被越来越多的IT企业所接受。它所带来的业务价值也是毋庸置疑的,“1天N次部署”、从代码到上线只需数十分钟甚至几分钟。DevOps 已经逐渐成为更多企业软件开发及运维成熟度的新标杆。


而随着 DevOps 的落地,软件交付速度不断提升,安全问题也越来越凸显,而在传统软件开发过程中,安全往往是处于最后的一步,企业软件系统在上线前,才会通知安全人员对系统进行安全测试,甚至没有经过任何安全检测,事故频发,以下是企业安全常见痛点:


1.  问题后置:往往系统上线之后发现安全漏洞,而损失已经发生。

2.  漏洞重复出现:同样的漏洞会在不同团队多次出现,无法分析漏洞影响范围,缺少统一监管以及漏洞数据的积累。

3.  大量第三方漏洞,易攻击,排查困难:往往安全漏洞出现在外部,如第三方依赖,中间件,基础操作系统等等,而该类漏洞一经出现,最易攻击。

4.  二次故障:发现漏洞后回滚或更新系统,进而影响到被依赖的系统,造成二次损失。

5.  开发人员安全意识弱:SQL 注入等漏洞导致数据泄漏。

 

DevSecOps 是 Gartner 在2012年的一份报告中提出的概念。在这份报告中,Gartner 提出将安全理念需要更融入到 DevOps 的实践中,提高企业安全意识,最大化企业价值。据《2017年 DevSecOps 社区》的调查数据显示:

 

  • 67%的IT企业将 DevOps 描述为非常成熟或者提高成熟度;

  • 58%的成熟 DevOps 团队将自动化安全作为持续集成实践的一部分;

  • 47%的传统开发和运营团队报告安全团队和政策正在放缓;

 

而其中58% 的受访者仍表示安全性抑制了 DevOps 的敏捷性,正如上文中提到的第6个痛点。在我看来这两者在企业管理中都非常重要,忽略任何一个都可能打击企业创造价值的能力,稳定快速发布才是王道。那我们应该如何来兼顾敏捷性和安全性呢?

 

现在国际上主流的实践是把安全监管嵌入到了研发和运营整个体系过程中,并引入自动化化的安全机制,贯穿 DevOps 的整个生命周期,今天为大家介绍几个最佳实践。


持续扫描,持续反馈,即时告警


软件开发中,越早修复一个 Bug,那么修复 Bug 成本的就越低,对与安全漏洞来说也是一样,但我们不可能在开发阶段预知到开发使用哪些组建,因此我们可以在构建过程中将安全机制集成进来,阻止漏洞包交付到生产环境,如下图


DevSecOps - DevOps 与 安全理念的碰撞_java


过程(3)包括您常规构建过程,如依赖项解析、构建、测试、发布到生产仓库以及部署到测试环境以待测试。当将构建产物发布到 JFrog Artifactory(步骤4)之后,可以引入一个新的分析步骤(步骤6)到你的流水线中,该步进行二进制包级别漏洞扫描,根据分析结果,构建将被升级到生产仓库并部署到生产环境,或者让此次构建失败(7/8)。一个失败的构建会生成漏洞分析报告,列出所有的漏洞和严重级别,如下图:


DevSecOps - DevOps 与 安全理念的碰撞_java_02


SOS (Safe Open Source)


      传统开发中,一半都会会依赖大量第三方软件依赖库,提高开发效率,但同时也会带来未知的风险和挑战,从前端框架 Angular.js, React 到 MongoDb,这些依赖还会有多层级传递依赖,形成一个软件树,那我们如何监管这些隐藏的第三方依赖呢?上面介绍了 XRay 可以帮助我们扫描二进制包安全漏洞,并且它可以做到深度扫描,组层扫描依赖的依赖,并且结合开源漏洞数据源(NVD)和 Snyk 提供的漏洞数据源对整个软件树进行安全分析。更进一步 Snyk 有专门的团队分析这些已暴露的漏洞,给出修复的建议或者漏洞修复的正确版本,并且可以做到自动化,为我们自动化修复漏洞提供了可能性,帮助我们兼顾敏捷与安全,如下图:


DevSecOps - DevOps 与 安全理念的碰撞_java_03


内容驱动,避免二次故障风险


传统软件交付或上线的都是二进制包,如 War 包,Tar 包,Docker 镜像,对于安全监管人员来说是一个黑盒子,那么我们如何将其透明化,更好更快的发现问题从而提前避免风险呢?上文也提到软件树,其实我们每一次正确或失败的交付物其实都是一颗软件树,我们可以充分利用这颗树的信息,帮助我们避免二次故障,如下图:


DevSecOps - DevOps 与 安全理念的碰撞_java_04


我们某一次构建发现一个 Struts2 的漏洞(该漏洞允许黑客执行一个脚本到我们的服务器主机上)。我们可以根据历史构建的软件正向依赖树信息,快速在多个软件树中从下往上分析出该漏洞包的反向依赖,找出所有依赖该漏洞的项目,从而通知其他团队避免使用该漏洞包。进一步,我们还可以结合二进制仓库(Artifactory)管理元数据能力,将漏洞信息绑定到二进制包上,进而自动阻止该漏洞包的下载行为,例如包含漏洞元数据的二进制包禁止下载,如下图:


DevSecOps - DevOps 与 安全理念的碰撞_java_05


提高开发人员安全意识


DevSecOps 需要开发、运维和安全这三方面人员的通力合作,站在对方的视角客观看待问题。具体到开发人员而言,不仅仅需要开发技能,还需要对运维及安全有了解,对运维人员和安全人员也是一样,需要各自扩充不同领域的通用技能与知识。同时我们可以借助一些工具或者插件,在开发阶段提前发现隐藏的漏洞,促使开发人员有意识的提高安全意识,如下图:


DevSecOps - DevOps 与 安全理念的碰撞_java_06


总结


今天我们介绍了企业安全中常见的痛点及问题,并且介绍了国际上主流的一些实践,同时,对于大型企业,会有多个研发团队,甚至多个研发中心,我们需要统一监管软件所有交付物,防止漏洞上线到生产环境,并且建立企业漏洞数据中心,不断积累漏洞数据,引一句名言,你能看到多远的过去,就可以看到多远的未来,有了充足的历史数据可以提高我们交付的信心,稳定快速的发布,将 DevOps 和安全理念融合,落地 DevSecOps。