初心者向けの 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 テンプレートがあります。
- Node サンプル・アプリケーション
- CodeEngine コンプライアンス・サンプル・アプリケーション
- Go コンプライアンス・サンプル・アプリケーション
- Python コンプライアンス・サンプル・アプリケーション
- Node / Cloudant コンプライアンス・サンプル・アプリケーション
DevSecOps パイプラインがリポジトリーを使用する方法
アプリケーションをビルド、テスト、およびデプロイするために、 DevSecOps パイプラインは以下の 2 つのリポジトリーを使用します。
app-repo
: アプリケーションのソース・コードが含まれているアプリケーション・リポジトリー。config-repo
: 構成リポジトリー。これには、パイプライン構成 YAML ファイルおよびスクリプトが含まれています。
DevSecOps サンプル・アプリ では、これらの 2 つのリポジトリーは同じです。 ほとんどの DevSecOps 採用者は、このパターンから開始します。 しかし、より多くのマイクロサービスをオンボードするにつれて、専用の別個のパイプライン構成リポジトリーが必要になる場合があります。 サンプル・アプリケーションではアプリケーション・リポジトリーと構成リポジトリーが同じであるため、パイプラインの実行時にリポジトリーが 2 回複製されるため、エラーが発生する可能性があります。 したがって、異なる DevSecOps ツールチェーンおよびパイプライン間で共有して再利用できる構成ファイルおよびスクリプトをホストするために、別個の構成リポジトリーを用意することがベスト・プラクティスです。 構成リポジトリーのカスタマイズについて詳しくは、 拡張カスタマイズ・ステップ を参照してください。
DevSecOps スクリプトは、 app-repo
と config-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: アプリケーション・リポジトリーを追加し、サンプル・アプリケーション・リポジトリーを構成リポジトリーとして使用する
アプリケーション・リポジトリーをツールチェーンに追加し、サンプル・アプリケーション・リポジトリーを構成リポジトリーとして使用するには、以下のステップを実行します。
- IBM Cloud コンソールで、 「メニュー」 アイコン
> DevOps > 「ツールチェーン」 をクリックし、編集するツールチェーンを選択します。
- 追加 をクリックします。
- アプリ・リポジトリーがホストされている場所 (
Gitlab
またはGitHub
) を選択します。 - デフォルト・サーバーを使用するか、新規サーバーを追加します。
- カスタム・サーバーの URL と個人用アクセス・トークンを入力します。
- 「統合の作成」 をクリックします。
- アプリケーション・ソース・コード・リポジトリー URL を入力します。
- 「統合の作成」 をクリックします。
次に、以下のステップを実行して、サンプル・アプリケーション・リポジトリーを構成リポジトリーとして指定します。
- IBM Cloud コンソールで、 「メニュー」 アイコン
> DevOps > 「ツールチェーン」 をクリックし、編集するツールチェーンを選択します。
- 「pr-pipeline」 をクリックします。
- 「設定」 をクリックして、 「環境プロパティー」 タブに移動します。
- サンプル・アプリケーション・リポジトリー URL を指すように
pipeline-config-repo
プロパティーの値を編集します。 - CI ツールチェーンに戻ります。
- 「ci-pipeline」 をクリックします。
- 「設定」 をクリックして、 「環境プロパティー」 タブに移動します。
- サンプル・アプリケーション・リポジトリー URL を指すように
pipeline-config-repo
プロパティーの値を編集します。
これで、CI パイプラインはサンプル・アプリ・リポジトリー pipeline-config
を構成リポジトリーとして使用します。
オプション 2: サンプル・アプリケーション・リポジトリーを独自のアプリケーション・リポジトリーに置き換える
サンプル・アプリ・リポジトリーを独自のアプリ・リポジトリーに置き換えるには、以下の手順を実行します。
- IBM Cloud コンソールで、 「メニュー」 アイコン
> DevOps > 「ツールチェーン」 をクリックし、編集する CI ツールチェーンを選択します。
- サンプル・アプリケーションのソース・コード・リポジトリーを見つけ、 「構成」 を選択します。
- リポジトリー URL をアプリケーション・ソース・コード・リポジトリー URL に置き換えます。
- **「統合の保存」**をクリックします。
サンプル・アプリ・リポジトリーを置き換えた後、新しいアプリ・リポジトリーに .pipeline-config.yaml
ファイルと対応するスクリプトが含まれていることを確認してください。 .pipeline-config.yaml
ファイルとスクリプトをサンプル・アプリケーション・リポジトリーからアプリケーション・リポジトリーにコピーするか、 このサンプル構成ファイル を使用します。
CI パイプラインの構成
アプリケーション・リポジトリーを追加した後、新規リポジトリーと連携するように CI パイプラインを構成する必要があります。
パイプライン・トリガーの構成
デフォルトのトリガーはサンプル・アプリケーション・リポジトリーを使用するため、アプリケーション・リポジトリーを使用するように更新する必要があります。 トリガー設定を確認し、必要に応じて変更して、すべてのトリガーがアプリ・リポジトリーを指すようにします。 以下のステップを実行します。
- IBM Cloud コンソールで、 「メニュー」 アイコン
> DevOps > 「ツールチェーン」 をクリックし、編集する CI ツールチェーンを選択します。
- 「pr-pipeline」 をクリックします。
- Git PR Trigger を編集し、アプリケーション・リポジトリーの URL とブランチを指定します。
- 保存 をクリックします。
- CI ツールチェーンに戻り、 「ci-pipeline」 をクリックします。
- Git CI Trigger を編集し、アプリケーション・リポジトリーの URL とブランチを指定します。 「プロパティー」 セクションで、アプリケーション名が正しいことを確認します。
- 保存 をクリックします。
- 「手動トリガー」 を編集します。 「プロパティー」 セクションで、アプリ名が正しいことを確認します。
- リポジトリーとブランチのプロパティーが正しいこと、およびアプリ・リポジトリーを指していることを確認してください。
.pipeline-config.yaml
ファイルの構成
.pipeline-config.yaml
ファイルをサンプル・アプリケーション・リポジトリーからアプリケーション・リポジトリーにコピーするか、 このサンプル構成ファイル を使用します。
pr-pipeline
と ci-pipeline
の両方について、 pipeline-config
、 pipeline-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-ubi
で3.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 開発チームから直接ヘルプを入手してください。