IBM Cloud Docs
初心者向けの DevSecOps パイプラインのカスタマイズ

初心者向けの DevSecOps パイプラインのカスタマイズ

DevSecOps を採用し、最初のアプリケーションまたはマイクロサービスをオンボードするための基本について説明します。

DevSecops ツールチェーンについて

DevSecOps のベスト・プラクティスとセキュリティー・ツールを実装する IBM Cloud DevSec操作 Continuous Integration (CI)、Continuous Deployment (CD)、および Continuous Compliance (「CC」) ツールチェーンをディスカバーしてテストしました。

これで、独自のアプリケーションまたはマイクロサービスをオンボードし、 DevSecOps を採用する準備ができました。

開始前に

DevSecOps ツールチェーンにアプリケーションをオンボードするには、以下のリソースが必要です。

  • アプリケーションのコードを含むアプリケーション・ソース・コード Git リポジトリー。多くの場合、「アプリ・リポジトリー」と呼ばれます。
  • .pipeline-config.yaml ファイル。 このファイルは、パイプライン実行プロセスのいずれかのステージをカスタマイズするために CI、CD、および CC パイプラインによって使用されるコア構成ファイルです。 サンプル .pipeline-config.yaml ファイル の使用を開始します。このファイルをダウンロードして、ニーズに合わせてカスタマイズすることができます。 開始ステージ以外のすべてのステージは、 .pipeline-config.yaml ファイルを使用してカスタマイズできます。 このファイルは、アプリケーションをビルド、テスト、およびデプロイするためのカスタム・スクリプトをトリガーして実行します。 .pipeline-config.yaml ファイルの名前を変更することも、異なるパイプラインまたはトリガーに対して異なるファイルを使用することもできます。 パイプラインまたはトリガーのパラメーター値が構成ファイルと一致していることを確認してください。 詳しくは、 パイプライン・パラメーター を参照してください。

IBM Cloud には、作業を開始するための以下の DevSecOps テンプレートがあります。

DevSecOps パイプラインがリポジトリーを使用する方法

アプリケーションをビルド、テスト、およびデプロイするために、 DevSecOps パイプラインは以下の 2 つのリポジトリーを使用します。

  • app-repo: アプリケーションのソース・コードが含まれているアプリケーション・リポジトリー。
  • config-repo: 構成リポジトリー。これには、パイプライン構成 YAML ファイルおよびスクリプトが含まれています。

DevSecOps サンプル・アプリ では、これらの 2 つのリポジトリーは同じです。 ほとんどの DevSecOps 採用者は、このパターンから開始します。 しかし、より多くのマイクロサービスをオンボードするにつれて、専用の別個のパイプライン構成リポジトリーが必要になる場合があります。 サンプル・アプリケーションではアプリケーション・リポジトリーと構成リポジトリーが同じであるため、パイプラインの実行時にリポジトリーが 2 回複製されるため、エラーが発生する可能性があります。 したがって、異なる DevSecOps ツールチェーンおよびパイプライン間で共有して再利用できる構成ファイルおよびスクリプトをホストするために、別個の構成リポジトリーを用意することがベスト・プラクティスです。 構成リポジトリーのカスタマイズについて詳しくは、 拡張カスタマイズ・ステップ を参照してください。

DevSecOps スクリプトは、 app-repoconfig-repo を 2 つの別個のリポジトリーと見なします。 スクリプトは、パイプラインの開始ステージ中にリポジトリーを 2 回複製します。 これらのクローンは、 app-repo および one-pipeline-config-repo と呼ばれます。 各ステージは、 config repo のコンテキストで実行されます。

アプリケーションのオンボード

簡単にするために、続行する前に、 サンプルの Node アプリケーション を使用して DevSecOps CI ツールチェーンを作成してテストしてください。

最初のアプリケーションを既存の DevSecOps CI ツールチェーンにオンボードするには、主に以下の 3 つの方法があります。

  • オプション 1: アプリケーション・リポジトリーをツールチェーンに追加し、サンプル・アプリケーション・リポジトリーを構成リポジトリーとして使用します。
  • オプション 2: サンプル・アプリケーション・リポジトリーをご使用のアプリケーション・リポジトリーに置き換えます。
  • オプション 3: アプリケーション・リポジトリーをツールチェーンに追加し、専用の構成リポジトリーを使用します。 このオプションについて詳しくは、 拡張カスタマイズ・ステップ を参照してください。

DevSecOps ツールチェーンは、GRIT とも呼ばれる IBMによって管理される Gitlab リポジトリーを使用します。 代わりに、他の Git プロバイダーを使用できます。 例えば、アプリ・リポジトリーが GitHub または Gitlab でホストされている場合があります。

