OpenSSF スコアカードを使用して証明書を作成する

このチュートリアルでは、OpenSSF スコアカードを使用してコンテナ イメージのサプライ チェーンのセキュリティに関するベスト プラクティスを確認する方法について説明します。スコアカード認証者は Cloud Build パイプラインの一部として実行され、デプロイ前に Binary Authorization で検証できる証明書を生成します。この検証ステップでは、不正使用されたコンテナ アーティファクトが本番環境にデプロイされるのを防ぎ、サプライ チェーンのさまざまなクラスの脆弱性を防ぐことができます。

概要

Open Source Security Foundation(OpenSSF)は、オープンソースのセキュリティ イニシアチブのためのツール、サービス、インフラストラクチャを提供する組織です。スコアカードは、OpenSSF で管理されているツールで、サプライ チェーンのセキュリティ ベスト プラクティスについてソースコード管理(SCM)リポジトリをスキャンします。

スコアカード認証者は、スコアカードに組み込まれているツールで、構成したポリシーに基づいて Binary Authorization 証明書を作成できます。スコアカード認証者は、コンテナ イメージの SCM リポジトリに対してスコアカードを実行し、結果を生成します。ポリシーに照らして結果を評価し、ポリシーが満たされた場合に証明書を生成します。

このチュートリアルでは、サンプル リポジトリを作成してからスコアカード認証者を使用します。各サンプル パイプラインには、次のビルドステップが含まれます。

  1. build: サンプル コンテナ イメージを作成します。
  2. push: イメージを Container Registry に push します。
  3. attest: ポリシーに基づいて証明書を作成するため、スコアカード認証者を使用してイメージを確認して署名します。

各パイプラインの attest ステップで、スコアカード認証者は次のことを行います。

  1. 新しくビルドされたコンテナ イメージの SCM リポジトリに関するデータを取得します。
  2. 元データでスコアカードを実行し、ユーザーが指定したポリシーに照らして SCM リポジトリを評価します。
    1. すべてのポリシーが満たされている場合、スコアカード認証者は証明書を作成します。
    2. いずれかのポリシーが満たされない場合、スコアカード認証者は証明書を作成しません。

デプロイ時に、Binary Authorization は検証可能な証明書を確認します。検証可能な証明書がない場合、適用者はイメージのデプロイを拒否します。

費用

このチュートリアルでは、次の Google Cloud プロダクトを使用します。

  • Container Registry
  • Artifact Analysis
  • Cloud Build
  • Cloud Key Management Service

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

目標

このチュートリアルでは、次のことを行います。

  1. スコアカード認証者を Cloud Build カスタム ビルダーとして設定します。
  2. スコアカード認証者ポリシーを表示して構成します。
  3. サンプル リポジトリでスコアカード認証者を実行し、ポリシーに基づいて証明書を作成します。
  4. 証明書を作成せずに、サンプル リポジトリで Scorecard Attestor を確認専用モードで実行します。始める前に

このセクションでは、システムを 1 回だけ設定します。

環境を設定する

  1. Google Cloud プロジェクトを環境変数に記録します。

    export PROJECT_ID=PROJECT_ID
    

    PROJECT_ID は、Google Cloud プロジェクトに置き換えます。

  2. デフォルトのプロジェクト ID を Google Cloud プロジェクトに設定します。

    gcloud config set project $PROJECT_ID
    
  3. 以降の手順で使用するため、プロジェクト番号を環境変数に記録します。

    export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \
     --format="value(PROJECT_NUMBER)")
    
  4. API を有効にします。

    このガイドに必要なサービスを有効にするには、次のコマンドを実行します。

    gcloud services enable \
      cloudbuild.googleapis.com \
      containerregistry.googleapis.com \
      containerscanning.googleapis.com \
      cloudkms.googleapis.com
    

IAM ロールを設定する

以下のコマンドを実行して、次のロールを Cloud Build サービス アカウントに構成します。

  • containeranalysis.notes.editor: 認証者を管理するために、Artifact Analysis メモの編集者のロールを追加します。
  • containeranalysis.notes.occurrences.viewer: 脆弱性と証明書の両方のオカレンスを管理するために、メモに対する Artifact Analysis のオカレンスの閲覧者のロールを追加します。
  • roles/containeranalysis.occurrences.editor: Artifact Analysis で証明書のオカレンスを作成するために、Artifact Analysis のオカレンスの編集者のロールを追加します。
  • cloudkms.signer: サービス アカウントが Cloud KMS 署名サービスにアクセスできるように、Cloud KMS CryptoKey 署名者のロールを追加します。

    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.occurrences.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/cloudkms.signer
    

