イメージおよび非イメージ成果物の署名の検証
イメージの署名を検証することにより、デプロイメント前に継続的統合 (CI) パイプラインで作成されたイメージの整合性を維持します。
開始前に
イメージ検証の作業を開始する前に、以下の前提条件を満たしていることを確認してください。
- GPG 公開鍵を持っている必要があります。 GPG キーの生成については、 資料 を参照してください。
- base 64 エンコード GPG 公開鍵を使用して環境変数
code-signing-certificate
を追加する必要があります。
イメージの検証
新しい prod-verify-artifact
ステージは、 Continuous Delivery (CD) パイプライン内のイメージの署名を検証します。 このステージでは、以下のステップを実行します。
-
ユーザー提供のエンコードされた GPG 公開鍵を一時ファイルにデコードします。
-
公開鍵を使用して Docker コンテナー・ポリシー (
/etc/containers/policy.json
) を作成します。{ "default": [ { "type": "reject" } ], "transports": { "docker-daemon": { "": [ { "type": "reject" } ] }, "docker": { "": [ { "type": "signedBy", "keyType": "GPGKeys", "keyPath": "/tmp/GPGPublicKey" } ] } } }
-
Skopeo を使用してコンテナー・ポリシーでイメージをプルすることにより、各成果物の成果物のリストを取得します。
skopeo copy docker://"${image}" dir:"${tmp_sign_dir}" --src-creds iamapikey:"${ibmcloud_api_key}"
署名が有効であり、ユーザーによって提供された公開鍵によって検証される場合、イメージ・プルは成功します。
イメージ以外の成果物の検証
DevSecOps パイプラインでは、署名された成果物の署名は検証の対象になります。 このセクションでは、成果物の検証に進む前にユーザーが満たす必要がある前提条件について概説します。
開始前に
イメージ検証を操作する前に、以下の前提条件を満たしていることを確認してください。
-
パイプライン構成を変更して、検証プロセスを有効にします。 以下のコード・スニペットを
.pipeline-config.yaml
ファイルに追加します。verify-artifact: image: icr.io/continuous-delivery/pipeline/image-signing:1.0.0@sha256:e9d8e354668ba3d40be2aaee08298d2aa7f0e1c8a1829cca4094ec93830e3e6a image_pull_policy: IfNotPresent abort_on_failure: false dind: true script: | #!/usr/bin/env bash source /opt/commons/verify-artifact/verify_non_image_artifact.sh
-
成果物をダウンロードして、パイプライン・ランタイムに保管します。
verify-artifact
ステージを呼び出す前に、必要な成果物をダウンロードして Cocoa ランタイムに保管します。 デフォルトでは、list_artifacts
コレクションにリストされているすべての成果物が検証されます。 以下のサンプル・コードは、 Cloud Object Storage から成果物をダウンロードして Cocoa ランタイムに保存する方法を示しています。#!/usr/bin/env bash export SECRET_PATH="/config/ibmcloud-api-key" . "${ONE_PIPELINE_PATH}"/iam/get_token SKIP_SIGN_ARTIFACTS_TYPE="$(get_env skip-sign-artifact-type "")" IFS=';' read -ra ARTIFACT_LIST <<<"$SKIP_SIGN_ARTIFACTS_TYPE" list_artifacts | while IFS= read -r artifact; do type="$(load_artifact "$artifact" "type")" if [[ ! "${ARTIFACT_LIST[@]}" =~ "$type" ]] && [[ "$type" != "image" ]]; then inventory_entry="$(load_artifact "$artifact" "inventory-entry")" inventory_entry=${inventory_entry///artifacts/$WORKSPACE} artifact_url=$(jq -r .'app_artifacts.artifact_url' ${inventory_entry}) echo "downloading the artifact ${artifact_url}" curl -H "Authorization: bearer ${IAM_ACCESS_TOKEN}" --output outputfile ${artifact_url} save_file "${artifact}" outputfile fi done
成果物の検証
成果物検証プロセスでは、ユーザー提供の GPG 公開鍵が GPG 鍵リングにインポートされます。 list_artifacts
コレクションにリストされているすべての成果物が検証されます。 このステージでは、インベントリーから署名を取得し、以下の検証を実行します。
gpg --verify "${signature}" "${artifactName}"
署名が有効であり、提供された公開鍵を使用して検証された場合、ステージは証拠を記録し、ステージに成功のマークを付けます。