イメージ以外の成果物の署名

DevSecOps ツールチェーンは、 tar や zip などのファイル形式に限定され、イメージ以外のアーティファクトに署名する機能を提供します。 このプロセスでは、デフォルトの署名スクリプトとともにスクリプトを使用します。 tar ファイルおよび zip ファイル以外の成果物に署名する必要がある場合は、スクリプトのカスタマイズされた実装を提供する必要があります。 skip-sign-artifact-type テキストプロパティを使用すると、指定されたアーティファクトタイプ(例:log、report、documentation)に対して画像への署名を省略できます。

署名プロセスをサポートするには、必要なランタイム環境がイメージ内で使用可能でなければなりません。

開始前に

非イメージ成果物の署名を開始する前に、以下の前提条件を満たしている必要があります。

  1. 成果物に署名するには、GPG 秘密鍵が必要です。 鍵を生成するには、 資料 を使用できます。

  2. .pipline-config.yaml ファイルは、以下のステージ構成で更新する必要があります。

    sign-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 ${COMMONS_PATH}/sign-artifact/sign-artifacts.sh
    
  3. デフォルトでは 、sign-artifacts スクリプト は list_artifacts コレクションにリストされているすべてのアーティファクトに署名することができます。 成果物が適切に保管され、統合されていることを確認してください。

    1. ビルドされた成果物は必ず Cocoa パイプライン・ランタイムに保管してください。 これは、以下の2つの方法のいずれかによって実現できます。

      • save_file ツールを使用して、成果物 tar ファイルを保存します。これにより、後続のステージでの取得が可能になります。

        save_file "${APP_NAME}" "${APP_NAME}-${VERSION}.tgz"
        
      • アプリケーション名と一致する成果物の名前を使用して、指定されたロケーションに成果物を保管します。

        location="$(basename $(pwd))"
        
    2. 以下のコード・スニペットをガイドとして使用して、保存した成果物を Cocoa ランタイムに統合します。

      save_artifact "${APP_NAME}" \
         type=tar \
         "name=${APP_NAME}-${VERSION}.tgz" \
         "digest=${DIGEST}" \
         "location=${location}" \
         "provenance=${APP_NAME}-${VERSION}.tgz@${DIGEST}"
      

イメージ以外の成果物の署名

デフォルトのスクリプトは、署名の目的で GPG クライアントを使用します。 このステージでは、すべての成果物が署名プロセスを受けます。 成果物が署名されると、スクリプトは成果物とシグニチャーの両方を Cocoa パイプライン・ランタイムに保管します。

署名後のステップ

署名付き成果物とそれに対応する署名を取得するには、以下の方法を使用できます。

signed_artifact=$(mktemp)
if load_file "${artifact}_signed_artifact" >"${signed_artifact}" 2> /dev/null; then
    echo "Loaded the signed artifact ${artifact} from load_file at the ${signed_artifact}"
else
    artifact_location="$(load_artifact "$artifact" "location")"
    cp "${WORKSPACE}/${artifact_location}/${name}" "${signed_artifact}"
    echo "Loaded the artifact at the ${WORKSPACE}/${artifact_location}/${name}"   
fi
artifact_signature=$(mktemp)
if load_file "${artifact}_signature" >"${artifact_signature}" 2> /dev/null; then
    echo "Loaded the signature of ${artifact} from load_file at the ${artifact_signature}"
fi

署名済みのアーティファクトを保存する必要がある場合は、お好みのストレージソリューションを使用するか、 IBM Cloud Object Storage をご利用いただけます。 次のコード例は、署名済みのアーティファクトと署名を Cloud Object Storage にアップロードし、インベントリ・リポジトリを更新する方法の例を示しています。

 # Upload the artifact and signature to Cloud Object Storage.
        namespace="$(get_env pipeline_namespace)"
        local cos_params=(
            --pipeline-run-id="${PIPELINE_RUN_ID}"
            --namespace="${namespace}"
            --backend cos
        )
        # Upload the artifact
        artifact_cos_url=$(cocoa artifact upload "${signed_artifact}" "${cos_params[@]}")
        # Upload the artifact
        artifact_signature_cos_url=$(cocoa artifact upload "${artifact_signature}" "${cos_params[@]}")

        APP_ARTIFACTS='{ "app": "'${APP_NAME}'", "artifact_url": "'${artifact_cos_url}'", "artifact_signature": "'${artifact_signature_cos_url}'" }'
        cocoa inventory add \
            --artifact="${name}@${digest}" \
            --name="${APP_REPO_NAME}" \
            --app-artifacts="${APP_ARTIFACTS}" \
            --signature="${signature}" \
            --provenance="${name}@${digest}" \
            --sha256="${digest}" \
            --type=$type" \
            "${params[@]}"