データ コラボレーターは、ワークロードが機密データにアクセスできるように、次のリソースを設定する必要があります。
暗号化されたデータ。 Google Cloudに保存されます。
ワークロードを承認するワークロード ID プール(WIP)。WIP によってワークロードが承認されると、データ コラボレーターの機密データにアクセスして操作できるようになります。
また、データ コラボレーターは、Confidential Space ワークロードの結果をどこに保存するか、その結果が各コラボレーターに固有のものか、共有されるものかを選択する必要があります。たとえば、各データ コラボレーターに属する複数の Cloud Storage バケットに同じ結果を出力するように選択できます。
をご覧ください。暗号化されたデータを保存する
データを保存する Google Cloud サービスを使用して、機密データをホストできます。たとえば、次のいずれかのサービスを使用できます。
組み込み機能を使用する場合でも、Cloud Key Management Service(Cloud KMS)などの機能を使用する場合でも、このデータが保存時に暗号化されていることを確認する必要があります。
WIP でワークロードを承認する
WIP は、Confidential Space が外部ワークロードに フェデレーション ID として機密データへのアクセスと操作を許可するために使用するメカニズムです。フェデレーション ID は、独自のプロジェクト内のプリンシパルとして扱われる外部エンティティです。これにより、IAM ロールを付与して特定のリソースへのアクセス権を付与したり、サービス アカウントを権限借用して同じことを行ったりできます。
データ コラボレーターは、連携 ID として認証するエンティティのルールを設定する WIP 内にプロバイダを設定します。Confidential Space の場合、プロバイダで次の項目を定義する必要があります。
証明書サービス: このサービスは、ワークロードが Confidential VM インスタンスであることを検証し、最終的に OpenID Connect(OIDC)証明書トークンを WIP プロバイダに返します。ワークロード オペレーターは、使用する構成証明サービスを設定します。アクセス権を付与するには、WIP プロバイダに追加された構成証明サービスと一致する必要があります。
属性マッピング: 認証エンティティ(この場合はワークロードを実行している VM インスタンス)によって作成されたアサーションにマッピングされる Security Token Service アクセス トークンの属性。アサーションは、VM インスタンス自体、Confidential Space イメージ、ワークロード コンテナによって行われ、ワークロードによって WIP プロバイダに渡されます。これらの属性は、Cloud Logging の監査証跡や、ワークロード イメージ コンテナ ダイジェストなどのエンティティ アサーションの認証に基づいて IAM を介してロールを付与する場合などに使用されます。詳しくは、属性マッピングをご覧ください。
構成証明ポリシー: 認証エンティティがアクセス権を取得するために、そのアサーションに基づいて満たす必要のある一連の条件。
ワークロードが起動すると、Confidential Space Launcher は、ワークロード オペレーターによって定義された証明書サービスに証明書レポートを送信します。証明書サービスは Confidential VM インスタンスを検証し、OIDC 証明書トークンを返します。このトークンの有効期間は 1 時間で、自動的に更新されます。
次に、ワークロードによって証明書トークンが WIP プロバイダに渡され、プロバイダはそれを使用して、アサーションがプロバイダで定義された証明書ポリシーに合格したことを確認します。満たしている場合、ワークロードは機密リソースにアクセスできます。
外部ワークロード アクセス
WIP とプロバイダを設定する前に、ワークロードがリソースにアクセスする方法(リソースへの直接アクセスまたはサービス アカウントの権限借用)を選択する必要があります。
リソースへの直接アクセス
ワークロードには、直接リソース アクセス方式をおすすめします。
この方法では、認証エンティティのアサーションに関連付けられた WIP プロバイダにフェデレーション ID を設定します。これにより、ワークロードのコンテナ イメージ ダイジェストなどの属性に基づいて、ワークロードが IAM バインディングを介してリソースに直接アクセスできるように承認されます。
リソースへの直接アクセスには次のようなメリットがあります。
データ コラボレーターがワークロード サービス アカウントの権限を借用するサービス アカウントを設定する必要がないため、Confidential Space 環境の設定は手順が少なくなります。
ワークロードは、IAM によって決定された特定のリソースにのみアクセスできます。これは、権限が過剰なサービス アカウントや権限借用権限によって、攻撃者に意図しないアクセス権が付与される可能性があるサービス アカウントの権限借用方法よりも安全です。
各リソース アクセスは、複数のワークロードで共有される可能性のある、権限を借用したサービス アカウントの ID ではなく、ワークロード VM インスタンスのフェデレーション ID でロギングされます。ワークロード VM インスタンスの ID には、コンテナのイメージ ダイジェスト、ワークロードが動作しているプロジェクト番号、ワークロードを実行している VM インスタンスの ID などの詳細を含めることができます。これにより、より詳細な監査証跡が提供されます。
VM インスタンスの
selfLink
プロパティを WIP プロバイダのgoogle.subject
属性にマッピングする必要はありません。selfLink
値が長すぎると、この属性の 127 バイトの制限を超える可能性があり、WIP プロバイダの認証が失敗します。
サービス アカウントの権限借用
サービス アカウントの権限借用方法では、各データ コラボレーターがプライベート データを復号するためのサービス アカウントを設定し、そのサービス アカウントを独自の WIP に関連付けます。また、WIP プロバイダでワークロード サービス アカウントを指定します。これにより、ワークロード サービス アカウントはデータ コラボレーター サービス アカウントの権限を借用して、機密データを取得して操作できます。
サービス アカウントの権限借用は、次のシナリオでのみ使用する必要があります。
連携 ID をサポートしていない API にアクセスする場合。
VM インスタンスの selfLink
プロパティが非常に長い場合、サービス アカウントの権限借用メソッドで WIP プロバイダに対する認証が失敗することがあります。これは、構成証明トークンの sub
クレーム(selfLink
値に設定)が WIP プロバイダで google.subject
属性にマッピングされるためです。google.subject
属性には 127 バイトの上限があります。
VM インスタンスの selfLink
値が 127 バイトを超える場合は、VM インスタンスの名前を変更して selfLink
を短くするか、代わりに直接リソース アクセス方法を使用する必要があります。
WIP とプロバイダを設定する
プロバイダを設定する手順は、直接リソース アクセスを使用するか、サービス アカウントの権限借用を使用するかによって異なります。
リソースへの直接アクセス
直接リソース アクセス方法では、WIP とプロバイダを設定してから、特定のワークロード コンテナ イメージ ダイジェストに基づいて IAM ロールを設定します。
WIP とプロバイダを設定する
WIP とプロバイダを設定する手順は次のとおりです。
WIP を作成します。
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
WIP で OIDC プロバイダを作成します。
gcloud iam workload-identity-pools providers create-oidc attestation-verifier \ --location=global \ --workload-identity-pool=DATA_COLLABORATOR_POOL_NAME \ --issuer-uri="https://confidentialcomputing.googleapis.com/" \ --allowed-audiences="https://sts.googleapis.com" \ --attribute-mapping="google.subject=\"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digest" \ --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' \ && 'STABLE' in assertion.submods.confidential_space.support_attributes"
この例では次の値を使用します。
https://confidentialcomputing.googleapis.com/
のissuer-uri
。これは、Google Cloud Attestation が証明書サービスとして使用されていることを意味します。https://sts.googleapis.com
のallowed-audiences
。これは、認証情報をアクセス トークンと交換する Google の Security Token Service です。google.subject
のattribute-mapping
。値は次のとおりです。\"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digest
この値は、Common Expression Language(CEL)を使用して構築されます。次の値が
gcpcs
属性に割り当てられ、ワークロードがリソースにアクセスするたびに Cloud Logging に表示されます。assertion.submods.container.image_digest
: ワークロード コンテナ イメージのダイジェスト。assertion.submods.gce.project_number
: VM インスタンスのプロジェクト番号。assertion.submods.gce.instance_id
: VM インスタンスの ID。
また、
attribute.image_digest
はワークロード コンテナ イメージ ダイジェストであるassertion.submods.container.image_digest
に設定されます。この属性はマッピングされているため、特定イメージ ダイジェストに基づいて連携 ID に IAM ロールを付与できます。google.subject
値の合計長が 127 バイト未満である限り、使用可能なワークロードのアサーションをマッピングできます。次の
attribute-conditions
。これらは構成証明ポリシーを形成します。これらの条件がワークロードのアサーションと一致する場合、ワークロードは連携 ID として機密リソースにアクセスできます。assertion.swname == 'CONFIDENTIAL_SPACE'
: Confidential Space が VM で実行されているソフトウェアであり、すべての組み込みのセキュリティ保証があることを確認します。'STABLE' in assertion.submods.confidential_space.support_attributes
: 本番環境の Confidential Space イメージが使用されており、STABLE
サポート属性があることを確認します。
使用できる属性条件の詳細については、証明書ポリシーを作成するをご覧ください。
フェデレーション ID に IAM ロールを付与する
WIP プロバイダを作成したら、ID のワークロード イメージ コンテナ ダイジェストが想定値と一致するかどうかに基づいて、連携 ID に IAM ロールを付与できます。
次の例では、特定の Cloud Key Management Service 鍵を復号する権限をフェデレーション ID に付与する方法を示します。
gcloud kms keys add-iam-policy-binding \
projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \
--member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/attribute.image_digest/WORKLOAD_CONTAINER_IMAGE_DIGEST" \
--role=roles/cloudkms.cryptoKeyDecrypter
サービス アカウントの権限借用
サービス アカウントの権限借用方法には、次の処理が含まれます。
データ コラボレーター プロジェクトごとにサービス アカウントを作成し、機密データを復号する権限を付与します。
各データ コラボレーター プロジェクトに WIP を作成し、作成したばかりの各プロジェクトのサービス アカウントを WIP に関連付けます。
各 WIP に WIP プロバイダを作成し、データ コラボレーター サービス アカウントの権限借用を許可するアカウントとしてワークロード サービス アカウントを指定します。
機密データを復号するサービス アカウントを設定する
データ コラボレーター プロジェクトにサービス アカウントを作成します。
gcloud iam service-accounts create DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME
機密データの復号に必要な権限をサービス アカウントに付与します。たとえば、Cloud Storage の機密ファイルを Cloud KMS で暗号化する場合は、そのデータを復号する権限をサービス アカウントに付与する必要があります。
gcloud kms keys add-iam-policy-binding \ projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \ --member=serviceAccount:DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \ --role=roles/cloudkms.cryptoKeyDecrypter
WIP とプロバイダを設定する
WIP とプロバイダを設定するには、各データ コラボレーター プロジェクトで次の手順を完了します。
WIP を作成します。
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
偽装するサービス アカウントを WIP に
roles/iam.workloadIdentityUser
ロールで関連付けます。gcloud iam service-accounts add-iam-policy-binding \ DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \ --member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/*" \ --role=roles/iam.workloadIdentityUser
WIP に OIDC プロバイダを作成し、データ コラボレーターのサービス アカウントの権限を借用できるように、その中にワークロード サービス アカウントを定義します。
gcloud iam workload-identity-pools providers create-oidc attestation-verifier \ --location=global \ --workload-identity-pool=DATA_COLLABORATOR_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 == 'WORKLOAD_CONTAINER_IMAGE_DIGEST' \ && 'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_OPERATOR_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts \ && assertion.swname == 'CONFIDENTIAL_SPACE' \ && 'STABLE' in assertion.submods.confidential_space.support_attributes"
この例では次の値を使用します。
https://confidentialcomputing.googleapis.com/
のissuer-uri
。これは、Google Cloud Attestation が証明書サービスとして使用されていることを意味します。https://sts.googleapis.com
のallowed-audiences
。これは、認証情報をアクセス トークンと交換する Google の Security Token Service です。google.subject
のattribute-mapping
。値はassertion.sub
です。これは、構成証明トークンのsub
クレームで定義されている VM インスタンスのselfLink
です。ワークロードがリソースにアクセスするたびに、VM インスタンス
selfLink
が Cloud Logging に表示されます。次の
attribute-conditions
。これらは構成証明ポリシーを形成します。これらの条件がワークロードのアサーションと一致する場合、ワークロードは連携 ID としてリソースにアクセスできます。assertion.submods.container.image_digest == 'WORKLOAD_CONTAINER_IMAGE_DIGEST'
: ワークロード コンテナ イメージのダイジェストが想定値と一致することを確認します。'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts
: ワークロードに接続されたサービス アカウントが想定されるサービス アカウントと一致することを確認し、それを使用してデータ コラボレーター サービス アカウントの権限を借用します。assertion.swname == 'CONFIDENTIAL_SPACE'
: Confidential Space が VM で実行されているソフトウェアであり、すべての組み込みのセキュリティ保証があることを確認します。'STABLE' in assertion.submods.confidential_space.support_attributes
: 本番環境の Confidential Space イメージが使用されており、STABLE
サポート属性があることを確認します。
使用できる属性条件の詳細については、証明書ポリシーを作成するをご覧ください。
証明書ポリシーを作成する
WIP の作成の一環として、証明書ポリシーを作成する必要があります。認証エンティティのアサーションは、データにアクセスできるようにポリシーと一致する必要があります。
ポリシーは Common Expression Language(CEL)で記述され、&&
演算子で連結できる一連のステートメントで構成されます。
ステートメントでは、Confidential Space イメージ、ワークロード コンテナ イメージ、または VM インスタンスのアサーションを変数として使用し、指定した値を式として使用します。たとえば、ワークロードが Confidential Space を使用していること、STABLE
Confidential Space イメージを使用する必要があること、ワークロード VM インスタンスが実行されているゾーンが us-central1-a
であることを強制するポリシーを次に示します。
assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes" \
&& assertion.submods.gce.zone == "us-central1-a"
詳しくは、証明書のアサーションをご覧ください。
証明書のアサーション
次の表に、証明書ポリシーの作成に使用できるアサーションの詳細を示します。ポリシーは、Confidential Space イメージ、ワークロード コンテナ、VM インスタンスによって行われたアサーションを検証できます。
画像アサーション
アサーション | タイプ | 説明 |
---|---|---|
連携するサービス:
|
定義された文字列 |
Confidential Space イメージがデバッグ バージョンか本番環境バージョンかを確認します。 有効な値は次のとおりです。
例次のコードは、Confidential Space イメージのデバッグ バージョンが使用されていることを確認します。
次のコードは、Confidential Space イメージの本番環境バージョンが使用されていることを確認します。
|
assertion.submods.confidential_space.support_attributes |
文字列配列 |
TEE のセキュリティ バージョンが本番環境の Confidential Space イメージであることを確認します。Confidential Space のデバッグ イメージにはサポート属性が設定されていません。 サポート属性は次の 3 つです。
例次のコードは、Confidential Space イメージの安定版が使用されていることを確認します。
|
assertion.swname |
定義された文字列 |
証明を行うエンティティで実行されているソフトウェアを検証します。値は常に 例
|
assertion.swversion |
文字列配列 |
Confidential Space イメージのソフトウェア バージョンを検証します。代わりに 例
|
コンテナ アサーション
アサーション | タイプ | 説明 |
---|---|---|
連携するサービス:
|
文字列配列 |
ワークロード イメージで使用されている CMD コマンドとパラメータを確認します。 例次のコードは、ワークロード イメージの CMD が上書きされていないことを確認します。
次のコードは、CMD オーバーライドの唯一のコンテンツが
|
連携するサービス:
|
JSON オブジェクト |
環境変数とそれらの値がコンテナに明示的に渡されていることを確認します。 例次のコードは、環境変数
|
連携するサービス:
|
文字列 |
ワークロード オペレーターがコンテナ内の環境変数を上書きしたかどうかを確認します。 例次のコードは、ワークロード オペレータが
次のコードは、ワークロード オペレーターが環境変数を上書きしていないことを確認します。
|
assertion.submods.container.image_digest |
文字列 |
ワークロード コンテナのイメージ ダイジェストを検証します。この条件を指定すると、複数の関係者が、データへのアクセスを許可する承認済みワークロードについて合意できます。 例
|
assertion.submods.container.image_id |
文字列 |
ワークロード コンテナのイメージ ID を検証します。 例
|
連携するサービス:
|
文字列 |
Confidential Space イメージ上で実行されているワークロード コンテナの場所を検証します。 例
|
連携するサービス:
|
JSON オブジェクト |
イメージに特定の署名があるか、公開鍵と署名アルゴリズムで署名されていることを検証します。この条件を指定すると、複数の関係者が、データへのアクセスを許可する承認済みワークロードについて合意できます。 アサーションには次の要素を含めることができます。
例
|
連携するサービス:
|
定義された文字列 |
ワークロードが停止したときのコンテナ ランチャーの再起動ポリシーを検証します。 有効な値は次のとおりです。
例
|
VM アサーション
アサーション | タイプ | 説明 |
---|---|---|
連携するサービス:
|
文字列配列 |
指定したサービス アカウントが、ワークロードを実行している VM に接続されているか、VM メタデータで 例
|
assertion.hwmodel |
文字列 |
基盤となる Confidential Computing テクノロジーを検証します。サポートされているプラットフォームは次のとおりです。
例
|
連携するサービス:
|
ブール値 |
証明を行うエンティティのモニタリング状態を確認します。 例
|
assertion.submods.gce.instance_id |
文字列 |
VM インスタンス ID を検証します。 例
|
assertion.submods.gce.instance_name |
文字列 |
VM インスタンスの名前を確認します。 例
|
assertion.submods.gce.project_id |
文字列 |
指定したプロジェクト ID で VM が Google Cloud プロジェクトを実行していることを確認します。 例
|
assertion.submods.gce.project_number |
文字列 |
指定したプロジェクト番号で VM が Google Cloud プロジェクトで実行されていることを確認します。 例
|
連携するサービス:
|
文字列 |
VM が指定されたゾーンで実行されていることを確認します。 例
|
連携するサービス:
|
定義された文字列 |
NVIDIA の Confidential Computing ドライバのステータスを確認します。有効な値は次のとおりです。
例
|