初心者のためのDevSecOpsパイプラインのカスタマイズ

DevSecOps を採用するための基本を学び、最初のアプリケーションやマイクロサービスを導入しましょう。

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

あなたは、「DevSecOps IBM Cloud DevSecOps 継続的インテグレーション(CI)、継続的デプロイメント(CD)、継続的コンプライアンス( 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 toolchain を作成し、テストしてください。

最初のアプリケーションを既存のDevSecOpsCIツールチェーンに組み込むには、主に3つの方法がある:

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

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

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

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

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

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

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

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

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

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

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

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

CI パイプラインの構成

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

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

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

  1. IBM Cloudコンソールで、メニューアイコン Menu icon>Platform Automation>Toolchains をクリックし、編集したいCIツールチェーンを選択します。
  2. 「pr-pipeline」 をクリックします。
  3. Git のPRトリガーを編集し、アプリケーションリポジトリ 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 パイプラインは、アプリケーションのソースコード・リポジトリと同じリポジトリだと仮定する。

DevSecOpsでカスタムスクリプトを使用する

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

DevSecOpsパイプラインで使用されるスクリプトには、大きく分けて2つのカテゴリーがある:

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

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

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

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

JenkinsTravisからDevSecOpsへの移行

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

DevSecOps:」への移行のポイント

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

開発モードでの作業

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

開発モードは開発目的でのみ使用してください。 開発モードは、公式の DevSecOps CIパイプラインとCDパイプラインを置き換えるものではなく、リファレンス実装のままです。

CD パイプラインの構成

DevSecOpsの継続的インテグレーションと継続的デプロイのワークフロー では、CIパイプラインの「deploy-release 段階で、インベントリ・リポジトリに更新をプッシュする。 詳しくは、 サンプルの release.sh スクリプト を参照してください。

このワークフローでは、複数のCIトリガーと異なるDevSecOpsCIツールチェーンが同じインベントリリポジトリに貢献できる。

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

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

DevSecOpsスクリプトの場所

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ライブラリ のルートフォルダへのパスを'COMMONS_PATH という環境変数で提供し、すべてのタスクとステップで利用できるようにする。 準拠性ベース・イメージに組み込まれているスクリプトにアクセスするには、必要なスクリプト・フォルダーで 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
(...)

サポートの利用

IBM Cloud IBM の を搭載した のAIアシスタントは、 での作業や、利用可能なカタログのサービスを使ったソリューションの構築について学ぶのに役立つように設計されています。 watsonx IBM Cloud AIアシスタントのヘルプを参照してください

それでも問題を解決できない場合は、サポート Case をオープンできます。 詳しくは、サポート Case の作成を参照してください。 また、フィードバックを提供したい場合は 、「フィードバックの送信」 をご覧ください。