先进的DevSecOps管道定制

在您启用第一个应用程序或微服务后,了解 DevSecOps 采用的高级功能。

请务必查看 基础知识DevSecOps管道定制。 在这里,您可以了解可用的不同模板、支持选项以及其他重要信息,帮助您入门DevSecOps。

设计选项

当你加入更多应用程序和微服务时DevSecOps,您可能有以下设计问题:

  • 我是否需要每个微服务一个工具链?
  • 我是否需要每个微服务一个管道?
  • 我需要使用共享DevSecOps库存和问题的存储库,还是我需要单独的存储库?

以下信息和最佳实践旨在帮助您做出这些设计选择。

工具链和管道注意事项

大多数应用程序由具有不同源存储库的多个微服务组成。 通常,单个工具链用于托管逻辑分组的微服务。 通常,使用一个工具链和一个管道,或者使用尽可能少的管道,但使用多个触发器。 在每个管道中,您可以根据需要复制和配置任意数量的触发器,每个管道最多有 1024 个触发器。 此策略可帮助实施公共流程,脚本和配置文件。 有关更多信息,请参阅 在一个 CI 工具链上配置多个应用程序

这种方法有以下优点:

  • 使用较少的管道可避免重复并减少错误。 更新也更易于维护,例如,添加,编辑或删除环境属性或私钥时。
  • 使用此方法可以更快地加载服务。 为微服务添加 Git 集成,复制 Git 和手动触发器,并根据需要进行修改。 然后,确保为您的微服务实现了 .pipeline-config.yaml 文件和脚本。

此方法具有以下缺点:

  • 一次编辑会影响使用同一管道的每个团队。
  • 用户访问权通过使用 Identity and Access Management(IAM) 进行管理,并且是在工具链级别 (而不是管道级别) 设置的。 因此,如果要将单个工具链用于多个服务,那么团队的每个成员都可以查看其他团队的管道。 根据用户在 IAM 中的访问权,他们可能能够编辑,删除或触发管道。

计费注意事项

Continuous Delivery 服务根据每个 CD 实例的授权用户数量以及工具链使用的资源组数量确定计费。 有权访问存储库的用户也被视为授权用户。 有关更多信息,请参阅 授权用户。 要降低成本,要么将所有工具链组织到同一个资源组中,要么在企业账户层次结构中配置 Continuous Delivery 综合计费。 更多信息,请参阅 合并计费

DevSecOps存储库注意事项

如果你正在创建由多个微服务组成的应用程序,那么大多数DevSecOps除证据存储库之外的存储库可以在微服务之间共享。

有关详细信息,请参阅For more information, see 如何DevSecOps管道使用存储库

共享配置库注意事项

这DevSecOps示例应用程序附带有同地。pipeline-config.yaml配置文件和相应的脚本。 在加入多个微服务时,最佳做法是将源代码存储库与DevSecOps配置文件和脚本。 将它们存储在可由 CI,CD 或 CC 管道使用的单独的专用公共配置存储库中。

这包括:

  • 专用 Git 存储库,用于托管公共脚本库和pipeline-config.yaml 文件。
  • 单个pipeline-config.yaml 文件,它是所有服务的公共文件。 如果它太复杂或不可能,请使用不同的.pipeline-config.yaml 文件。
  • 基于每个文件夹进行定制。 实现pipeline-config.yaml 文件以指向配置存储库中的不同脚本文件夹。 在单独的 CI,CD 和 CC 文件夹中组织脚本,或者根据服务语言 (Go,Python,NodeJS),服务,应用程序名称或任何最适合您需要的内容来组织脚本。

通过将 pipeline-config-repo 管道属性(可选,pipeline-config-branch )的值设置为共享配置库 URL,即可更改管道以使用该共享配置库。

库存存储库注意事项

可以在许多管道和工具链之间共享单个库存存储库。 多个 CI 工具链,管道和触发器可以添加到同一个库存存储库中。 CI 管道通常在发布阶段将更新推送到库存存储库。 然后,库存存储库将用作 CD 管道的源输入。 通常,最佳实践是将库存存储库分组到同一工具链中,以减少最终创建的变更请求数。

使用共享库存存储库是在开始加载微服务之前需要做出的体系结构决策,因为此决策会影响在管道运行时创建的变更请求数。 例如,假设你想加入 10 个微服务DevSecOps。 您可以有 10 个不同的 CD 工具链,其中有 10 个不同的库存存储库,这将在每次 CD 管道运行时产生 10 个不同的更改请求。 如果共享公共库存存储库和公共 CD 工具链,那么更容易管理这 10 个不同的微服务。 这将仅产生一个变更请求,即使您对多个微服务进行更新也是如此,因为这些微服务都共享库存存储库和工具链。

问题存储库注意事项

问题存储库是跟踪微服务的所有漏洞问题的存储库。 如果您决定使用共享库存存储库,那么可能还需要使用共享问题存储库。

在管道或触发器级别设置 incident-assignessincident-labels 可帮助自动将问题分配给正确的团队。 有关更多信息,请参阅 连续部署参数

IBM Cloud Object Storage 注意事项

