このページでは、Binary Authorization 継続的検証(CV)のイメージの鮮度チェックを使用して、CV が有効な Google Kubernetes Engine(GKE)クラスタで実行されている Pod のイメージの更新頻度を確認する方法について説明します。これを行うため、CV はイメージがレジストリにアップロードされたタイミングをチェックします。
このチェックは、Artifact Registry リポジトリと Container Registry リポジトリのみをサポートします。
費用
このガイドでは、次の Google Cloud サービスを使用します。
- Binary Authorization。ただし、CV はプレビュー ステージの間は無料です。
- Google Kubernetes Engine
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:
gcloud services enable artifactregistry.googleapis.com
binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:
gcloud services enable artifactregistry.googleapis.com
binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com - gcloud CLI が最新バージョンであることを確認します。
kubectl
コマンドライン ツールをインストールします。- Binary Authorization ポリシーと GKE クラスタが別々のプロジェクトにある場合は、両方のプロジェクトで Binary Authorization が有効になっていることを確認します。
必要なロール
このセクションでは、このチェックに必要なロールの設定方法について説明します。
概要
このガイドに記載されているプロダクトをすべて同じプロジェクトで実行する場合、権限を設定する必要はありません。Binary Authorization を有効にすると、ロールが正しく構成されます。複数のプロジェクトでプロダクトを実行する場合は、このセクションの説明に従ってロールを設定する必要があります。
ポリシー プロジェクトの Binary Authorization サービス エージェントに CV イメージの更新頻度の評価に必要な権限が付与されていることを確認するには、ポリシー プロジェクトの Binary Authorization サービス エージェントに次の IAM ロールを付与するよう管理者に依頼してください。
-
クラスタ プロジェクトがポリシー プロジェクトと異なる場合: ポリシー プロジェクトにアクセスするために、クラスタ プロジェクトの Binary Authorization サービス エージェントに Binary Authorization ポリシー評価者(
roles/binaryauthorization.policyEvaluator
)ロールが必要です。 -
Artifact Registry プロジェクト(イメージを保存するプロジェクト)がポリシー プロジェクトと異なる場合:
証明書プロジェクトにアクセスするため、ポリシー プロジェクトの Binary Authorization サービス エージェントに Artifact Registry 読み取り(
roles/artifactregistry.reader
)ロールが必要です。 -
Artifact Registry プロジェクトがクラスタ プロジェクトと異なる場合: Artifact Registry プロジェクトのイメージ メタデータにアクセスするため、クラスタ プロジェクトの Binary Authorization サービス エージェントに Artifact Registry 読み取り(
roles/artifactregistry.reader
)ロールが必要です。
ロールの付与の詳細については、アクセス権の管理をご覧ください。
管理者は、カスタムロールや他の事前定義ロールを使用して、ポリシー プロジェクトの Binary Authorization サービス エージェントに必要な権限を割り当てることもできます。
gcloud CLI を使用してロールを付与する
各プロジェクトの Binary Authorization サービス エージェントにこのチェックの評価に必要な権限を付与するには、各プロジェクトの Binary Authorization サービス エージェントに次の IAM ロールを付与します。
クラスタ プロジェクトがポリシー プロジェクトと異なる場合
クラスタ プロジェクトの Binary Authorization サービス エージェントに、ポリシー プロジェクトに対する Binary Authorization ポリシー評価者(roles/binaryauthorization.policyEvaluator
)ロールを付与します。
gcloud projects add-iam-policy-bindingPOLICY_PROJECT_ID
\ --member="serviceAccount:service-$(gcloud projects describeCLUSTER_PROJECT_ID
--format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \ --role=roles/binaryauthorization.policyEvaluator
次のように置き換えます。
POLICY_PROJECT_ID
: ポリシーを含むプロジェクトの ID。CLUSTER_PROJECT_ID
: クラスタのプロジェクト ID。
アーティファクト プロジェクトがポリシー プロジェクトと異なる場合
ポリシー プロジェクトの Binary Authorization サービス エージェントに、アーティファクト プロジェクトに対する Artifact Registry 読み取り(roles/artifactregistry.reader
)ロールを付与します。
gcloud projects add-iam-policy-bindingARTIFACT_PROJECT_ID
\ --member="serviceAccount:service-$(gcloud projects describePOLICY_PROJECT_ID
--format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \ --role=roles/artifactregistry.reader
ARTIFACT_PROJECT_ID
は、Artifact Registry リポジトリを含むプロジェクトの ID に置き換えます。
アーティファクト プロジェクトがクラスタ プロジェクトと異なる場合
クラスタ プロジェクトの Binary Authorization サービス エージェントに、アーティファクト プロジェクトに対する Artifact Registry 読み取り(roles/artifactregistry.reader
)ロールを付与します。
gcloud projects add-iam-policy-bindingARTIFACT_PROJECT_ID
\ --member="serviceAccount:service-$(gcloud projects describeCLUSTER_PROJECT_ID
--format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \ --role=roles/artifactregistry.reader
次のように置き換えます。
ARTIFACT_PROJECT_ID
: Artifact Registry リポジトリを含むプロジェクトの ID。CLUSTER_PROJECT_ID
: GKE クラスタを実行するプロジェクト ID。
プラットフォーム ポリシーを作成する
イメージの鮮度チェックで CV プラットフォーム ポリシーを作成するには、次の操作を行います。
プラットフォーム ポリシーの YAML ファイルを作成します。
cat << EOF > /tmp/my-policy.yaml gkePolicy: checkSets: - checks: - imageFreshnessCheck: maxUploadAgeDays: MAX_UPLOAD_AGE_DAYS displayName: CHECK_DISPLAY_NAME displayName: CHECK_SET_DISPLAY_NAME EOF
次のように置き換えます。
MAX_UPLOAD_AGE_DAYS
: レジストリにイメージがアップロードされてからの最長経過時間(日数)。CHECK_SET_DISPLAY_NAME
: チェックセットの任意の表示名(省略可)CHECK_DISPLAY_NAME
: チェックの任意の表示名(省略可)
プラットフォーム ポリシーを作成します。
後述のコマンドデータを使用する前に、次のように置き換えます。
- POLICY_ID: 選択したプラットフォーム ポリシー ID。ポリシーが別のプロジェクトにある場合、完全なリソース名
projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID
を使用できます。 - POLICY_PATH: ポリシー ファイルのパス。
- POLICY_PROJECT_ID: ポリシー プロジェクト ID。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud beta container binauthz policy create POLICY_ID \ --platform=gke \ --policy-file=POLICY_PATH \ --project=POLICY_PROJECT_ID
Windows(PowerShell)
gcloud beta container binauthz policy create POLICY_ID ` --platform=gke ` --policy-file=POLICY_PATH ` --project=POLICY_PROJECT_ID
Windows(cmd.exe)
gcloud beta container binauthz policy create POLICY_ID ^ --platform=gke ^ --policy-file=POLICY_PATH ^ --project=POLICY_PROJECT_ID
- POLICY_ID: 選択したプラットフォーム ポリシー ID。ポリシーが別のプロジェクトにある場合、完全なリソース名
CV を有効にする
チェックベースのプラットフォーム ポリシーで CV モニタリングを使用するように、新しいクラスタを作成するか、既存のクラスタを更新します。
CV モニタリングを使用するクラスタを作成する
このセクションでは、チェックベースのプラットフォーム ポリシーで CV モニタリングのみを使用するクラスタを作成します。
後述のコマンドデータを使用する前に、次のように置き換えます。
CLUSTER_NAME
: クラスタ名。LOCATION
: ロケーション。例:us-central1
、asia-south1
POLICY_PROJECT_ID
: ポリシーが保存されているプロジェクトの ID。POLICY_ID
: ポリシー ID。CLUSTER_PROJECT_ID
: クラスタ プロジェクト ID。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud beta container clusters create CLUSTER_NAME \ --location=LOCATION \ --binauthz-evaluation-mode=POLICY_BINDINGS \ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \ --project=CLUSTER_PROJECT_ID
Windows(PowerShell)
gcloud beta container clusters create CLUSTER_NAME ` --location=LOCATION ` --binauthz-evaluation-mode=POLICY_BINDINGS ` --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ` --project=CLUSTER_PROJECT_ID
Windows(cmd.exe)
gcloud beta container clusters create CLUSTER_NAME ^ --location=LOCATION ^ --binauthz-evaluation-mode=POLICY_BINDINGS ^ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^ --project=CLUSTER_PROJECT_ID
適用と CV モニタリングを使用するクラスタを作成する
このセクションでは、プロジェクト シングルトン ポリシーの適用と、チェックベースのプラットフォーム ポリシーを使用した CV モニタリングの両方を使用するクラスタを作成します。
後述のコマンドデータを使用する前に、次のように置き換えます。
CLUSTER_NAME
: クラスタ名。LOCATION
: ロケーション。例:us-central1
、asia-south1
POLICY_PROJECT_ID
: ポリシーが保存されているプロジェクトの ID。POLICY_ID
: ポリシー ID。CLUSTER_PROJECT_ID
: クラスタ プロジェクト ID。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud beta container clusters create CLUSTER_NAME \ --location=LOCATION \ --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \ --project=CLUSTER_PROJECT_ID
Windows(PowerShell)
gcloud beta container clusters create CLUSTER_NAME ` --location=LOCATION ` --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ` --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ` --project=CLUSTER_PROJECT_ID
Windows(cmd.exe)
gcloud beta container clusters create CLUSTER_NAME ^ --location=LOCATION ^ --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^ --project=CLUSTER_PROJECT_ID
CV モニタリングを使用するようにクラスタを更新する
このセクションでは、チェックベースのプラットフォーム ポリシーでのみ CV モニタリングを使用するようにクラスタを更新します。クラスタでプロジェクトのシングルトン ポリシーの適用がすでに有効になっている場合、このコマンドを実行すると、クラスタの適用が無効になります。代わりに、適用と CV モニタリングを有効にしてクラスタを更新することを検討してください。
後述のコマンドデータを使用する前に、次のように置き換えます。
CLUSTER_NAME
: クラスタ名LOCATION
: ロケーション(例:us-central1
、asia-south1
)POLICY_PROJECT_ID
: ポリシーが保存されているプロジェクトの IDPOLICY_ID
: ポリシー IDCLUSTER_PROJECT_ID
: クラスタ プロジェクト ID
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION \ --binauthz-evaluation-mode=POLICY_BINDINGS \ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \ --project=CLUSTER_PROJECT_ID
Windows(PowerShell)
gcloud beta container clusters update CLUSTER_NAME ` --location=LOCATION ` --binauthz-evaluation-mode=POLICY_BINDINGS ` --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ` --project=CLUSTER_PROJECT_ID
Windows(cmd.exe)
gcloud beta container clusters update CLUSTER_NAME ^ --location=LOCATION ^ --binauthz-evaluation-mode=POLICY_BINDINGS ^ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^ --project=CLUSTER_PROJECT_ID
適用と CV モニタリングを使用するようにクラスタを更新する
このセクションでは、チェックベースのプラットフォーム ポリシーを使用して、プロジェクト シングルトン ポリシーの適用と CV モニタリングの両方を使用するようにクラスタを更新します。
後述のコマンドデータを使用する前に、次のように置き換えます。
CLUSTER_NAME
: クラスタ名LOCATION
: ロケーション(例:us-central1
、asia-south1
)POLICY_PROJECT_ID
: ポリシーが保存されているプロジェクトの IDPOLICY_ID
: ポリシー IDCLUSTER_PROJECT_ID
: クラスタ プロジェクト ID
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION \ --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \ --project=CLUSTER_PROJECT_ID
Windows(PowerShell)
gcloud beta container clusters update CLUSTER_NAME ` --location=LOCATION ` --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ` --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ` --project=CLUSTER_PROJECT_ID
Windows(cmd.exe)
gcloud beta container clusters update CLUSTER_NAME ^ --location=LOCATION ^ --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^ --project=CLUSTER_PROJECT_ID
CV エントリのログを表示する
Cloud Logging のエントリを検索して、CV 構成エラーと CV プラットフォーム ポリシーの検証違反を確認できます。
CV は、エラーと違反を 24 時間以内に Cloud Logging に記録します。通常は数時間以内にエントリを確認できます。
CV 構成エラーログを表示する
CV 構成エラーログを表示するには、次のコマンドを実行します。
gcloud logging read \
--order="desc" \
--freshness=7d \
--project=CLUSTER_PROJECT_ID \
'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "configErrorEvent"'
次の出力は、CV プラットフォーム ポリシーが見つからない構成エラーを示しています。
{
"insertId": "141d4f10-72ea-4a43-b3ec-a03da623de42",
"jsonPayload": {
"@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent",
"configErrorEvent": {
"description": "Cannot monitor cluster 'us-central1-c.my-cluster': Resource projects/123456789/platforms/gke/policies/my-policy does not exist."
}
},
"resource": {
"type": "k8s_cluster",
"labels": {
"cluster_name": "my-cluster",
"location": "us-central1-c",
"project_id": "my-project"
}
},
"timestamp": "2024-05-28T15:31:03.999566Z",
"severity": "WARNING",
"logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
"receiveTimestamp": "2024-05-28T16:30:56.304108670Z"
}
CV プラットフォーム ポリシーの検証違反を表示する
有効にしたプラットフォーム ポリシーに違反するイメージがない場合、ログエントリは表示されません。
過去 7 日間の CV ログエントリを表示するには、次のコマンドを実行します。
gcloud logging read \
--order="desc" \
--freshness=7d \
--project=CLUSTER_PROJECT_ID \
'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "policyName"'
CLUSTER_PROJECT_ID
は、クラスタ プロジェクト ID に置き換えます。
チェックの種類
CV では、チェックの違反情報が checkResults
に記録されます。エントリで、値 checkType
はチェックを示します。各チェックの値は次のとおりです。
ImageFreshnessCheck
SigstoreSignatureCheck
SimpleSigningAttestationCheck
SlsaCheck
TrustedDirectoryCheck
VulnerabilityCheck
サンプルログ
次の CV ロギング エントリの例は、信頼できるディレクトリ チェックに違反する非遵守のイメージを示しています。
{
"insertId": "637c2de7-0000-2b64-b671-24058876bb74",
"jsonPayload": {
"podEvent": {
"endTime": "2022-11-22T01:14:30.430151Z",
"policyName": "projects/123456789/platforms/gke/policies/my-policy",
"images": [
{
"result": "DENY",
"checkResults": [
{
"explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
"checkSetName": "My check set",
"checkSetIndex": "0",
"checkName": "My trusted directory check",
"verdict": "NON_CONFORMANT",
"checkType": "TrustedDirectoryCheck",
"checkIndex": "0"
}
],
"image": "gcr.io/my-project/hello-app:latest"
}
],
"verdict": "VIOLATES_POLICY",
"podNamespace": "default",
"deployTime": "2022-11-22T01:06:53Z",
"pod": "hello-app"
},
"@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
},
"resource": {
"type": "k8s_cluster",
"labels": {
"project_id": "my-project",
"location": "us-central1-a",
"cluster_name": "my-test-cluster"
}
},
"timestamp": "2022-11-22T01:44:28.729881832Z",
"severity": "WARNING",
"logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
"receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}
クリーンアップ
このセクションでは、このガイドの前半で構成した CV モニタリングをクリーンアップする方法について説明します。
クラスタで CV モニタリングを無効にするか、Binary Authorization と CV の両方を無効にできます。
クラスタで Binary Authorization を無効にする
クラスタで CV と Binary Authorization の両方を無効にするには、次のコマンドを実行します。
gcloud beta container clusters update CLUSTER_NAME \
--binauthz-evaluation-mode=DISABLED \
--location=LOCATION \
--project=CLUSTER_PROJECT_ID
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前LOCATION
: クラスタのロケーションCLUSTER_PROJECT_ID
: クラスタ プロジェクト ID
クラスタでチェックベースのポリシー モニタリングを無効にする
クラスタでチェックベースのポリシーを使用して CV を無効にし、Binary Authorization 適用ポリシーを使用して適用を再度有効にするには、次のコマンドを実行します。
gcloud beta container clusters update CLUSTER_NAME \
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
--location=LOCATION \
--project="CLUSTER_PROJECT_ID"
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前LOCATION
: クラスタのロケーションCLUSTER_PROJECT_ID
: クラスタ プロジェクト ID
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE
は、古いフラグ --enable-binauthz
と同じです。
ポリシーを削除する
ポリシーを削除するには、次のコマンドを実行します。チェックベースのポリシー監査を無効にするために、チェックベースのプラットフォーム ポリシーを削除する必要はありません。
gcloud beta container binauthz policy delete POLICY_ID \
--platform=gke \
--project="POLICY_PROJECT_ID"
次のように置き換えます。
POLICY_ID
: ポリシーの IDPOLICY_PROJECT_ID
: ポリシー プロジェクト ID
次のステップ
- イメージの鮮度チェックを使用する
- シンプルな署名証明書チェックを使用する
- Sigstore 署名チェックを使用する
- SLSA チェックを使用する
- 信頼できるディレクトリのチェックを使用する
- 脆弱性チェックを使用する
- CV ログを表示する