Cloud KMS 署名鍵を作成する

Cloud Key Management Service 鍵は証明書の作成に使用されます。

  1. scorecard-attestor-key-ring という名前の新しい Cloud KMS キーリングを作成します。

    gcloud kms keyrings create scorecard-attestor-key-ring \
        --location global
    
  2. キーリング内に scorecard-attestor-key という新しい Cloud KMS 鍵を作成します。

    gcloud kms keys create scorecard-attestor-key \
        --keyring scorecard-attestor-key-ring \
        --location global \
        --purpose "asymmetric-signing" \
        --default-algorithm "rsa-sign-pkcs1-2048-sha256"
    
  3. 以降の手順のために、ダイジェスト アルゴリズムと Cloud KMS を環境変数に格納します。

    export KMS_DIGEST_ALG=SHA256
    export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/scorecard-attestor-key-ring/cryptoKeys/scorecard-attestor-key/cryptoKeyVersions/1
    
  4. Binary Authorization 認証者を作成します。その後、スコアカード認証者が、この認証者に関連付けられたメモを作成します。

    gcloud container binauthz attestors create scorecard-attestor \
        --attestation-authority-note=scorecard-attestation \
        --attestation-authority-note-project=$PROJECT_ID \
        --description="Attest that ossf/scorecard policy checks pass"
    
  5. Binary Authorization 認証者を KMS 鍵に関連付けます。

    gcloud container binauthz attestors public-keys add \
        --attestor=scorecard-attestor \
        --keyversion=1 \
        --keyversion-key=scorecard-attestor-key \
        --keyversion-keyring=scorecard-attestor-key-ring \
        --keyversion-location=global \
        --keyversion-project=$PROJECT_ID
    

他の署名アルゴリズムについては、非対称鍵の作成をご覧ください。

Cloud Build パイプラインでスコアカード認証者を使用して証明書を作成する

失敗例のサンプルビルドを送信する

このセクションでは、コンテナ イメージを作成し、OpenSSF スコアカードを使用してサプライ チェーンのセキュリティ プラクティスを確認します。イメージは正常にビルドされますが、証明書は作成されません。ベース リポジトリには、Dockerfile 内の Debian 10 への固定されていない依存関係や、ソース リポジトリにチェックインされたコンパイル済みのバイナリ アーティファクトなど、推奨されないサプライ チェーン セキュリティ プラクティスが含まれています。これはリポジトリの証明書ポリシーの違反です。

  1. テスト リポジトリ scorecard-binauthz-test-bad のクローンを作成します。

  2. 失敗した場合の証明書ファイルを確認します。

    cat policy-binauthz.yaml
    
  3. (省略可)失敗例のビルド構成ファイルを確認します。

    cat samples/signer/cloudbuild.yaml
    
  4. ビルドを送信します。

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    

次のような出力が表示されます。

time="2022-12-20T22:30:14Z" level=info msg="image failed scorecard attestation policy check"
  1. 最後のビルドのビルド ID を保存します。

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  2. 結果を確認します。

    gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
    

成功例のサンプルビルドを送信する

このセクションでは、スコアカードの証明書ポリシーを満たすコンテナ イメージを作成します。この場合、スコアカード認証者は証明書を作成します。

成功例のビルドを Cloud Build に送信する手順は次のとおりです。

  1. テスト リポジトリのクローンを scorecard-binauthz-test-good に作成します。

  2. 失敗した場合の証明書ファイルを確認します。 sh cat policy-binauthz.yaml

  3. (省略可)失敗例のビルド構成ファイルを確認します。

    cat samples/signer/cloudbuild.yaml
    
  4. ビルドを送信します。

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    
  5. 結果を確認します。

    gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. スコアカードでビルドおよびチェックされたコンテナ イメージの URL を取得します。

    export IMAGE_URI=$(gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep -o "Attestation for image .* is successfully uploaded" txt | cut -d' ' -f4 | tr -d '"')
    
  7. コンテナ イメージの証明書が作成されたことを確認します。スコアカード認証者は、メモ ID ossf-scorecard-attestation とメモ名 projects/${PROJECT_ID}/notes/ossf-scorecard-attestation を使用します。

    gcloud container binauthz attestations list \
        --attestor="projects/${PROJECT_ID}/attestors/ossf-scorecard-attestor" \
        --filter="resourceUri='https://${IMAGE_URI}'"
    

クリーンアップ

このドキュメントで使用されたリソースをクリーンアップするには、プロジェクトを削除します。

gcloud projects delete $PROJECT_ID

次のステップ