1. 概要
Confidential Space は、組織がデータの機密性を維持しながら、安全なマルチパーティ データ共有とコラボレーションを実現します。つまり、組織はデータの制御を維持し、不正アクセスから保護しながら、他の組織とコラボレーションできます。
Confidential Space を使用すると、機密性の高いデータ(多くの場合規制対象のデータ)を完全に管理しながら集約、分析し、相互に価値を得ることができます。Confidential Space では、個人を特定できる情報(PII)、保護医療情報(PHI)、知的財産、暗号シークレットなどの機密データを完全に管理しながら集約、分析することで、共同作業を行う企業は相互に価値を得ることができます。
必要なもの
- Google Cloud Platform プロジェクト
- Chrome や Firefox などのブラウザ
- Google Compute Engine(codelab)、Confidential VM、コンテナ、リモート リポジトリに関する基本的な知識
- Cloud KMS の基本的な知識(Codelab)
- サービス アカウント、Workload Identity 連携、属性条件に関する基本的な知識。
学習内容
- Confidential Space の実行に必要な Cloud リソースを構成する方法
- Confidential Space VM イメージを実行している Confidential VM でワークロードを実行する方法
- ワークロード コードの属性(what)、Confidential Space 環境(where)、ワークロードを実行しているアカウント(who)に基づいて、保護されたリソースへのアクセスを承認する方法。
この Codelab では、Primus 銀行と Secundus 銀行の間に機密スペースを設定して、アカウントリスト全体を共有することなく、両行の共通顧客を特定します。次の作業を行います。
- ステップ 1: Primus 銀行と Secundus 銀行に必要なクラウド リソースを設定する。これらのクラウド リソースには、Primus 銀行と Secundus 銀行の Cloud Storage バケット、KMS 鍵、Workload Identity プール、サービス アカウントが含まれます。Primus Bank と Secundus Bank は、顧客データを Cloud Storage バケットに保存し、Cloud Key Management Service 鍵を使用してデータを暗号化します。
- ステップ 2: ワークロード VM で使用されるワークロード サービス アカウントを作成します。ワークロードのオペレーターである Secundus Bank がワークロード VM を起動します。Primus Bank がワークロード コードを作成します。
- ステップ 3: 2 つの CLI コマンドを含むワークロードを作成します。1 つは指定されたロケーションの顧客数をカウントするためのコマンド、もう 1 つは Primus Bank と Secundus Bank の共通顧客を見つけるためのコマンドです。ワークロードは Primus Bank によって作成され、Docker イメージとしてパッケージ化されます。この Docker イメージは Artifact Registry に公開されます。
- ステップ 4: ワークロードを承認します。Primus Bank は、Workload Identity プールを使用して、ワークロードを実行しているユーザー、ワークロードの機能、ワークロードの実行場所の属性に基づいて、ワークロードが顧客データにアクセスできるように承認します。
- ステップ 5: ワークロードが実行されると、ワークロードと環境のクレームを含む構成証明検証サービストークンを提供して、データ コラボレータ(Primus Bank と Secundus Bank)のクラウド リソースへのアクセスをリクエストします。トークンのワークロード測定クレームが Primus 銀行と Secundus 銀行の Workload Identity プールの属性条件と一致する場合、それぞれのクラウド リソースへのアクセス権を持つサービス アカウント アクセス トークンが返されます。クラウド リソースにアクセスできるのは、Confidential Space 内で実行されているワークロードのみです。
- ステップ 5(a): 特定の地域の Primus Bank の顧客数をカウントする最初のワークロードを実行します。このワークロードの場合、Primus Bank はデータ コラボレータとワークロード作成者であり、Confidential Space で実行されるワークロードに暗号化された顧客リストを提供します。Secundus Bank はワークロード オペレーターであり、Confidential Space でワークロードを実行します。
- ステップ 5(b): Primus 銀行と Secundus 銀行の共通顧客を検索する 2 番目のワークロードを実行します。このワークロードでは、Primus Bank と Secundus Bank の両方がデータ コラボレータになります。暗号化された顧客リストを Confidential Space で実行されているワークロードに提供します。Secundus Bank は、ワークロード オペレーターになります。このワークロードは、共通の顧客を見つけるために Secundus Bank の暗号化された顧客リストにもアクセスする必要があるため、Secundus Bank からも承認されます。この場合、Secundus Bank は、Primus Bank のステップ 4 で説明したように、ワークロードを実行しているユーザー、ワークロードの機能、ワークロードの実行場所の属性に基づいて、ワークロードに顧客データへのアクセスを許可します。
2. Cloud リソースを設定する
始める前に
- 次のコマンドを使用して このリポジトリのクローンを作成し、この Codelab で使用する必要なスクリプトを取得します。
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- この Codelab のディレクトリに変更します。
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
- 以下に示すように、必要なプロジェクト環境変数が設定されていることを確認します。GCP プロジェクトの作成の詳細については、 こちらの Codelab をご覧ください。プロジェクト ID の取得方法と、プロジェクト ID とプロジェクト名、プロジェクト番号の違いについては、こちらをご覧ください。
export PRIMUS_PROJECT_ID=<GCP project id of Primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus bank>
- プロジェクトの課金を有効にします。
- 両方のプロジェクトで Confidential Computing API と次の API を有効にします。
gcloud services enable \
cloudapis.googleapis.com \
cloudkms.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- このコマンドを使用して、リソース名の変数を次のように設定します。リソース名は、これらの変数(
export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket'
など)を使用してオーバーライドできます。 - Primus プロジェクトの既存のクラウド リソース名を使用して、次の変数を設定できます。変数が設定されている場合、Primus プロジェクトの対応する既存のクラウド リソースが使用されます。変数が設定されていない場合、クラウド リソース名は project-name から生成され、新しいクラウド リソースが次の一部として作成されます。
| Primus Bank の顧客データ ファイルを格納するバケット。 |
| クレームを検証する Primus Bank の Workload Identity プール(WIP)。 |
| Primus Bank の Workload Identity プール プロバイダ。構成には、構成証明検証サービスによって署名されたトークンに使用する認可条件が含まれています。 |
|
|
| Primus Bank の |
| Primus Bank の暗号鍵 |
| ワークロード Docker イメージが push されるアーティファクト リポジトリ。 |
- 次の変数は、Secundus プロジェクトの既存のクラウド リソース名で設定できます。変数が設定されている場合、Secundus プロジェクトの対応する既存のクラウド リソースが使用されます。変数が設定されていない場合、クラウド リソース名は project-name から生成され、新しいクラウド リソースが次の一部として作成されます。
| Secundus 銀行の顧客データ ファイルを保存するバケット |
| クレームを検証する Secundus Bank の Workload Identity プール(WIP)。 |
| Secundus Bank の Workload Identity プール プロバイダ。構成証明検証サービスによって署名されたトークンに使用する承認条件が含まれています。 |
|
|
| Secundus Bank の |
| Secundus Bank の暗号鍵 |
| ワークロードの結果を保存するバケット。 |
| ワークロード コンテナ イメージ名。 |
| ワークロード コンテナ イメージのタグ。 |
| ワークロードを実行する Confidential VM にアクセスする権限を持つサービス アカウント。 |
- この Codelab では、次に示すアーティファクトを使用します。
primus_customer_list.csv
: Primus Bank の顧客データを含むファイル。この Codelab で使用するサンプル ファイルはこちらからダウンロードできます。secundus_customer_list.csv
: Secundus Bank の顧客データを含むファイル。この Codelab で使用するサンプル ファイルはこちらからダウンロードできます。- これらの 2 つのプロジェクトには、次の権限が必要です。
$PRIMUS_PROJECT_ID
には、Cloud KMS 管理者、ストレージ管理者、Artifact Registry 管理者、サービス アカウント管理者、IAM Workload Identity プール管理者が必要です。$SECUNDUS_PROJECT_ID
には、Compute 管理者、ストレージ管理者、サービス アカウント管理者、Cloud KMS 管理者、IAM Workload Identity プール管理者、セキュリティ管理者(省略可)が必要です。- 次のスクリプトを実行して、残りの変数名を、リソース名のプロジェクト ID に基づく値に設定します。
source config_env.sh
Primus Bank のクラウド リソースを設定する
Primus Bank には次のクラウド リソースが必要です。次のスクリプトを実行して、Primus Bank のリソースを設定します。
- Primus Bank の暗号化された顧客データ ファイルを保存する Cloud Storage バケット(
$PRIMUS_INPUT_STORAGE_BUCKET
)。 - Primus Bank の顧客データ ファイルを暗号化するための KMS の暗号鍵(
$PRIMUS_ENC_KEY
)とキーリング($PRIMUS_ENC_KEYRING
)。 - Workload Identity プール(
$PRIMUS_WORKLOAD_IDENTITY_POOL
): プロバイダで構成された属性条件に基づいてクレームを検証します。 - 上記の Workload Identity プール(
$PRIMUS_WORKLOAD_IDENTITY_POOL
)に接続されているサービス アカウント($PRIMUS_SERVICE_ACCOUNT
)には、KMS 鍵を使用してデータを復号する(roles/cloudkms.cryptoKeyDecrypter
ロールを使用)、Cloud Storage バケットからデータを読み取る(objectViewer
ロールを使用)、サービス アカウントを Workload Identity プールに接続する(roles/iam.workloadIdentityUser
を使用)権限があります。
./setup_primus_bank_resources.sh
Secundus Bank のクラウド リソースを設定する
Secundus Bank には、次のクラウド リソースが必要です。次のスクリプトを実行して、Secundus Bank リソースを設定します。この手順の一環として、次のリソースが作成されます。
- Secundus Bank の暗号化された顧客データ ファイルを保存する Cloud Storage バケット(
$SECUNDUS_INPUT_STORAGE_BUCKET
)。 - Secundus Bank のデータファイルを暗号化するための KMS の暗号鍵(
$SECUNDUS_ENC_KEY
)とキーリング($SECUNDUS_ENC_KEYRING
)。 - Workload Identity プール(
$SECUNDUS_WORKLOAD_IDENTITY_POOL
): プロバイダで構成された属性条件に基づいてクレームを検証します。 - 上記の Workload Identity プール(
$SECUNDUS_WORKLOAD_IDENTITY_POOL
)に接続されているサービス アカウント($SECUNDUS_SERVICE_ACCOUNT
)には、KMS 鍵を使用してデータを復号する(roles/cloudkms.cryptoKeyDecrypter
ロールを使用)、Cloud Storage バケットからデータを読み取る(objectViewer
ロールを使用)、サービス アカウントを Workload Identity プールに接続する(roles/iam.workloadIdentityUser
ロールを使用)権限があります。 - Secundus Bank によるワークロード実行の結果を保存する Cloud Storage バケット(
$SECUNDUS_RESULT_STORAGE_BUCKET
)。
./setup_secundus_bank_resources.sh
3. ワークロードを作成する
ワークロード サービス アカウントを作成する
次に、ワークロードのサービス アカウントを作成します。このアカウントには、後述の必要なロールと権限を付与します。次のスクリプトを実行して、Secundus Bank プロジェクトにワークロード サービス アカウントを作成します。ワークロードを実行する VM はこのサービス アカウントを使用します。
このワークロード サービス アカウント($WORKLOAD_SERVICE_ACCOUNT
)には、次のロールが付与されます。
- ワークロード サービス アカウントに
confidentialcomputing.workloadUser
ロールを付与します。これにより、ユーザー アカウントは構成証明トークンを生成できるようになります。 - ワークロード サービス アカウントの権限に
logging.logWriter
ロールを付与します。これにより、Confidential Space 環境はシリアル コンソールに加えて Cloud Logging にもログを書き込むことができるため、VM の終了後にログを使用できます。 objectViewer
:$PRIMUS_INPUT_STORAGE_BUCKET
Cloud Storage バケットからデータを読み取ります。objectViewer
:$SECUNDUS_INPUT_STORAGE_BUCKET
Cloud Storage バケットからデータを読み取ります。objectAdmin
: ワークロードの結果を$SECUNDUS_RESULT_STORAGE_BUCKET
Cloud Storage バケットに書き込みます。
./create_workload_service_account.sh
ワークロードを作成する
このステップでは、この Codelab で使用するワークロードの Docker イメージを作成します。ワークロードは、次の機能を備えた単純な GoLang アプリケーションです。
- 指定した地域のユーザー数をカウントします。
- それぞれの Cloud Storage バケットに保存されている顧客リストから、Primus 銀行と Secundus 銀行の共通顧客を検索します。
次のスクリプトを実行して、次の手順が実行されるワークロードを作成します。
- ワークロードを公開する Primus Bank が所有する Artifact Registry(
$PRIMUS_ARTIFACT_REPOSITORY
)を作成します。 - コードを生成し、必要なリソース名で更新します。この Codelab で使用されるワークロード コードは、こちらにあります。
- コードをビルドして Docker イメージにパッケージ化します。対応する Dockerfile はこちらにあります。
- Primus Bank が所有する Artifact Registry(
$PRIMUS_ARTIFACT_REGISTRY
)に Docker イメージを公開します。 - サービス アカウント
$WORKLOAD_SERVICE_ACCOUNT
に Artifact Registry($PRIMUS_ARTIFACT_REGISTRY
)の読み取り権限を付与します。
./create_workload.sh
4. ワークロードを承認して実行する
ワークロードを承認する
Primus Bank は、次のリソースの属性に基づいて、ワークロードが顧客データにアクセスできるように承認したいと考えています。
- 内容: 確認済みのコード
- Where: 安全な環境
- Who: 信頼できるオペレーター
Primus は Workload Identity 連携を使用して、これらの要件に基づいてアクセス ポリシーを適用します。
Workload Identity 連携では、属性条件を指定できます。これらの条件により、Workload Identity プール(WIP)で認証できる ID が制限されます。証明書検証サービスは、Workload Identity プール プロバイダとして WIP に追加して、測定結果を提示し、ポリシーを適用できます。
Workload Identity プールは、クラウド リソースの設定手順の一環としてすでに作成されています。これにより、Primus Bank は新しい OIDC Workload Identity プール プロバイダを作成します。指定された --attribute-condition
は、ワークロード コンテナへのアクセスを承認します。この構成では、次のものが必要になります。
- 内容:
$PRIMUS_ARTIFACT_REPOSITORY
リポジトリにアップロードされた最新の$WORKLOAD_IMAGE_NAME
。 - 使用条件: Confidential Space 高信頼実行環境が、完全にサポートされている Confidential Space VM イメージで実行されている。
- 誰が実行する: Secundus Bank の
$WORKLOAD_SERVICE_ACCOUNT
サービス アカウント。
gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
--location="global" \
--workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
--issuer-uri="https://confidentialcomputing.googleapis.com/" \
--allowed-audiences="https://sts.googleapis.com" \
--attribute-mapping="google.subject='assertion.sub'" \
--attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
'STABLE' in assertion.submods.confidential_space.support_attributes &&
assertion.submods.container.image_reference == 'us-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' &&
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
Primus Bank 用に作成された WIP と同様に、Secundus Bank は、次の情報に基づいてワークロードに顧客データへのアクセスを許可したいと考えています。
- What: ワークロード。
- 場所: Confidential Space 環境。
- Who: ワークロードを実行しているアカウント(
$WORKLOAD_SERVICE_ACCOUNT
)。
Primus Bank は、画像タグを含む image_reference
クレームを使用して、アクセスを承認するかどうかを判断します。リモート リポジトリを管理しているため、データを漏洩しないイメージにのみタグを付けることができます。
一方、Secundus Bank はイメージを取得するリポジトリを管理していないため、この前提を安全に立てることはできません。代わりに、ワークロードの image_digest
に基づいてワークロードへのアクセスを承認します。Primus 銀行が別のイメージを参照するように変更できる image_reference
とは異なり、Primus 銀行は、前述のステップで Secundus 銀行が監査したイメージ以外のイメージを image_digest
が参照するようにすることはできません。
Workload Identity プール プロバイダを作成する前に、プロバイダの属性条件で使用されるワークロード コンテナ イメージの image_digest
を収集します。
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud config set project $SECUNDUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $SECUNDUS_WIP_PROVIDER \
--location="global" \
--workload-identity-pool="$SECUNDUS_WORKLOAD_IDENTITY_POOL" \
--issuer-uri="https://confidentialcomputing.googleapis.com/" \
--allowed-audiences="https://sts.googleapis.com" \
--attribute-mapping="google.subject='assertion.sub'" \
--attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
'STABLE' in assertion.submods.confidential_space.support_attributes &&
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' &&
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
ワークロードを実行する
このステップの一環として、Secundus Bank は Confidential Space でワークロードを実行します。このワークロードは、Primus の Workload Identity プールと Secundus の Workload Identity プールからアクセス トークンを取得し、それぞれ Primus Bank と Secundus Bank の顧客データを読み取って復号します。
必要な TEE 引数は、メタデータ フラグを使用して渡されます。ワークロード コンテナの引数は、フラグの「tee-cmd
」部分を使用して渡されます。ワークロードの実行結果は $SECUNDUS_RESULT_STORAGE_BUCKET
に公開されます。
最初のワークロードを実行する
最初のワークロードの実行の一環として、ワークロードはワークロード コンテナの引数で指定されたロケーションから Primus Bank の顧客数をカウントします。以下に示すように、最初のワークロードは「count-location
」コマンドを実行し、結果は $SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result
に保存されます。
gcloud compute instances create ${WORKLOAD_VM1} \
--project=${SECUNDUS_PROJECT_ID} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform \
--zone=${SECUNDUS_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]""
結果を表示
Secundus プロジェクトで、最初のワークロードの結果を確認します。ワークロードの実行が完了し、結果が Cloud Storage バケットで利用可能になるまで 3 ~ 5 分待ちます。
gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result
結果は 3
になります。これは、primus_customer_list.csv
ファイルに記載されているシアトル出身のユーザーの数です。
2 つ目のワークロードを実行する
2 回目のワークロード実行では、Primus Bank と Secundus Bank の共通の顧客を検索します。以下に示すように、2 番目のワークロードは「list-common-customers
」コマンドを実行し、結果は $SECUNDUS_RESULT_STORAGE_BUCKET/list-common-count
に保存されます。
gcloud compute instances create ${WORKLOAD_VM2} \
--project=${SECUNDUS_PROJECT_ID} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform \
--zone=${SECUNDUS_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""
結果を表示
Secundus プロジェクトで、2 番目のワークロードの結果を確認します。ワークロードの実行が完了し、結果が Cloud Storage バケットで利用可能になるまで 3 ~ 5 分待ちます。
gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
結果は次のリストになります。これは、Primus 銀行と Secundus 銀行の共通顧客です。
出力:
Eric
Clinton
Ashley
Cooper
不正なワークロードを実行する
Primus 銀行と Secundus 銀行との間で、Secundus 銀行が Primus 銀行のデータにアクセスすることを許可する契約が期限切れになりました。そこで、Primus Bank は、新しいパートナーである Tertius Bank のサービス アカウントを持つ VM を許可するように属性条件を更新します。
Primus Bank が Workload Identity プール プロバイダを変更する
$PRIMUS_PROJECT_ID
で、新しいロケーションでワークロードを承認するように、構成証明検証 ID プロバイダの属性条件を更新します。
- プロジェクトを $PRIMUS_PROJECT_ID に設定します。
gcloud config set project $PRIMUS_PROJECT_ID
- 次のコマンドを使用して、Tertius Bank の GCP プロジェクト ID をエクスポートします。後で Primus Bank は、これを使用して Workload Identity プール プロバイダの属性条件を更新します。Primus 銀行は、Secundus 銀行のワークロード サービス アカウントの承認を停止しません。Tertius Bank ワークロード サービス アカウントが許可されるようになりました。
export TERTIUS_PROJECT_ID=<GCP project-id of Tertius Bank>
- Workload Identity プールの OIDC プロバイダを更新します。ここで、
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts
が'$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts.
に変更されています。Secundus Bank のワークロード サービス アカウントを承認する代わりに、Tertius Bank のワークロード サービス アカウントが承認されます。
gcloud iam workload-identity-pools providers update-oidc $PRIMUS_WIP_PROVIDER \
--location="global" \
--workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
--issuer-uri="https://confidentialcomputing.googleapis.com/" \
--allowed-audiences="https://sts.googleapis.com" \
--attribute-mapping="google.subject='assertion.sub'" \
--attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
'STABLE' in assertion.submods.confidential_space.support_attributes &&
assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' &&
'$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
ワークロードを再実行する
Secundus Bank が元のワークロードを実行しようとすると、失敗します。エラーを表示するには、元の結果ファイルと VM インスタンスを削除してから、ワークロードをもう一度実行します。
既存の結果ファイルと VM インスタンスを削除する
- プロジェクトを
$SECUNDUS_PROJECT_ID
プロジェクトに設定します。
gcloud config set project $SECUNDUS_PROJECT_ID
- 結果ファイルを削除します。
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
- Confidential VM インスタンスを削除します。
gcloud compute instances delete ${WORKLOAD_VM2} --zone=${SECUNDUS_PROJECT_ZONE}
不正なワークロードを実行します。
gcloud compute instances create ${WORKLOAD_VM2} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform \
--zone=${SECUNDUS_PROJECT_ZONE}\
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""
エラーを表示
ワークロードの結果ではなく、エラー(The given credential is rejected by the attribute condition
)が表示される。
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
同様に、Primus Bank が Secundus Bank の顧客リスト全体を Primus Bank が所有するバケットに送信するようにワークロードを秘密裏に変更した場合、悪意のあるワークロードのダイジェストが Secundus Bank の Workload Identity プールで承認されたイメージ ダイジェストと異なるため、その試行は失敗します。
5. クリーンアップ
この Codelab で作成したリソースをクリーンアップするために使用できるスクリプトは、こちらにあります。このクリーンアップの一環として、次のリソースが削除されます。
- Primus Bank の Cloud Storage バケットを入力します(
$PRIMUS_INPUT_STORAGE_BUCKET)
)。 - Primus Bank のサービス アカウント(
$PRIMUS_SERVICE_ACCOUNT
)。 - イメージ署名(
$PRIMUS_COSIGN_REPOSITORY
)を保持する Primus Bank のアーティファクト レジストリ。 - Primus Bank の Workload Identity プール(
$PRIMUS_WORKLOAD_IDENTITY_POOL
)。 - Secundus Bank のワークロード サービス アカウント(
$WORKLOAD_SERVICE_ACCOUNT
)。 - Secundus Bank の Cloud Storage バケットを入力します(
$SECUNDUS_INPUT_STORAGE_BUCKET)
)。 - Secundus Bank のサービス アカウント(
$SECUNDUS_SERVICE_ACCOUNT
)。 - イメージ署名(
$SECUNDUS_COSIGN_REPOSITORY
)を保持する Secundus Bank のアーティファクト レジストリ。 - Secundus Bank の Workload Identity プール(
$SECUNDUS_WORKLOAD_IDENTITY_POOL
)。 - Secundus Bank のワークロード サービス アカウント(
$WORKLOAD_SERVICE_ACCOUNT
)。 - ワークロード コンピューティング インスタンス。
- Secundus Bank の結果ストレージ バケット(
$SECUNDUS_RESULT_STORAGE_BUCKET
)。 - Primus Bank のアーキティファクト リポジトリ(
$PRIMUS_ARTIFACT_REPOSITORY
)。
./cleanup.sh
確認が完了したら、プロジェクトの削除を検討してください。
- Cloud Platform Console に移動します。
- シャットダウンするプロジェクトを選択し、上部の [削除] をクリックします。これにより、プロジェクトの削除がスケジュールされます。
おめでとうございます!
これで、この Codelab は終了です。
Confidential Space を使用して、機密性を維持しながら共有データを保護する方法について学習しました。
次のステップ
以下の類似の Codelab をご覧ください。
- 署名付きコンテナ イメージの Codelab
- マルチパーティ コンピューティングと Confidential Space によってデジタル アセットをトランザクションする方法
- Confidential Space を使用して機密データを分析する