长期以来,安全问题一直被当作软件开发流程中的最后一步。开发者贡献可以实现软件特性的代码,但只在开发生命周期的测试和部署阶段考虑安全问题。随着盗版、恶意软件及网络犯罪事件飙升,开发流程需要做出改变。
 

开发过程中的“安全左移”是指将安全问题作为每个开发迭代和冲刺的重要组成部分。诸多组织正在系统地将安全实践纳入他们的DevOps流水线中,以最终形成 DevSecOps。DevSecOps 并不是单一的工具或技术。成功的 DevSecOps 是在一个框架中集成了多种实践和工具,确保企业在开发工作流程的所有阶段都考虑到安全问题,换言之,DevSecOps 并非一日之功,一个人或单个部门都无法独立负责 DevSecOps,它跨越了开发、网络安全、QA测试、IT运维和技术支持等团队。
 

本文将简述采用 DevSecOps 的优势和挑战,整个应用生命周期中 DevSecOps 框架的要素以及其中每个阶段的常用工具。
 

DevSecOps 中的基本概念

DevSecOps 是将安全额外加入到企业 CI/CD 工作流程中。DevSecOps 并没有取代现有的开发模式。相反,它通过在整个开发周期中增加一个安全层来扩展和补充这一模式。DevSecOps 是一种解决开发人员将安全检查和测试保留在项目后期阶段的方法——通常是在项目接近完成和部署阶段。
 

在后期阶段才进行安全检查会导致两种问题。安全缺陷可能在被发现之前已经进入已发布的软件,而在软件开发生命末期发现的安全问题比早期发现的问题需要更多的时间、资源和资金来补救。
 

越来越短的开发周期以及降低项目管理成本和商业风险的需要,使得安全左移成为众望所归的方法。如果将项目进度想象成从左到右排列的时间线,那么左移意味着将安全检查移到项目的开始阶段。安全及其他操作上的考虑越往左移,它们就越有可能被纳入产品的设计和搭建之中。DevSecOps 的目标是在设计、构建、测试和部署软件的过程中,开发人员对安全问题的重视不亚于其他主要的软件特性。
 

当完全实现 DevSecOps 时,它将会带来以下好处:

  • 为企业、客户及用户降低安全风险
  • 在产品生命周期早期发现软件的安全缺陷及漏洞
  • 更快修复安全问题
  • 改善开发、安全和运维团队之间的沟通和协作方式
  • 整体代码质量更好
     

然而,直接将安全纳入现有的敏捷开发流程中可能会带来一些弊端:

  • 改变现有工作流程,可能会出现瓶颈
  • 开发和安全团队都需要额外的培训以补充专业 知识
  • 由于沟通不畅或为了达成零漏洞的目标而导致开发工作流程中断

devops 建设过程中一些经验教训 devops 搭建_实用指南


图片来源:TechTarget

 

创建现代化的 DevSecOps 框架

由于DevSecOps是对现有软件开发实践的扩展或增强,因此最简单的做法是从敏捷的角度考虑DevSecOps框架,以此来进行规划、编写代码、测试、部署和持续运维。
 

规划和设计

DevSecOps 在软件开发生命周期的早期阶段开始,通常是设计或规划阶段。例如,安全问题会影响 Sprint planning 期间的目标设置。DevSecOps 框架通过以下方式将安全目标引入规划阶段:

  • 建立代码标准并进行同行评审。当开发者以不同的方式编写各部分代码时,安全缺陷可能进入产品中。一个团队如果建立并执行一套一以贯之的代码标准,并依据此套标准评估代码库,可以在极大程度上防止漏洞引入。同行评审可以确保代码确实符合标准并且能够发现常见的编程错误。
  • 在IDE环境中使用安全插件。IDE是可扩展的平台,通常可以安装各类安全插件以检查代码中潜在的漏洞,就像 IDE 可以标注出缺少的标点符号或语法错误一样。基于 IDE 的安全检查会在开发者向代码库进行提交之前为他们提供静态代码分析。
  • 进行威胁模型分析。威胁建模鼓励开发者像黑客一样对待一个应用程序。开发人员应该考虑到程序会被滥用的潜在风险,同时应该在程序目标设置中考虑到防止滥用的方法。常见的威胁模型分析方法包括STRIDE、DREAD和OWASP。多种威胁模型可以结合起来,以加强设计的安全性。
     

