使用 亚马逊云科技 CodeBuild 平衡监管和敏捷性

作者: 布莱恩·比奇 康纳·凯西 | 202

简介

在我的职位上,我经常与客户进行对话,这些客户希望强制执行安全和治理最佳实践,同时为开发人员提供快速创新所需的灵活性和敏捷性。当您采用 DevSecOps 您可能会寻求在 持续集成和持续交付 CI/C D 管道中平衡治理和 灵活性。在这篇博客文章中,我将讨论如何使用 亚马逊云科技 CodePipeline 和亚马逊云科技 Code Buil d来实现这些目标。

背景

在我探讨这个场景之前,让我讨论一下所涉及的典型角色——平台工程师和开发人员。传统上,运营团队负责设计、部署、配置和维护构成 IT 基础架构的不同组件的过程。另一方面,开发团队负责设计、开发、部署和维护在底层 IT 基础架构上运行的应用程序的过程。在这个模型中,有明确的职责分工。但是,随着 DevOps 的出现, 这些角色发生了变化。开发团队使用 基础设施即代码 (IaC) 将基础设施作为应用程序代码的一部分进行配置。在这种情况下,运营团队逐渐演变为发挥监督作用,确保所部署的资源符合最佳实践。我将这个新的监督角色称为平台工程团队,以区别于传统的运营团队。

DevSecOps 以 DevOps 为基础,促进在软件开发生命周期的早期引入安全控制。安全团队定义了在整个过程中纳入安全控制措施的最佳实践。这些控制措施通常是在 CI/CD 管道中强制执行的。结果,安全团队的角色也发生了变化。安全团队没有进行手动安全审查,而是定义自动控制并确保在管道中实施这些控制,通常由平台工程师创建。但是,平台工程师必须在不妨碍开发人员灵活性的情况下强制执行这些控制。毕竟,DevOps 就是要提高开发生命周期的速度。在这篇文章中,我将讨论如何将安全控制措施分开并将流程分成管道的不同阶段。这使平台工程师能够分阶段实施安全控制,而开发人员可以快速更新他们拥有的阶段。

亚马逊云科技 CodePipeline 是一项完全托管的持续交付服务,可帮助您实现部署管道的自动化。管道由分 阶段 组织的 操作 组成 。这些操作通常通过 亚马逊云科技 CodeBuild 来实现。每个 CodeBuild 操作都定义了从何处获取源代码、要使用的构建环境以及要运行的生成命令。 编译命令以 YAML 格式在 构建 规范中定义。 编译规范可以存储在 CodeBuild 配置中,也可以作为文件存储在源代码中。在 CodeBuild 配置中定义构建规范时,平台工程师可以保留所有权。当在源代码中定义了 buildspec 时,开发人员可以轻松地对其进行更改。该管道可以包含多项操作,以平衡治理和敏捷性。

在下面的演练中,我将介绍一个包含两个 CodeBuild 操作的简单管道。平台工程师创建管道,包括定义安全控制的构建操作。举个例子,我将使用 OWASP 依赖关系检查器 来执行 软件 组合分析。 此操作的构建规范在 CodeBuild 配置中定义,平台工程师保留所有权以及总体管道定义。定义了第二个生成操作来构建和测试源代码。这个 buildspec 是在源代码中定义的,开发人员可以随时对其进行更改。请注意,图中的管道还包括 使用 亚马逊云科技 CodeCommi t 实现的源操作和使用 亚马逊云科技 C odeDeploy 实现的部署 操作,但这些操作超出了本文的讨论范围。

Pipeline with four stages including: Source; Software Composition Analysis; Build and Unit Test; and Deploy

草率排练

在本节中,我将扮演平台工程师的角色,引导您完成前面描述的简单管道的创建。为了简单起见,我将使用亚马逊云科技控制台,但是我建议使用 亚马逊云科技 CloudFormat ion 或 亚马逊云科技云开发套件 (CDK) 管道 进行现实世界的部署。

开发团队已经将其代码添加到 CodeCommit 存储库中。除了源代码外,他们还在存储库的根目录中包含了以下 buildspec.yaml 文件。

version: 0.2
phases:
  install:
    runtime-versions:
      python: 3.11
  build:
    commands:
      - pip install -r requirements.txt
      - pylint helloworld
      - coverage run --branch -m pytest

