IBM Cloud Docs
イメージおよび非イメージ成果物の署名の検証

イメージおよび非イメージ成果物の署名の検証

イメージの署名を検証することにより、デプロイメント前に継続的統合 (CI) パイプラインで作成されたイメージの整合性を維持します。

開始前に

イメージ検証の作業を開始する前に、以下の前提条件を満たしていることを確認してください。

  • GPG 公開鍵を持っている必要があります。 GPG キーの生成については、 資料 を参照してください。
  • base 64 エンコード GPG 公開鍵を使用して環境変数 code-signing-certificate を追加する必要があります。

イメージの検証

新しい prod-verify-artifact ステージは、 Continuous Delivery (CD) パイプライン内のイメージの署名を検証します。 このステージでは、以下のステップを実行します。

  1. ユーザー提供のエンコードされた GPG 公開鍵を一時ファイルにデコードします。

  2. 公開鍵を使用して Docker コンテナー・ポリシー (/etc/containers/policy.json) を作成します。

     {
       "default": [
         {
           "type": "reject"
         }
       ],
       "transports": {
         "docker-daemon": {
           "": [
             {
               "type": "reject"
             }
           ]
         },
         "docker": {
           "": [
             {
               "type": "signedBy",
               "keyType": "GPGKeys",
               "keyPath": "/tmp/GPGPublicKey"
             }
           ]
         }
       }
     }
    
  3. Skopeo を使用してコンテナー・ポリシーでイメージをプルすることにより、各成果物の成果物のリストを取得します。

        skopeo copy docker://"${image}" dir:"${tmp_sign_dir}" --src-creds iamapikey:"${ibmcloud_api_key}"
    

署名が有効であり、ユーザーによって提供された公開鍵によって検証される場合、イメージ・プルは成功します。

イメージ以外の成果物の検証

DevSecOps パイプラインでは、署名された成果物の署名は検証の対象になります。 このセクションでは、成果物の検証に進む前にユーザーが満たす必要がある前提条件について概説します。

開始前に

イメージ検証を操作する前に、以下の前提条件を満たしていることを確認してください。

  1. パイプライン構成を変更して、検証プロセスを有効にします。 以下のコード・スニペットを .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
    
  2. 成果物をダウンロードして、パイプライン・ランタイムに保管します。

    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}"

署名が有効であり、提供された公開鍵を使用して検証された場合、ステージは証拠を記録し、ステージに成功のマークを付けます。