如果使用共享清单存储库,也可以使用 IBM Cloud® Object Storage 的共享实例。 完成以下步骤:

  1. 创建要在工具链和管道之间使用的 IBM Cloud Object Storage 实例
  2. 设置管道和触发器 (如果适用),以通过设置 cos-bucket-name 环境属性来使用 IBM Cloud Object Storage 存储区。

无论部署环境如何,同一 CI、CD 和 CC 管道中的所有微服务都共享一个 Object Storage 桶。 Object Storage 桶的功能与证据存储库类似,但没有大量证据存储库可能出现的性能问题。 由于大量 Object Storage 文件桶不会出现性能问题,因此无需对 Object Storage 文件桶中的证据进行修剪。

Object Storage 水桶粒度

DevSecOps 管道对 Object Storage 桶的粒度没有意见。 从技术上讲,您可以在整个组织中使用一个 Object Storage 存储桶。 不过,粒度不应小于清单,因为清单是可以一起移动的微服务的最小逻辑分组。

实际上,粒度的大小取决于合规团队管理合规数据所需的操作模式:

  • 如果合规团队能够自如地管理多个 Object Storage 数据桶,并对数据进行分门别类,那么这是一种可行的模式。
  • 如果他们更喜欢管理一个更大的 Object Storage 数据桶,并且不对数据进行分门别类,也是可以的。

一个关键的考虑因素:Object Storage 桶(证据柜)的目的是系统可读,而非人类可读。 它不支持,而且在可预见的未来也不会支持按存储库、微服务、产品或组织组织的文件夹结构。 它仍然是资产和证据的扁平化结构。

安全和访问考虑因素

粒度较小的 Object Storage 桶可在发生安全漏洞(例如,暴露 Object Storage API 密钥)时增加爆炸半径。 它还会产生交叉可见性问题,即如果一个垂直产品共享同一个桶,则有可能读取另一个产品的合规数据。

迁移注意事项

如果需要,有办法在 Object Storage 存储桶之间进行迁移。 这通常涉及为备份 Object Storage bucket 配置某些环境属性,以及重建 CI 组件。 更多信息请参阅本 文档。 不过,这些操作旨在作为一次性迁移活动,而不是作为日常业务工作流程的一部分。

部署到多个环境

可以通过多种方式将 CD 管道部署到多个目标环境。

每个 targeted environment 都应该在库存存储库中具有相应的分支,其中更改从 source 提升到 target 分支。

以下可选设计可能适合您的体系结构:

  • 针对每个目标环境使用一个手动触发器。 复制触发器,然后编辑环境属性以适应新环境。
  • 使用 Git 配置存储库,每个目标环境一个文件夹,其中特定配置设置存储在文件中。

使用缺省脚本和定制脚本

大多数安全性和合规性脚本都随附 缺省脚本,如果没有为阶段提供定制脚本,那么这些脚本将运行。 有时很难确定运行哪个脚本,在何处查找相应的源脚本以及如何覆盖缺省脚本。

确定要运行的脚本

要识别针对某个阶段运行的脚本,请打开管道运行 (最好是 CI 管道)。 展开任务,然后单击 run-stage 以打开日志。 run-stage 日志的开头提供了有关阶段中使用的脚本的信息,包括脚本所在的存储库。 在日志中,您可以滚动以查找有关已运行的脚本的更多详细信息。 例如,code-compliance-checks 任务可能在 run-stage 日志中具有以下信息,其中包括阶段的环境属性:

compliance-checks:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
  dind: true
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  script:
    #!/bin/sh

    "/opt/commons/compliance-checks/run.sh"

在该示例中,运行的脚本为 /opt/commons/compliance-checks/run.sh,它位于 commons library 中。 使用此公共库作为源来复制可针对特定边缘案例定制的代码。 在该示例中,compliance-checks/run.sh 位于 compliance-commons 库 中。

覆盖缺省脚本

要覆盖缺省脚本,请完成以下步骤:

  1. 在阶段日志中,复制用于标识缺省脚本的片段:
compliance-checks:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
  dind: true
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  script:
    #!/bin/sh

    "/opt/commons/compliance-checks/run.sh"
  1. 将片段粘贴到 .pipeline-config.yaml 文件中。
  2. 在调用脚本之前或之后添加定制代码。 这段代码调用默认的 合规性检查脚本
  3. 根据需要编辑,删除或添加属性。

以下示例显示了 .pipeline-config.yaml 文件中的已更新脚本:

compliance-checks:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
  dind: true
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  script: |
    #!/bin/sh
    # run some custom script here
    ./scripts/my-custom-script1.sh

    "/opt/commons/compliance-checks/run.sh"

    # then some additional work
    ./scripts/my-custom-script2.sh

有关更多信息,请参阅 定制脚本

要使用的 Terraform 模板DevSecOps工具链即代码

以下工具链提供代码来创建DevSecOps使用 Terraform 的 CI、CD 和 CC 工具链:

正在按现状提供对这些 Terraform 工具链的早期访问。 这些工具链处于活动开发状态,因此变量和变量名称可能会更改。