如你所见,这个编译规范使用了 python 3.11 运行时。它安装需求,运行 linter,并运行具有代码覆盖率的单元测试。鉴于源代码中包含 buildspec.yaml,开发人员可以添加任何他们想要的内容。他们可以完全控制此操作的生成过程。这给了他们很大的自主权和灵活性。

我现在已经准备好开始创建管道了。首先,我将创建一个新的 CodeBuild 项目来运行开发团队的构建,该版本在之前研究的 buildspec.yaml 中定义。我打开 CodeBuild 控制台 并选择 “ 创建项目 ”。我将我的项目命名为 “构建和测试”。CodeBuild 用户指南中标题为 “创建构建项目” 的部分介绍了 创建 CodeBuild 项目的 过程 ;但是,我想提请你注意 Build spec 配置。在这里,我选择 使用 buildspec 文件 并提供文件在存储库中的位置。

CodeDeploy Buildspec configuration with “use a buildspec file” selected

使用源代码中定义的buildspec,我允许开发团队定义构建过程。这使开发人员可以控制权和自主权,使他们能够随着项目随着时间的推移而改变其构建过程。他们不必每次想进行更改时都要求我更新构建命令。此外,由于我将使用所需的安全工具添加第二个构建操作,因此我不必审核他们的 buildspec.yaml 文件的内容。我无需确认开发人员已包含所需的安全工具。

接下来,我将创建另一个 CodeBuild 项目来运行软件组合分析 (SCA)。我返回 CodeBuild 控制台 并选择 “ 创建项目 ”。我把这个项目命名为 “软件组合分析”。除了 B uildspec 配置外,该项目的 配置与之前的项目几乎相同。这次,我选择 插入生成命令 并将生成命令直接输入到项目配置中。在下图中,我添加了用于安装和运行 OWASP 依赖项 检查器的构建命令。

CodeDeploy Buildspec configuration with “Insert build commands” selected

使用项目定义中定义的构建规范,我可以使用A WS身份和访问管理 (IAM) 策略来确保开发团队无法对其进行更改。现在,我确信所需的安全工具已正确安装和配置。我不需要依赖开发人员来正确配置安全工具。此外,我可以自主更改使用的工具,而无需打断开发人员或修改他们的代码。

定义了两个生成操作后,我可以创建一个管道来自动化整个构建过程。我按照在 CodePipeline 中 创建管道中的说明创建了以下管道 在构建阶段,我运行 SoftwareCompositionAn alysis 操作,然后运行 BuildandTest 操作。 请注意,这些操作按顺序执行。因此,如果在 So f twar eCompositionAnalysis 操作中发现问题,则生成和测试 操作将无法运行。

CodePipeline editor with Source, Build, and Deploy stages

现在,我确信我的安全工具已在管道中正确配置。此外,开发人员保留对构建和测试操作的控制权,允许他们根据需要更改构建步骤。此外,如果我支持许多类似的项目,我可以使用 CloudFormation 或 CDK 来定义管道。这将允许我使用同一个模板部署多个管道,并随着安全标准的发展更新所有管道。显然,我在这篇文章中创建的管道是一个简单的例子。现实世界中的管道可能会定义许多操作。其中一些操作将在项目定义中定义,并由平台工程师管理。其他任务将涉及存储在源代码中并由开发人员管理的 buildspec 文件。查看 部署管道参考架构 (DPRA), 了解包含多个阶段和操作的强大管道示例。

清理

如果你一直在关注,请删除 这两个 CodeBuild 项目 , 删除 Code Pip eline 管道 以及你添加到管道中的任何其他操作(例如 Cod eCommit 或 CodeDeplo y)。

结论

随着客户采用 DevSecOps,他们寻求在 CI/CD 管道中平衡治理和灵活性。在这篇文章中,我讨论了如何使用CodeBuild来允许平台工程师配置某些操作,而开发人员配置其他操作。这使您可以确保在不影响开发团队灵活性和敏捷性的前提下适当实施安全控制。要开始使用,请阅读有关 亚马逊云科技 CodePipeline 和 亚马逊云科技 Code B uild 的更多信息。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。