在软件企业中,通常包含几个不同的团队,分别负责产品的客户需求与市场推广、产品的设计与开发、产品的运维和客户服务。这几个团队之间相互协作,以软件产品生命周期管理的形式,完成解决方案的交付。在典型的DevOps流程中,开发工程师、IT运维工程师、质量工程师等不同角色参与与协作,共同完成产品需求-设计-开发-部署的生命周期管理。
DevOps协作模式对于频繁交付的企业,面临持续版本迭代和快速响应周期的压力时,既能使客户需求快速地传导到后端,提高工作效率,又能通过自动化工具降低软件发布过程中的风险。但随着安全在软件质量中逐渐被重视,各个团队协作往往会出现安全团队与其他团队协作不畅、安全工作滞后、研发流程缺少安全控制环节等尴尬局面,于是就有了DevOpsSec的概念。
DevSecOps真正被业界关注是近几年自动化部署技术成熟之后才逐步被推广开来,2017年在亚洲DevSecCon大会上,演讲嘉宾Shannong Lietz提出“安全左移”的概念,其核心理念是DevSecOps,强调安全是整个IT团队(包括开发、运维及安全团队)每个人的责任,通过管道化流程、加强不同人员之间的协作,以工具、技术手段将重复性的安全工作自动化地融入研发体系内,让安全属性嵌入整条IT流水线。
与SDL所强调的系统性安全设计不同,DevSecOps更注重安全文化建设和全流程的能力打通,通过工具化、平台化的管道流,集成各种安全能力,达到多个团队链式协作的效果。在DevSecOps中,安全更接近于当前业界提出的“原生安全”概念,是从软件生产、软件供应链的源头,构建内置的安全能力。比如在原有的DevOps流程中,添加威胁建模,引入代码质量检查,通过静态代码分析检查代码缺陷,使用Docker容器构建部署安全能力等。
在传统的协作模式中,安全通常是滞后的。一种情况是产品发布或交付后,产品在线上发生了安全问题,再由开发人员回溯问题产生的原因,完成问题整改;另一种情况是软件的编码开发已经结束,安全团队才介入产品的发布流程,对软件产品做发布前的安全审查。这两种情况中,无论是哪种,与其他团队的合作都是滞后的。但随着各行各业对安全越来越的重视,面对诸多问题开发团队感到无从下手,开发团队的管理层希望安全团队更早的介入研发流程,以帮助他们生产出高质量的软件,这也是DevSecOps所期望达到的目的。
在DevSecOps实施过程需要关注以下关键要点。
- 安全左移:DevSecOps致力将安全引入开发阶段,通过在API开发早期引入安全环节来降低传统模式下安全工作滞后带来的返工成本。在DevSecOps安全共同担责的文化下,鼓励开发工程师参与安全工作,分析安全需求,熟悉安全缺陷用例,编写出可信任的代码;鼓励质量工程师尽早参与安全质量管理过程,关注安全问题产生的原因、安全问题的数量、安全问题危害等级以及安全问题修复情况,从整个生命周期的开发与维护的视角关注安全质量与成本。
- 安全自动化:DevSecOps关注整体流程的工具化和自动化,对于安全工作来说,为了减少对研发流程的影响,可以利用API网关、微服务、持续集成与部署(CI/CD)、容器化以及云原生技术,将安全工作规范化、组件化、自动化,通过定点监控和审计来跟踪流程的执行和覆盖情况。
- 持续运营:DevSecOps并非解决所有安全问题的灵丹妙药,通常在组织内的推进过程是循序渐进的,在推进过程中,逐步添加或调整安全活动的数量与安全活动在流程中的位置,建立数字化运营指标,对DevSecOps执行过程的数据进行采集、分析,直到监控的数据能表明当前可以发现的安全问题数量足够少,有足够的安全能力能保障API的安全性。同时,当内外部环境发生变化时,及时调整安全需求的输入,帮助企业关注API安全工作的重点,获取最佳的投入产出比。
在DevOps管道中,开发人员面向持续集成平台(CI),当代码提交后,关键评审环节与自动化单元测试或集成测试同时进行,当最后都确认没有问题,审核通过,合并到中央源代码存储库供持续发布阶段使用。当代码合并到中央源代码时,将触发持续发布(CD)流程,质量管理人员介入,同时自动启动安全测试。当最后都确认没有问题时将新的代码打包到软件中,创建自动化发布需要的基础设施组件。
而在DevSecOps中提倡持续安全,安全在管道流中融入更深,基本分布在持续集成、持续发布、基础设施运营中的每一个阶段。安全团队会和DevOps团队一起,定义和实施安全控制要求,明确安全基线。CI/CD持续运行,静态检测、动态扫描、运营监控,伴随着版本迭代持续运转。理想状态下,大多数安全工作已经自动化,只有在应急或特殊场景下才需要手工操作。
DevSecOps管道中各个关键活动的串联,在流程上依赖于平台与工具,在单点能力上依赖于SDL。一个典型的DevSecOps平台包含如下功能模块。
- 流水线管理:主要为各个角色提供统一入口,包含任务编排与配置、过程数据的统计度量、组织机构与用户的基础信息以及权限访问控制等。
- 工程管理:从项目的角度,管理需求和任务以及整体缺陷,包含功能缺陷、安全缺陷、质量缺陷等。
- 代码管理:主要为代码仓库的管理,管理代码的分支、代码的存储、代码静态检测以及代码评审的协作流程等。
- 构建管理:为持续集成地构建环境,管理编译选项配置、容器构建参数配置等。通过编译与构建,生成代码制品。
- 制品库管理:构建完成后生成的代码制品,统一存放的制品库,并对代码制品进行持续检测,关注组件依赖与组件安全问题、组件许可协议以及供应链的安全性。
- 部署管理:管理自动化部署的各种环境,如应用所需要的环境、主机环境、基础设置环境等。管理部署架构以及部署前的各项自动化测试,比如功能测试、安全测试、性能测试等。
- 运维管理:通过线上的周期性监控,及时发现线上问题,做出应急响应。
每一个功能模块中,都涉及不同的工具,为平台提供能力支撑。常用的工具如下。
- 工程管理:主要有Jira、Confluence、禅道等。
- 代码管理:主要有SVN、GitLab、SonarQube、Fortify、Coverity、Checkmarx等。
- 构建管理:主要有Jenkins、Nexus、Hudson、Maven、JUnit等。
- 制品库管理:主要有Protecode SC、Dependency-Check、Artifactory、Harbor等。
- 部署管理:主要有Kubernetes、Docker、OpenShift、OpenSCAP、ZAP、AppScan等。
- 运维管理:主要有Zabbix、Prometheus、SkyWalking、Nessus、ModSecurity等。