オプション 1: アプリケーション・リポジトリーを追加し、サンプル・アプリケーション・リポジトリーを構成リポジトリーとして使用する

アプリケーション・リポジトリーをツールチェーンに追加し、サンプル・アプリケーション・リポジトリーを構成リポジトリーとして使用するには、以下のステップを実行します。

  1. IBM Cloud コンソールで、 「メニュー」 アイコン 「メニュー」アイコン > DevOps > 「ツールチェーン」 をクリックし、編集するツールチェーンを選択します。
  2. 追加 をクリックします。
  3. アプリ・リポジトリーがホストされている場所 ( Gitlab または GitHub) を選択します。
  4. デフォルト・サーバーを使用するか、新規サーバーを追加します。
  5. カスタム・サーバーの URL と個人用アクセス・トークンを入力します。
  6. 「統合の作成」 をクリックします。
  7. アプリケーション・ソース・コード・リポジトリー URL を入力します。
  8. 「統合の作成」 をクリックします。

次に、以下のステップを実行して、サンプル・アプリケーション・リポジトリーを構成リポジトリーとして指定します。

  1. IBM Cloud コンソールで、 「メニュー」 アイコン 「メニュー」アイコン > DevOps > 「ツールチェーン」 をクリックし、編集するツールチェーンを選択します。
  2. 「pr-pipeline」 をクリックします。
  3. 「設定」 をクリックして、 「環境プロパティー」 タブに移動します。
  4. サンプル・アプリケーション・リポジトリー URL を指すように pipeline-config-repo プロパティーの値を編集します。
  5. CI ツールチェーンに戻ります。
  6. 「ci-pipeline」 をクリックします。
  7. 「設定」 をクリックして、 「環境プロパティー」 タブに移動します。
  8. サンプル・アプリケーション・リポジトリー URL を指すように pipeline-config-repo プロパティーの値を編集します。

これで、CI パイプラインはサンプル・アプリ・リポジトリー pipeline-config を構成リポジトリーとして使用します。

オプション 2: サンプル・アプリケーション・リポジトリーを独自のアプリケーション・リポジトリーに置き換える

サンプル・アプリ・リポジトリーを独自のアプリ・リポジトリーに置き換えるには、以下の手順を実行します。

  1. IBM Cloud コンソールで、 「メニュー」 アイコン 「メニュー」アイコン > DevOps > 「ツールチェーン」 をクリックし、編集する CI ツールチェーンを選択します。
  2. サンプル・アプリケーションのソース・コード・リポジトリーを見つけ、 「構成」 を選択します。
  3. リポジトリー URL をアプリケーション・ソース・コード・リポジトリー URL に置き換えます。
  4. **「統合の保存」**をクリックします。

サンプル・アプリ・リポジトリーを置き換えた後、新しいアプリ・リポジトリーに .pipeline-config.yaml ファイルと対応するスクリプトが含まれていることを確認してください。 .pipeline-config.yaml ファイルとスクリプトをサンプル・アプリケーション・リポジトリーからアプリケーション・リポジトリーにコピーするか、 このサンプル構成ファイル を使用します。

CI パイプラインの構成

アプリケーション・リポジトリーを追加した後、新規リポジトリーと連携するように CI パイプラインを構成する必要があります。

パイプライン・トリガーの構成

デフォルトのトリガーはサンプル・アプリケーション・リポジトリーを使用するため、アプリケーション・リポジトリーを使用するように更新する必要があります。 トリガー設定を確認し、必要に応じて変更して、すべてのトリガーがアプリ・リポジトリーを指すようにします。 以下のステップを実行します。

  1. IBM Cloud コンソールで、 「メニュー」 アイコン 「メニュー」アイコン > DevOps > 「ツールチェーン」 をクリックし、編集する CI ツールチェーンを選択します。
  2. 「pr-pipeline」 をクリックします。
  3. Git PR Trigger を編集し、アプリケーション・リポジトリーの URL とブランチを指定します。
  4. 保存 をクリックします。
  5. CI ツールチェーンに戻り、 「ci-pipeline」 をクリックします。
  6. Git CI Trigger を編集し、アプリケーション・リポジトリーの URL とブランチを指定します。 「プロパティー」 セクションで、アプリケーション名が正しいことを確認します。
  7. 保存 をクリックします。
  8. 「手動トリガー」 を編集します。 「プロパティー」 セクションで、アプリ名が正しいことを確認します。
  9. リポジトリーとブランチのプロパティーが正しいこと、およびアプリ・リポジトリーを指していることを確認してください。

