機密リソースを作成してアクセス権を付与する


データ コラボレーション パートナーは、ワークロードが機密データにアクセスできるように、次のリソースを設定する必要があります。

また、データ コラボレーション パートナーは、Confidential Space ワークロードの結果を保存する場所と、表示されるデータが一意か共有かを指定する必要があります。たとえば、同じ結果を、各データ コラボレーターに属する複数の Cloud Storage バケットに出力できます。

データを保存する

機密データをホストするために、データを保存する任意の Google Cloud サービスを使用できます。たとえば、次のいずれかのサービスを使用できます。

このデータは、組み込み機能を使用するか、Cloud Key Management Service(Cloud KMS)などの機能を使用して、保存時に暗号化する必要があります。

機密データを復号するサービス アカウントを作成する

サービス アカウントを使用して、機密データを Confidential Space ワークロードで使用できるようにし、そのデータへの人間のアクセスを制限します。

たとえば、Cloud Storage 内の機密ファイルを Cloud KMS で暗号化し、そのデータと復号鍵にアクセスする権限を持つサービス アカウントを作成します。

次に、そのサービス アカウントを WIP に接続します。別のプロジェクトに基づく承認済みの Confidential Space ワークロードは、その WIP を使用して、データを復号するサービス アカウントの権限を借用し、復号されたデータを取得して処理できます。

サービス アカウントは機密データの復号と処理の両方に使用されるため、機密データの可視性はオーナーに制限されます。ワークロードは Confidential VM で動作するため、ハードウェアベースのメモリ暗号化により、使用中のデータの機密性が確保されます。また、本番環境の Confidential Space イメージを使用するワークロード VM では SSH が無効になっているため、VM の実行中に誰も VM にアクセスできません。

例については、最初の Confidential Space 環境を作成するをご覧ください。

構成証明の検証用の WIP とプロバイダを作成する

信頼できないワークロード オペレーターからデータを保護するため、Confidential Space はワークロード イメージまたはその TEE の変更を検出する証明書プロセスを実装します。このプロセスは、Shielded VM のメジャード ブートと拡張ランタイム測定に基づいており、仮想トラステッド プラットフォーム モジュール(vTPM)デバイスの保護された、拡張のみレジスタでブート シーケンスの測定値をキャプチャします。

Confidential Space 証明書サービスは、WIP で検証できる形式の vTPM 証明書を含む OpenID Connect(OIDC)トークンを生成します。WIP は、プロバイダ属性条件として追加されたポリシーと照合します。これらのトークンは Google によって署名され、1 時間持続し、自動的に更新されます。

WIP がワークロードを承認すると、ワークロードはプロジェクト内のサービス アカウントの権限を借用して、機密データを復号して取得できます。

WIP とプロバイダを設定するには、次の手順を完了します。

  1. WIP を作成する

  2. 復号サービス アカウントを iam.workloadIdentityUser ロールで WIP に接続します。

  3. 次の詳細を使用して OIDC プロバイダを作成します。

    • 発行者 URI が https://confidentialcomputing.googleapis.com/ の場合。

    • 許可するオーディエンス https://sts.googleapis.com

    • 値が assertion.subgoogle.subject のプロバイダ属性マッピング。

    • ワークロードの構成証明の検証に使用される属性条件。使用可能なオプションについては、構成証明ポリシーを作成するをご覧ください。

構成証明ポリシーを作成する

WIP の作成の一環として、属性条件を追加します。これは、ワークロードがデータにアクセスするために満たす必要がある条件です。Confidential Space の場合、これらの属性条件が構成証明ポリシーを形成します。

ポリシーは Common Expression Language(CEL)で記述され、&& 演算子で連結できる一連の記述で構成されます。

gcloud CLI を使用して Workload Identity プールにプロバイダを追加する例を次に示します。ポリシーを定義する attribute-condition オプションも指定しています。

gcloud iam workload-identity-pools providers create-oidc attestation-verifier \
    --location=global \
    --workload-identity-pool=user-pool-name \
    --issuer-uri="https://confidentialcomputing.googleapis.com/" \
    --allowed-audiences="https://sts.googleapis.com" \
    --attribute-mapping="google.subject=assertion.sub" \
    --attribute-condition="assertion.submods.container.image_digest =='sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b' \
&& 'service-account@my-project.iam.gserviceaccount.com' in assertion.google_service_accounts \
&& assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes"

