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


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

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

をご覧ください。

データを保存する

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

組み込み機能を使用する場合でも、Cloud Key Management Service(Cloud KMS)などの機能を使用する場合でも、このデータが保存時に暗号化されていることを確認する必要があります。

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

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

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

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

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

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

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

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

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

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

WIP とプロバイダを設定する手順は次のとおりです。

  1. WIP を作成する

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

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

    • 発行者 URI が https://confidentialcomputing.googleapis.com/

    • https://sts.googleapis.com の許可されたオーディエンス。

    • 値が assertion.sub のプロバイダ属性マッピング google.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: 署名付きコンテナに関連付けられ、 Simple Signing 形式に準拠するペイロードの署名。
  • 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 テクノロジーを検証します。サポートされているプラットフォームは次のとおりです。

  • GCP_AMD_SEV
  • INTEL_TDX
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 文字列

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

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

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

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

assertion.submods.gce.zone

連携するサービス:

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

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

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