.pipeline-config.yaml ファイルの構成

.pipeline-config.yaml ファイルをサンプル・アプリケーション・リポジトリーからアプリケーション・リポジトリーにコピーするか、 このサンプル構成ファイル を使用します。

pr-pipelineci-pipeline の両方について、 pipeline-configpipeline-config-branch、および pipeline-config-repo パラメーターが正しく設定されており、ご使用の構成と一致していることを確認してください。 これらのパラメーターが正しく設定されていない場合、誤ったブランチに変更をコミットして、パイプラインでエラーが発生する可能性があります。

pipeline-config-repo 変数が設定されていない場合、 DevSecOps パイプラインは、それがアプリケーション・ソース・コード・リポジトリーと同じリポジトリーであると想定します。

DevSec操作でのカスタム・スクリプトの使用

pipeline-config.yaml ファイルは、 DevSecOps パイプラインの動作を調整およびカスタマイズするキー・コンポーネントです。 このファイルは、スクリプトを使用してアプリケーションをビルド、テスト、およびデプロイします。 このファイルは、ステージの構成方法、および実行するスクリプトを定義します。 詳しくは、 カスタム・スクリプト を参照してください。

DevSecOps パイプラインによって使用されるスクリプトには、主に次の 2 つのカテゴリーがあります。

  • アプリケーションのビルド、テスト、およびデプロイに使用されるアプリケーション関連スクリプト。 これらのスクリプトは、お客様自身の責任で、 DevSecOps サポートの範囲外になります。 これらのスクリプトにはデフォルトの実装がないため、アプリケーションまたは構成リポジトリーに追加する必要があります。 Jenkins または別のソースからスクリプトをプルする必要がある場合があります。
  • セキュリティー・スキャンおよびコンプライアンス・スキャンを実行するセキュリティー・スクリプトおよびコンプライアンス・スクリプト。 ほとんどの場合、独自のカスタム実装を使用するためにオーバーライドできる デフォルト・スクリプト が付属しています。

開始ステージを除き、CI、CD、または CC パイプラインの各ステージは、独自のスクリプトを使用してカスタマイズして、ステージのデフォルト実装をオーバーライドすることができます。 独自のスクリプトを使用して開始ステージをカスタマイズすることはできません。

Bash スクリプトはサンプルとして提供されていますが、 Python や Go などの他の言語を使用してアプリケーションをビルド、テスト、およびデプロイすることができます。 各ステージに正しい image を使用していることを確認します。 DevSecOps パイプライン・セクションの Docker イメージ を参照してください。

CI パイプラインのさまざまなステージを要約した ステージとタスク の表を参照してください。 また、この表には、ステージにデフォルトの参照実装があるかどうか、カスタマイズまたはスキップできるかどうか、またはステージの実行に必要な明示的なエビデンス収集があるかどうかについての統合情報も示されます。

Jenkins または Travis から DevSecOps へのマイグレーション

ほとんどの DevSecOps 採用者は、何も開始しません。 ほとんどの導入者は、対応するスクリプト・ライブラリーとともに、継続的統合プロセスと継続的デリバリー・プロセスを既に実施しています。 これらのプロセスは通常、 Jenkins、Travis、またはその他のプラットフォームを使用して実装されます。

DevSecOps へのマイグレーションのためのキー・ポイントは以下のとおりです。

  • pipeline-config.yaml 構成ファイルは、CI および CD パイプラインが現在どのように調整されているかを反映している必要があります。 ステージとステップは、 DevSecOps パイプライン・ステージ にマップする必要があります。
  • 既に設定されているものと同じスクリプト、基本イメージ、および変数を使用する必要があります。
  • シークレットのプロパティーは、 シークレット・ストア にマイグレーションする必要があります。
  • 非シークレット・プロパティーは、パイプライン・プロパティーまたはトリガー・プロパティーとして追加する必要があります。

開発モードでの作業

CI および CD パイプラインの開発モードを使用して、 .pipeline-config.yaml ファイルおよびスクリプトの実装をテストできます。 開発モード・パイプラインは、セキュリティー関連またはコンプライアンス関連のタスクを実行しません。これにより、パイプラインのランタイムが削減されます。 詳しくは、 開発モードでのパイプラインの実行 を参照してください。

開発モードは開発目的でのみ使用してください。 開発モードは、公式の DevSecOps CI および CD パイプラインに代わるものではありません。これらは参照実装のままです。

CD パイプラインの構成

