このページでは、Binary Authorization 証明書の作成手順について説明します。
証明書を使用して、Google Kubernetes Engine(GKE)や Cloud Run などのプラットフォームへの特定のコンテナ イメージのデプロイを承認します。証明書を使用するには、ポリシーの適切なルールで証明書を要求する必要があります。
1 つの証明書で、異なる場所または異なるレジストリ(Artifact Registry、Container Registry、外部コンテナ レジストリなど)に保存されている同一のイメージを承認できます。
デプロイ時に、Binary Authorization は認証者を使用して証明書を検証します。
Cloud Run、GKE、Google Distributed Cloud、Cloud Service Mesh で Binary Authorization を設定するには、プラットフォーム別の設定を参照してプラットフォームを選択します。
GKE ユーザー: Binary Authorization と Google Kubernetes Engine(GKE)を使用して証明書ベースで適用する方法を詳しく説明したチュートリアルについては、コマンドライン ツールの使用を開始するまたは Google Cloud コンソールの使用を開始するをご覧ください。
始める前に
証明書の概要には、証明書の作成前に完了する必要がある手順が記載されています。
Google Cloud コンソール、Google Cloud CLI、または REST API を使用して、認証者を作成します。
環境を設定する
プロジェクト ID を指定します。
ATTESTOR_PROJECT_ID=ATTESTOR_PROJECT_ID ATTESTATION_PROJECT_ID=ATTESTATION_PROJECT_ID
次のように置き換えます。
- ATTESTOR_PROJECT_ID: 認証者を保存するプロジェクトの名前
- ATTESTATION_PROJECT_ID: 証明書を保存するプロジェクトの名前
認証者と同じプロジェクトに証明書を作成する場合は、両方の変数に同じプロジェクト ID を使用します。さまざまなプロジェクトでの職掌分散を示す詳細なチュートリアルについては、マルチプロジェクト設定をご覧ください。
認証者の名前とイメージ情報を指定します。
ATTESTOR_NAME=ATTESTOR_NAME IMAGE_PATH=IMAGE_PATH IMAGE_DIGEST=IMAGE_DIGEST IMAGE_TO_ATTEST="${IMAGE_PATH}@${IMAGE_DIGEST}"次のように置き換えます。
- ATTESTOR_NAME: 認証者の名前(
build-secure、prod-qaなど)。 IMAGE_PATH: イメージパスを表す URI。URI にはドメイン名とイメージ名を含める必要がありますが、実際のイメージを参照する必要はありません。証明書の作成中、イメージはアクセスされません。イメージパスの例を次に示します。
us-docker.pkg.dev/google-samples/containers/gke/hello-appgcr.io/example-project/quickstart-imageexample.com/hello-app。
IMAGE_DIGEST: イメージ マニフェストのダイジェスト。たとえば、
sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567はサンプルのus-docker.pkg.dev/google-samples/containers/gke/hello-appイメージパスに関連付けられたイメージ ダイジェストです。Artifact Registry 内のイメージのダイジェストを取得する方法については、イメージの管理をご覧ください。Container Registry のイメージの場合は、イメージのバージョンの一覧表示をご覧ください。
- ATTESTOR_NAME: 認証者の名前(
Identity and Access Management のロールを付与する
証明書を作成するには、認証者を作成する ID に次の Identity and Access Management(IAM)ロールを付与する必要があります。
- 認証者に関連付けられているメモリソースに対する
roles/containeranalysis.notes.attacher。 - 証明書プロジェクト リソースに対する
roles/containeranalysis.occurrences.editor。
証明書に基づいて証明書を作成します。認証者は Artifact Analysis メモに関連付けられています。証明書を作成すると、Artifact Analysis のオカレンスが作成され、メモに添付されます。
詳しくは、アクセス権の付与をご覧ください。
Cloud Build パイプラインで証明書を作成する方法については、Cloud Build を使用して証明書を作成するをご覧ください。
証明書を作成する
ローカルに保存された鍵を使用して証明書を作成する
ローカルの鍵で署名された証明書を作成する手順は次のとおりです。
署名ペイロード ファイルを作成します。
gcloud
署名ペイロード ファイルを作成するには、次のコマンドを入力します。
gcloud container binauthz create-signature-payload \ --artifact-url="${IMAGE_TO_ATTEST}" > /tmp/generated_payload.jsonJSON 形式のペイロード ファイルは、次の出力のようになります。
{ "critical": { "identity": { "docker-reference": "us-docker.pkg.dev/google-samples/containers/gke/hello-app" }, "image": { "docker-manifest-digest": "sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" }, "type": "Google cloud binauthz container signature" } }REST API
このドキュメントで前に設定した環境変数を使用して、
/tmp/generated_payload.jsonという名前のペイロード ファイルを作成します。cat > /tmp/generated_payload.json << EOM { "critical": { "identity": { "docker-reference": "${IMAGE_PATH}" }, "image": { "docker-manifest-digest": "${IMAGE_DIGEST}" }, "type": "Google cloud binauthz container signature" } } EOM秘密鍵でペイロードに署名し、署名ファイルを生成します。
このガイドでは、署名に推奨の楕円曲線デジタル署名アルゴリズム(ECDSA)を使用します。RSA アルゴリズムを使用することもできます。署名アルゴリズムの詳細については、鍵の目的とアルゴリズムをご覧ください。このガイドでは、公開鍵基盤(X.509)(PKIX)署名形式も使用します。PGP も使用できます。
PRIVATE_KEY_FILE=PRIVATE_KEY_FILE openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signaturePRIVATE_KEY_FILE は、認証者の作成時に生成した秘密鍵のパスに置き換えます。
公開鍵 ID を取得します。
次のコマンドを入力して、認証者から公開鍵 ID を取得できます。
PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME} \ --format='value(userOwnedGrafeasNote.publicKeys[0].id)')証明書を作成します。
gcloud
証明書を作成して検証するには、次のように入力します。
gcloud container binauthz attestations create \ --project="${ATTESTATION_PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}" \ --signature-file=/tmp/ec_signature \ --public-key-id="${PUBLIC_KEY_ID}" \ --validatevalidateフラグは、ポリシーで構成した認証者が証明書を検証できることを確認します。注: 鍵 ID は任意の文字列にできます。
REST API
証明書を作成するには:
証明書に関連付けられた認証者を取得し、保存されている公開鍵 ID を抽出します。
curl \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ "https://binaryauthorization.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/attestors/"Binary Authorization は、次のような JSON オブジェクトを返します。
{ "name": "projects/example-project/attestors/test-attestor", "userOwnedGrafeasNote": { "noteReference": "projects/example-project/notes/test-attestor", "publicKeys": [ { "id": "ni:///sha-256;EwVxs8fNUAHq9FI2AMfh8WNIXVBuuTMeGtPH72U-I70", "pkixPublicKey": { "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXnpuYEfvLl1kj4fjxViFRwY1a+zC\n5qzlf9LJIK+rnjq42tiKGyyXMbnZKJiYPPdMDGyltnkrABnztg2jJ48aYQ==\n-----END PUBLIC KEY-----\n", "signatureAlgorithm": "ECDSA_P256_SHA256" } } ], "delegationServiceAccountEmail": "service-363451293945@gcp-sa-binaryauthorization.iam.gserviceaccount.com" }, "updateTime": "2019-06-26T16:58:33.977438Z" }公開鍵は
idフィールドにあります。/tmp/attestation.jsonで、証明書を記述する JSON ファイルを作成します。cat > /tmp/attestation.json << EOM { "resourceUri": "${IMAGE_TO_ATTEST}", "note_name": "${NOTE_URI}", "attestation": { "serialized_payload": "$(base64 --wrap=0 /tmp/generated_payload.json)", "signatures": [ { "public_key_id": "${PUBLIC_KEY_ID}", "signature": "$(base64 --wrap=0 /tmp/ec_signature)" } ] } } EOM証明書を作成します。
curl -X POST \ -H "Content-Type: application/json" \ -H "X-Goog-User-Project: ${ATTESTATION_PROJECT_ID}" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ --data-binary @/tmp/attestation.json \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTATION_PROJECT_ID}/occurrences/"
Cloud KMS を使用して証明書を作成する
Cloud Key Management Service を使用して証明書を作成するには:
環境変数を作成します。
KMS_KEY_PROJECT_ID=