このチュートリアルでは、OpenSSF スコアカードを使用してコンテナ イメージのサプライ チェーンのセキュリティに関するベスト プラクティスを確認する方法について説明します。スコアカード認証者は Cloud Build パイプラインの一部として実行され、デプロイ前に Binary Authorization で検証できる証明書を生成します。この検証ステップでは、不正使用されたコンテナ アーティファクトが本番環境にデプロイされるのを防ぎ、サプライ チェーンのさまざまなクラスの脆弱性を防ぐことができます。
概要
Open Source Security Foundation(OpenSSF)は、オープンソースのセキュリティ イニシアチブのためのツール、サービス、インフラストラクチャを提供する組織です。スコアカードは、OpenSSF で管理されているツールで、サプライ チェーンのセキュリティ ベスト プラクティスについてソースコード管理(SCM)リポジトリをスキャンします。
スコアカード認証者は、スコアカードに組み込まれているツールで、構成したポリシーに基づいて Binary Authorization 証明書を作成できます。スコアカード認証者は、コンテナ イメージの SCM リポジトリに対してスコアカードを実行し、結果を生成します。ポリシーに照らして結果を評価し、ポリシーが満たされた場合に証明書を生成します。
このチュートリアルでは、サンプル リポジトリを作成してからスコアカード認証者を使用します。各サンプル パイプラインには、次のビルドステップが含まれます。
build
: サンプル コンテナ イメージを作成します。push
: イメージを Container Registry に push します。attest
: ポリシーに基づいて証明書を作成するため、スコアカード認証者を使用してイメージを確認して署名します。
各パイプラインの attest
ステップで、スコアカード認証者は次のことを行います。
- 新しくビルドされたコンテナ イメージの SCM リポジトリに関するデータを取得します。
- 元データでスコアカードを実行し、ユーザーが指定したポリシーに照らして SCM リポジトリを評価します。
- すべてのポリシーが満たされている場合、スコアカード認証者は証明書を作成します。
- いずれかのポリシーが満たされない場合、スコアカード認証者は証明書を作成しません。
デプロイ時に、Binary Authorization は検証可能な証明書を確認します。検証可能な証明書がない場合、適用者はイメージのデプロイを拒否します。
費用
このチュートリアルでは、次の Google Cloud プロダクトを使用します。
- Container Registry
- Artifact Analysis
- Cloud Build
- Cloud Key Management Service
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。
目標
このチュートリアルでは、次のことを行います。
- スコアカード認証者を Cloud Build カスタム ビルダーとして設定します。
- スコアカード認証者ポリシーを表示して構成します。
- サンプル リポジトリでスコアカード認証者を実行し、ポリシーに基づいて証明書を作成します。
- 証明書を作成せずに、サンプル リポジトリで Scorecard Attestor を確認専用モードで実行します。始める前に
このセクションでは、システムを 1 回だけ設定します。
環境を設定する
Google Cloud プロジェクトを環境変数に記録します。
export PROJECT_ID=PROJECT_ID
PROJECT_ID は、Google Cloud プロジェクトに置き換えます。
デフォルトのプロジェクト ID を Google Cloud プロジェクトに設定します。
gcloud config set project $PROJECT_ID
以降の手順で使用するため、プロジェクト番号を環境変数に記録します。
export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \ --format="value(PROJECT_NUMBER)")
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 鍵は証明書の作成に使用されます。
scorecard-attestor-key-ring という名前の新しい Cloud KMS キーリングを作成します。
gcloud kms keyrings create scorecard-attestor-key-ring \ --location global
キーリング内に 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"
以降の手順のために、ダイジェスト アルゴリズムと 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
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"
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 への固定されていない依存関係や、ソース リポジトリにチェックインされたコンパイル済みのバイナリ アーティファクトなど、推奨されないサプライ チェーン セキュリティ プラクティスが含まれています。これはリポジトリの証明書ポリシーの違反です。
テスト リポジトリ scorecard-binauthz-test-bad のクローンを作成します。
失敗した場合の証明書ファイルを確認します。
cat policy-binauthz.yaml
(省略可)失敗例のビルド構成ファイルを確認します。
cat samples/signer/cloudbuild.yaml
ビルドを送信します。
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"
最後のビルドのビルド ID を保存します。
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
結果を確認します。
gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
成功例のサンプルビルドを送信する
このセクションでは、スコアカードの証明書ポリシーを満たすコンテナ イメージを作成します。この場合、スコアカード認証者は証明書を作成します。
成功例のビルドを Cloud Build に送信する手順は次のとおりです。
テスト リポジトリのクローンを scorecard-binauthz-test-good に作成します。
失敗した場合の証明書ファイルを確認します。
sh cat policy-binauthz.yaml
(省略可)失敗例のビルド構成ファイルを確認します。
cat samples/signer/cloudbuild.yaml
ビルドを送信します。
gcloud builds submit \ --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \ --config=cloudbuild.yaml
結果を確認します。
gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
スコアカードでビルドおよびチェックされたコンテナ イメージの URL を取得します。
export IMAGE_URI=$(gcloud storage 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 '"')
コンテナ イメージの証明書が作成されたことを確認します。スコアカード認証者は、メモ 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
次のステップ
- スコアカード認証者のドキュメントを表示する
- スコアカードの詳細を確認する
- Binary Authorization の詳細を確認する
- Google Cloud コンソールまたはコマンドライン ツールを使用して認証者を作成する