写代码及代码管理

DevSecOps 不仅仅指有安全意识的代码标准和同行评审。同时还意味着将安全置于代码库管理和维护的中心,以避免引入漏洞。确保代码提交和管理的安全的常用技术包括:

  • 管理依赖项的安全性。外部库、开源代码及重复使用的模块在软件开发中很常见。然而,外部代码可能并不遵循与企业内部工作流程一致的安全标准和防范措施。开发者应该检查所有依赖项的安全性,验证他们是否是官方发布的真实版本并安全地交付。
  • 扫描代码和代码仓库。代码仓库扫描工具可以在构建执行前对提交到仓库的代码进行静态分析,检查是否存在漏洞、硬编码凭证和其他常见的疏漏。漏洞测试和其他静态测试对于代码安全来说至关重要。代码仓库扫描为大型团队增加了安全性,因为团队中的开发者会访问同一个仓库。
  • 保护开发流水线的安全。在检测到安全问题后,一个完整的 DevSecOps 框架可能会调整开发工作流程以防止代码直接提交到默认或主干分支,直到问题得到解决。此外,攻击者还可以通过引入恶意代码或窃取凭证来破坏流水线本身。因此,企业应该在其开发流水线中进行安全管控。
     

测试

测试可以检测应用程序的缺陷和安全问题。构建、测试和发布流水线的自动化和编排应该包括当代码部署测试时运行的安全工具,如,在单元测试期间检查漏洞。DevSecOps 框架的常见测试注意事项如下:

  • 集成动态应用安全测试(DAST)。DAST 和渗透测试历来都是开发过程中的最后一步。DevSecOps 应该将DAST、渗透测试和其他类型的动态漏洞测试加入到流水线内构建阶段的测试方案中。完整的DAST和其他动态漏洞测试,如安全验收测试,可能很耗时,但也可以选择更轻量的测试方案,既可以更快地获取结果也能识别静态测试中遗漏的问题。
  • 保护基础设施安全。DevSecOps 的安全考量应该不仅仅局限于应用程序本身,还需要考虑到部署环境,无论是本地还是云端的基础设施(虚拟机、容器、K8S集群等)。借助微软、AWS等工具可以在云基础设施上执行安全驱动的策略。基础设施即代码(IaC)是构建标准和良好应用程序环境的一种方式。
     

部署和运维

即便构建成功,也并不意味着再也不会出现安全问题。DevSecOps 实践通过以下方式进入部署和运维环境:

  • 配置管理。托管应用程序的基础设施环境必须是稳定的。任何试图改变既定基础设施配置的行为都可能是恶意的。监控和执行基础设施配置的工具应该是一个组织的DevSecOps框架的核心要素。云供应商也提供这些工具,如Microsoft Defender for Cloud和Microsoft Sentinel。
  • 入侵检测和行为分析。分析工具(入侵检测和预防系统)可以建立流量模式和性能的基准线,然后基于此检测工作负载或网络中可疑或恶意的异常情况。这类工具已经发展成熟,可以被 DevSecOps 所采纳。
  • 持续的安全测试。DAST、渗透测试和其他类型的安全测试不应该止步于应用生命周期的测试阶段。定期执行测试(如端口扫描、模糊测试),并且只要团队怀疑代码中存在新的风险就应该进行测试。例如,如果一个新发现的漏洞出现在处理器的命令集中,运维或安全支持管理员应该采取行动。当测试确认了存在潜在的漏洞,他们就可以即刻着手开发和部署新的补丁。
  • 告警和报告。安全工具和策略需要配合全面的告警和报告。开发者和项目相关方应该收到可执行的情报以支持及时的鉴别和修复问题。
  • 事后复盘。即便做了最佳的安全工作,企业仍有可能最终在应用程序或基础设施中遇到安全问题。当安全事件发生时,进行事后总结是十分必要的。团队应该共同解决问题,并利用经验来调整未来的开发和运维工作,以避免重蹈覆辙。
     