DevSecOps 継続的統合、継続的デプロイメント・ワークフロー では、CI パイプラインは、CI パイプラインの deploy-release ステージ中に在庫リポジトリーに更新をプッシュします。 詳しくは、 サンプルの release.sh スクリプト を参照してください。

このワークフローでは、複数の CI トリガーと異なる DevSecOps CI ツールチェーンが同じインベントリー・リポジトリーにコントリビュートすることができます。

CI パイプラインとは異なり、CD パイプラインによって使用されるデプロイメント・スクリプトは、 inventory repo 内の項目を使用するために、 Jenkins、Travis、またはその他のプラットフォームの現行スクリプトから調整する必要があります。

この サンプル・コード は、インベントリーから情報を取得し、それを使用して Kubernetes デプロイメントを実行する方法を示しています。

DevSec操作スクリプトの場所

DevSecOps パイプラインには、デフォルトのセキュリティー・ツールとスキャン・ツール、および関連スクリプトが付属しています。

例えば、ステージ・ログの先頭はデフォルト・スクリプトを参照します。

scan-artifact:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
  dind: true
  dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  script: |
    #!/bin/sh

    "/opt/commons/scan-artifact/scan.sh"

/opt/commons/scan-artifact/scan.sh はデフォルトのスクリプトです。

DevSecOps パイプラインは、 COMMONS_PATH という環境変数内に commons ライブラリー のルート・フォルダーへのパスを提供します。この環境変数は、すべてのタスクおよびステップで使用できます。 準拠性ベース・イメージに組み込まれているスクリプトにアクセスするには、必要なスクリプト・フォルダーで COMMONS_PATH 変数を使用します。

source "${COMMONS_PATH}/<script folder in commons>/<script file name>

CD パイプラインのさまざまなステージを要約した表「 ステージとタスク 」を参照してください。 また、この表には、ステージにデフォルトの参照実装があるかどうか、カスタマイズ可能かスキップ可能か、またはステージの実行に必要な明示的なエビデンス収集があるかどうかも、統合された情報が示されます。

環境プロパティー

DevSecOps パイプラインには 事前定義環境プロパティー が付属していますが、カスタム・プロパティーは必要な数だけ追加できます。 get_env コマンド を使用して、スクリプト内のこれらのプロパティー値にアクセスできます。

プロパティーとそのオプションのデフォルト値をパイプラインまたはトリガーに追加した後、スクリプトで get_env コマンドを使用してプロパティーの値を取得します。 以下の例では、 my-variable プロパティーの値を取得します。

MY_VARIABLE=$(get_env my-variable "")

set_env コマンド を使用して、スクリプト内のプロパティーの値を動的にオーバーライドすることもできます。 以下の例では、 my-variable プロパティーの値をオーバーライドします。

set_env my-variable new-value

ステージのスキップ

一部のステージは無関係である可能性があります。 例えば、 Docker イメージをビルドしていない場合や、受け入れテストをまだ実装していない場合があります。 ステージをスキップする場合は、 .pipeline-config.yaml ファイルを編集して exit 0 を組み込むか、 skip 変数を true に設定します。

以下の例では、ステージをスキップするために exit 0 を追加します。

scan-artifact:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
  dind: true
  dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  skip: false
  runAfter: null
  script: |
    #!/bin/sh

    exit 0
    "/opt/commons/scan-artifact/scan.sh"

DevSecOps パイプライン内の Docker イメージ

デフォルトでは、 DevSecOps パイプラインは IBM Continuous Delivery イメージ を使用します。 これらのイメージには、スクリプトを実行するための最も一般的なツール ( Node や Java など) の一部が含まれています。 また、他のベンダーのイメージを使用することも、好みのツールを含む独自のカスタム・イメージを使用することもできます。

DevSecOps パイプラインによって使用される Docker イメージは、 .pipeline-config.yaml ファイルで指定されます。 ステージごとに異なるイメージを使用できます。

イメージ・バージョンの変更

要件に応じて、別のバージョンのイメージを使用することが必要になる場合があります。 イメージ・バージョンを変更するには、 .pipeline-config.yaml ファイルを編集します。 例えば、YAML ファイル icr.io/continuous-delivery/pipeline/pipeline-base-ubi3.24というイメージを参照した場合、 icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.27 に変更すると、イメージのバージョン 3.27 が使用されることになります。

同じ方法で、ステージの dind_image を以下のように変更します。

scan-artifact:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
  dind: true
  dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
(...)

サポートの利用

DevSecOps パイプラインをカスタマイズする際、 Slack で参加 して、 IBM Cloud 開発チームから直接ヘルプを入手してください。