この例では、Workload Identity プールに接続されているサービス アカウントの権限を借用しようとする外部 ID は、次の詳細を証明し、一致させる必要があります。

  • ワークロード コンテナのイメージ ダイジェスト

  • ワークロード VM に接続されているサービス アカウントのアドレス

  • この CONFIDENTIAL_SPACE は、VM 上で実行されるソフトウェアであり、すべてのセキュリティ保証が組み込まれています

  • 本番環境の Confidential Space イメージのサポート属性

構成証明アサーション

証明書ポリシーの作成に使用できるアサーションの詳細は、次の表のとおりです。Confidential Space イメージ、ワークロード コンテナ、VM によって行われたアサーションを検証できます。

画像アサーション

アサーション タイプ 説明

assertion.dbgstat

関連する項目:

定義された文字列

Confidential Space イメージがデバッグ バージョンまたは本番環境バージョンであることを確認します。

有効な値は次のとおりです。

  • enable: デバッグ イメージが使用されていることを確認します。
  • disabled-since-boot: 本番環境イメージが使用されていることを確認します。

次のコードは、Confidential Space イメージのデバッグ バージョンが使用されていることを確認します。

assertion.dbgstat == "enable"

次のコードは、本番環境バージョンの Confidential Space イメージが使用されていることを確認します。

assertion.dbgstat == "disabled-since-boot"
assertion.submods.confidential_space.support_attributes 文字列配列

TEE のセキュリティ バージョンが本番環境の Confidential Space イメージであることを確認します。Confidential Space のデバッグ イメージにはサポート属性が設定されていません。

サポート属性は次の 3 つです。

  • LATEST: これは最新バージョンのイメージであり、サポートされています。LATEST イメージも STABLEUSABLE です。
  • STABLE: このバージョンのイメージはサポートされ、脆弱性のモニタリングが行われます。STABLE イメージも USABLE です。
  • USABLE: この属性のみを持つイメージはサポートされず、脆弱性のモニタリングは行われません。ご自身の責任で操作するようお願いいたします。

次のコードは、安定版の Confidential Space イメージが使用されていることを確認します。

"STABLE" in assertion.submods.confidential_space.support_attributes
assertion.swname 定義された文字列

証明を行うエンティティで実行されているソフトウェアを確認します。値は常に CONFIDENTIAL_SPACE です。

assertion.swname == "CONFIDENTIAL_SPACE"
assertion.swversion 文字列配列

Confidential Space イメージのソフトウェア バージョンを確認します。代わりに assertion.submods.confidential_space.support_attributes を使用して、最新バージョンのイメージをターゲットにすることをおすすめします。

int(assertion.swversion[0]) == 230103

コンテナの断言

アサーション タイプ 説明

assertion.submods.container.cmd_override

関連する項目:

文字列配列

ワークロード イメージで使用されている CMD コマンドとパラメータを確認します。

次のコードは、ワークロード イメージの CMD がオーバーライドされていないことを確認します。

size(assertion.submods.container.cmd_override) == 0

次のコードは、CMD オーバーライドの唯一のコンテンツが program であることを確認します。

assertion.submods.container.cmd_override == ['program']

assertion.submods.container.env

関連する項目:

JSON オブジェクト

環境変数とそれらの値がコンテナに明示的に渡されていることを確認します。

次のコードは、環境変数 example-env-1value-1 に設定され、example-env-2value-2 に設定されていることを確認します。

assertion.submods.container.env == {"example-env-1": "value-1", "example-env-2": "value-2"}

assertion.submods.container.env_override

関連する項目:

文字列

ワークロード オペレーターがコンテナ内の環境変数を上書きしたかどうかを確認します。

次のコードは、ワークロード オペレーターが example 環境変数をオーバーライドしていないことを確認します。

!has(assertion.submods.container.env_override.example)

次のコードは、ワークロード オペレーターが環境変数を上書きしていないことを確認します。

size(assertion.submods.container.env_override) == 0
assertion.submods.container.image_digest 文字列