DevSecOps 工具盘点

如果企业开始推动 DevSecOps 的实现,那么首先需要评估一下工具链及其中的每一个工具。一些组织已经使用了适合的DevSecOps 工具,而其他组织则需要更新或替换工具。市面上,有需要工具可以满足 DevSecOps 的需求,以下列出每个主要阶段的常见工具:
 
规划和设计阶段:团队需要针对安全注意事项进行协作和讨论。用于规划、问题跟踪和管理的常用工具有 Jira(软件供应链管理平台SEAL已实现对Jira的集成),以及通信工具Slack。威胁建模是 DevSecOps 下的一个主要规划问题,市面上有许多常用工具,如IriusRisk、CAIRIS、Kenna.VM、微软威胁建模工具、SD Elements、securiCAD、Tutamantic、Threagile、ThreatModeler和OWASP Threat Dragon等,它们均可提供威胁建模能力。
 

写代码及代码管理阶段:开发人员使用静态代码分析、IDE插件(如 pre-commit hooks)和代码仓库扫描来确保代码安全。代码审查工具包括PMD、Checkstyle、Gerrit、Phabricator、SpotBugs和Find Security Bugs。在选择代码审查工具时,要选择为项目的编程语言和IDE或工具链的互操作性设计的工具。
 
在构建阶段的DevSecOps 安全实践包括软件成分分析(SCA)、静态应用测试及单元测试,它们可以分析新代码和任意依赖项。常见的工具包括OWASP Dependency-Check、Retire.js, Snyk等。
 

测试阶段:测试阶段的重点是使用DAST来识别与应用程序操作相关的漏洞,如用户认证、授权、SQL注入和API端点。DAST工具包括Invicti(以前是Netsparker)、Astra Pentest、Acunetix、PortSwigger、Detectify、Rapid7、Mister Scanner、AppScan和AppCheck。
 
解决攻击代理和网络协议模糊的一般DevSecOps测试工具包括Boofuzz、OWASP Zed攻击代理、BDD-Security、AppScan、Gauntlt、JBroFuzz和Arachni。选择工具的依据是它们是否适合所需的应用类型和测试,以及它们与其他正在使用的工具的互操作性。
 

部署和运维阶段:一个DevSecOps的候选版本应该被安全地编码、进行构建检查和彻底的测试。紧接着,DevSecOps团队需要为版本发布搭建一个安全的操作环境,比如设置访问控制、网络防火墙访问和密钥管理。在部署阶段,变更和配置管理工具是DevSecOps框架的核心。常见的配置管理工具包括Red Hat Ansible、Chef、Puppet、Salt、HashiCorp Terraform和Docker。DevSecOps团队专注于实时运行环境中的情况。测试和生产环境之间的差异应该被识别并仔细研究,因为它们往往是安全出现问题的预兆。运行时性能工具包括Osquery、Falco和Tripwire。
 
此外,团队使用混沌工程工具,如Chaos Monkey和Gremlin,来评估部署中的,或者是未经测试的故障,如服务器崩溃、驱动故障和网络连接问题。其目的是让部署在中断中生存下来,或者优雅地失败。
 
反馈循环是DevSecOps成功的核心因素。除非工具产生的结果能够循环到开发过程中,否则这些工具是没有用的。利用整个工具链的报告和分析来评估当前版本的安全状态,并利用这种经验来改善下一个开发周期。
 

SEAL 如何帮企业实现 DevSecOps?

软件供应链管理平台 SEAL 可以帮助需要实现 DevSecOps 的企业以全链路的视角管理代码安全、构建安全、依赖项安全以及运行环境(K8S)安全,其可扩展的架构可以让开发者轻松将各阶段的工具集成其中,并为软件供应链整体提供简洁、直观的全局视图,帮助开发、安全和运维团队充分掌握全链路概况,以评估软件开发流程的安全状态。