ワークロード コンテナのイメージ ダイジェストを検証します。この条件を指定すると、複数の関係者がデータにアクセスできる承認済みワークロードについて合意できます。

assertion.submods.container.image_digest == "sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b"
assertion.submods.container.image_id 文字列

ワークロード コンテナのイメージ ID を確認します。

assertion.submods.container.image_id == "sha256:652a44b0e911271ba07cf2915cd700fdfa50abd62a98f87a57fdebc59843d93f"

assertion.submods.container.image_reference

関連する項目:

文字列

Confidential Space イメージの上に実行されているワークロード コンテナの場所を確認します。

assertion.submods.container.image_reference == "us-docker.pkg.dev/PROJECT_ID/WORKLOAD_CONTAINER:latest"

assertion.submods.container.image_signatures

関連する項目:

JSON オブジェクト

イメージに特定の署名が付加されているか、公開鍵と署名アルゴリズムによって署名されていることを検証します。この条件を指定すると、複数の関係者が、データにアクセスできる承認済みワークロードについて合意できます。

アサーションには次の要素を含めることができます。

  • key_id: 公開鍵の 16 進フィンガープリント。フィンガープリントを取得するには、次のコマンドを実行します。

    openssl pkey -pubin -in public_key.pem -outform DER | openssl sha256

    ここで、public_key.pem は PEM 形式の公開鍵です。

  • signature: 署名付きコンテナに関連付けられ、 シンプルな署名形式に従うペイロードの署名。
  • signature_algorithm: 鍵の署名に使用されるアルゴリズム。次のいずれかになります。

    • RSASSA_PSS_SHA256(SHA-256 ダイジェストを使用した RSASSA-PSS)
    • RSASSA_PKCS1V15_SHA256(SHA-256 ダイジェスト付きの RSASSA-PKCS1 v1_5)
    • ECDSA_P256_SHA256(P-256 曲線上の ECDSA(SHA-256 ダイジェストを使用))
assertion.swname == 'CONFIDENTIAL_SPACE' && ['ECDSA_P256_SHA256:PUBLIC_KEY_FINGERPRINT'].exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id)) && 'serviceaccount.iam.gserviceaccount.com' in assertion.google_service_accounts"

assertion.submods.container.restart_policy

関連する項目:

定義された文字列

ワークロードが停止した場合のコンテナ ランチャーの再起動ポリシーを確認します。

有効な値は次のとおりです。

  • Never(デフォルト)
  • Always
  • OnFailure
assertion.submods.container.restart_policy == "Never"

VM アサーション

アサーション タイプ 説明

assertion.google_service_accounts

関連する項目:

文字列配列

指定したサービス アカウントが、ワークロードを実行している VM に接続されているか、VM メタデータで tee-impersonate-service-accounts を使用して一覧表示されていることを確認します。

workload-service-account@my-project.iam.gserviceaccount.com in assertion.google_service_accounts
assertion.hwmodel 文字列

基盤となる Confidential Computing テクノロジーを検証します。サポートされているプラットフォームは次のとおりです。

assertion.hwmodel == "GCP_AMD_SEV"

assertion.submods.confidential_space.monitoring_enabled

関連する項目:

ブール値

構成証明を行うエンティティのモニタリング状態を確認します。

assertion.submods.confidential_space.monitoring_enabled.memory == true
assertion.submods.gce.instance_id 文字列

VM インスタンス ID を確認します。

assertion.submods.gce.instance_id == "0000000000000000000"
assertion.submods.gce.instance_name 文字列

VM インスタンスの名前を確認します。

assertion.submods.gce.instance_name == "workload-vm"
assertion.submods.gce.project_id 文字列

VM が指定したプロジェクト ID で Google Cloud プロジェクトを実行していることを確認します。

assertion.submods.gce.project_id == "project-id"
assertion.submods.gce.project_number 文字列

指定したプロジェクト番号の Google Cloud プロジェクトで VM が実行されていることを確認します。

assertion.submods.gce.project_number == "00000000000"

assertion.submods.gce.zone

関連する項目:

  • ワークロード オペレーター: --zone 値。
文字列

VM が指定されたゾーンで実行されていることを確認します。

assertion.submods.gce.zone == "us-central1-a"