ワークロードはワークロード作成者によって作成され、データ共同編集者が操作する機密データを処理します。
ワークロードの作成者は、次のリソースを組み合わせてワークロードを作成する必要があります。
アプリケーション。機密データを処理します。アプリケーションは任意の言語で記述できます。ただし、その言語をサポートするコンテナ イメージをビルドする必要があります。
Docker イメージを保存する Artifact Registry のリポジトリ。
コンテナ イメージに設定された起動ポリシー。ワークロードの実行方法を制御し、悪意のあるワークロード オペレーターの機能を制限します。
ワークロードをデプロイするために、ワークロード オペレーターは Confidential Space イメージに基づいて Confidential VM を実行します。これにより、コンテナ イメージが Artifact Registry から取得され、実行されます。
データ コラボレーターは、ワークロードがデータにアクセスする前に、ワークロードの構成証明を検証する必要があります。
始める前に
Confidential Space のワークロードを作成するには、コードとデバッグだけでは不十分です。また、データ コラボレーターと話し合ってニーズを評価し、環境を設定し、コードをコンテナ イメージにパッケージ化し、ワークロード オペレーターと連携してすべてが正しくデプロイされるようにする必要があります。
データ共同編集者と話す
アプリケーションの作成を開始する前に、データ コラボレーターと、作業する非公開データについて話し合う必要があります。次のような質問をすることができます。
関連する組織 ID
関連するプロジェクト番号は何ですか?
アクセスする必要がある Google Cloud リソースは何か。その ID と名前は何か。
Google CloudIAM で管理されていないリソースにアクセスする必要がありますか?
使用する証明書サービス(Google Cloud Attestation または Intel Trust Authority)
アプリケーションはどのように個人データを比較して処理すべきですか。
出力はどのような形式にする必要がありますか?
出力の保存場所と、暗号化の有無
すべてのデータ コラボレーターが同じ結果を見ているか、それとも出力はそれぞれに固有か。
また、各データ コラボレーターには、満たす必要のある独自のプライバシー要件がある場合もあります。ワークロードの結果として、非公開データが公開されないようにすることが極めて重要です。
Confidential Space ソリューションを構築する
最初の Confidential Space 環境を作成するのように、適切な権限を持つ 2 つ(またはそれ以上)のプロジェクトをテスト環境として設定すると便利です。データ コラボレーターのプロジェクト設定をできるだけ忠実に再現してください。これにより、プロジェクト間の権限を付与し、特定の Google Cloud リソースから必要なデータを取得する経験を積むことができます。また、ワークロード オペレーターとデータ コラボレーターのロールとその責任についても理解できます。
初期の構築フェーズでは、次のプラクティスを遵守することをおすすめします。
データ共同編集者として作業する場合は、開発速度を上げるために、構成証明の検証を最小限に抑えます。
ワークロード オペレーターとして作業する場合は、ワークロードをデプロイするときに、本番環境ではなく Confidential Space デバッグ イメージを使用します。これにより、ワークロードのトラブルシューティング方法が増えます。
アプリケーションが成熟し、その状態が予測可能になると、証明書の検証と起動ポリシーを使用してソリューションをロックダウンし、本番環境の Confidential Space イメージに切り替えることができます。
テスト環境でワークロードが正しく動作することを確認したら、データ コラボレーターのプロジェクトで実際のリソースを使用してテストに切り替えることができます。ただし、データ コラボレーターにすべての動作をデモンストレーションできるように、ダミーデータを使用します。この時点で、独立したワークロード オペレーターとの連携を開始できます。
すべてが正常に動作し、出力が想定どおりになったら、本番環境データでのテストを開始できます。テストが完了し、すべての関係者が結果を承認すると、ワークロードを本番環境に移行する準備が整います。
出力に注意する
コードをテストする際、STDOUT または STDERR に出力してデバッグしたくなることがあります。その場合は、他のユーザーがログにアクセスして読み取ることができる個人データが公開されないように注意してください。コードが本番環境で動作を開始する前に、厳密に必要なもの以外は出力されないことを確認してください。
最終出力についても同じことが言えます。元のデータのプライバシーと機密性を損なわない最終結果のみを提供します。
Docker を使用してコンテナ イメージをビルドする
アプリケーションは、Docker によってビルドされたコンテナ イメージにパッケージ化する必要があります。このイメージは Artifact Registry に保存されます。ワークロードがデプロイされると、Docker イメージが Confidential Space イメージによって Artifact Registry リポジトリから pull されて実行され、アプリケーションは適切なプロジェクト リソースで動作を開始できます。
Docker イメージをビルドする際は、次の点を考慮してください。
追加の Linux 機能
Confidential Space ワークロードは、containerd を使用して Linux コンテナで実行されます。このコンテナは、デフォルトの Linux 機能を使用して実行されます。
ケーパビリティを追加するには、tee-added-capabilities を使用します。
ディスクとメモリの上限
Confidential Space は、より大きなブートディスク サイズを使用する場合、ブートディスクのステートフル パーティションのサイズを自動的に変更します。パーティション サイズは、ブートディスクのサイズから約 5 GB を差し引いたサイズです。
Confidential Space の整合性ファイル システム保護の一環として、Confidential Space はディスク整合性タグをメモリに保存します。これにより、ディスクバイトごとに約 1% のメモリ オーバーヘッドが発生します。たとえば、100 GB のディスクには 1 GB のメモリが必要で、10 TB のディスクには 100 GB のメモリが必要です。
VM のメモリ上限を超えないようにしてください。スワップメモリが Confidential Space VM で無効になっています。そのため、メモリを過剰に使用するとワークロードがクラッシュする可能性があります。選択したマシンが、ディスク整合性のオーバーヘッドに加えて、ワークロードのメモリ使用量をサポートしていることを確認します。
正常なシャットダウン
オペレーターが Confidential Space VM のシャットダウンをリクエストすると、Confidential Space Launcher は SIGTERM シグナルを送信してワークロードを正常にシャットダウンしようとします。受信すると、ワークロードは最大 120 秒以内にクリーンアップを実行してから、Confidential Space Launcher がシャットダウン プロセスを開始します。SIGTERM シグナル処理を実装していないワークロードは、シグナルを受信するとすぐに終了します。
インメモリ スクラッチ マウント
Confidential Space では、インメモリ スクラッチ スペースを追加できます。これは、Confidential Space VM で使用可能なメモリを使用します。スクラッチ スペースは Confidential VM のメモリを使用するため、Confidential VM と同じ整合性と機密性のプロパティを持ちます。
tee-dev-shm-size を使用すると、ワークロードの /dev/shm 共有メモリ マウントのサイズを増やすことができます。/dev/shm のサイズは KB 単位で指定します。
tee-mount を使用すると、セミコロン区切りの構成を使用して、実行中のコンテナに tmpfs マウントを指定できます。type と source は常に tmpfs です。destination はマウントポイントであり、tee.launch_policy.allow_mount_destinations 起動ポリシーとやり取りします。必要に応じて、tmpfs のサイズをバイト単位で指定できます。デフォルトのサイズは VM メモリの 50% です。
受信ポート
デフォルトでは、Confidential Space VM は、すべての受信ポートをブロックするファイアウォール ルールで動作します。バージョンが 230600 以降の Confidential Space イメージを使用する場合は、ワークロード イメージを作成するときに Dockerfile で受信ポートを開いたままにするように指定できます。
ポートを開くには、Dockerfile に EXPOSE キーワードを追加し、開いたままにするポート番号と、オプションのプロトコル tcp または udp を追加します。ポートのプロトコルを指定しない場合、TCP と UDP の両方が許可されます。受信ポートを公開する Dockerfile の例を次に示します。
FROM alpine:latest
EXPOSE 80
EXPOSE 443/tcp
EXPOSE 81/udp
WORKDIR /test
COPY salary /test
ENTRYPOINT ["/test/salary"]
CMD []
使用するベースイメージによっては、一部のポートがすでに公開されている場合があります。Dockerfile は追加のポートのみを公開します。ベースイメージによってすでに開かれているポートをブロックすることはできません。
ワークロード オペレーターは、ワークロードを実行する前に、公開ポートが VPC ファイアウォールで開いていることを確認する必要があります。ポート番号は、ワークロードの作成者が指定することも、Docker イメージ情報から取得することもできます。
公開されたポートはコンソールにログインされ、tee-container-log-redirect メタデータ変数の使用時に Cloud Logging にリダイレクトされます。
起動ポリシー
起動ポリシーは、ワークロード オペレーターによって設定された VM メタデータ変数をオーバーライドして、悪意のあるアクションを制限します。ワークロード作成者は、コンテナ イメージのビルドの一環として、ラベルを使用してポリシーを設定できます。
たとえば、Dockerfile では:
LABEL "tee.launch_policy.allow_cmd_override"="true"
Bazel BUILD ファイルでは:
container_image(
...
labels={"tee.launch_policy.allow_cmd_override":"true"}
...
)
次の表に、利用可能な起動ポリシーを示します。
| ポリシー | 種類 | 説明 |
|---|---|---|
|
操作対象:
|
ブール値(デフォルトは false) |
ワークロード オペレーターがワークロード コンテナに Linux 機能を追加できるかどうかを決定します。 |
|
操作対象:
|
ブール値(デフォルトは false) |
ワークロード コンテナに、/sys/fs/cgroup で名前空間化された
cgroup マウントを含めることができるかどうかを決定します。 |
|
操作対象:
|
ブール値(デフォルトは false) |
ワークロード コンテナの Dockerfile で指定された
CMD が、ワークロード オペレーターによって
tee-cmd メタデータ値でオーバーライドされるかどうかを決定します。 |
|
操作対象:
|
カンマ区切りの文字列 |
ワークロード オペレーターが
tee-env-ENVIRONMENT_VARIABLE_NAME メタデータ値で設定できる、許可された環境変数名のカンマ区切り文字列。 |
|
操作対象:
|
コロン区切りの文字列 |
ワークロード オペレーターが 例: |
|
操作対象:
|
定義済みの文字列 |
ワークロード オペレーターによって
有効な値は次のとおりです。
|
|
操作対象:
|
定義済みの文字列 |
ワークロード オペレーターによって
有効な値は次のとおりです。
|
|
操作対象:
|
定義済みの文字列 |
コンテナの実行権限を制限するかどうかを決定します。 有効な値は次のとおりです。
|
複数のワークロードの実行
ワークロードを再実行するには、ワークロード オペレーターが VM インスタンスを再起動する必要があります。これにより、可能な限りクリーンな環境でワークロードが開始され、新しいエフェメラル鍵で VM インスタンスのディスクが暗号化されます。
再起動すると、ディスク上のワークロード イメージをダウンロードして測定した後に変更する攻撃ベクトルに対処できます。ただし、起動時間や各ワークロード実行へのワークロード イメージの pull などのオーバーヘッドも増加します。これらのオーバーヘッドがワークロードのパフォーマンスに大きな影響を与える場合は、リスク プロファイルの増加を犠牲にして、ワークロード再起動をワークロード自体にコーディングできます。
名前空間 cgroup
Confidential Space ワークロードは、デフォルトで cgroup マウントなしで実行されます。
ワークロード コンテナ内で cgroup を管理するには、tee-cgroup-ns を使用します。このメタデータキーは、コンテナ ファイル システムの /sys/fs/cgroup にマウントを作成するように VM インスタンスに指示します。
非 root コンテナの実行
必要に応じて、コンテナを root 以外のユーザーとして実行し、コンテナ ブレイクアウトの影響を軽減できます。root 以外のコンテナの実行が有効になっている場合、Confidential Space はワークロードの Linux ユーザー名前空間とネットワーク名前空間を構成します。コンテナの UID と GID 0~65535 は、Confidential VM の 100000 から始まる非特権 ID にマッピングされます。コンテナ内で root として実行されるプロセス、またはコンテナをエスケープするプロセスは、VM への非特権アクセスのみを持ちます。Dockerfile に USER 命令を追加する必要はありません。
非 root 実行には、Confidential Space イメージ confidential-space-261001 以降が必要です。このフィールドは、オプションまたは必須として構成できます。
ワークロード作成者: コンテナ イメージで
tee.launch_policy.nonroot_container起動ポリシー ラベルを使用します。このポリシーをnonrootonlyに設定すると、ワークロード オペレーターはコンテナを root ユーザー以外のユーザーとして実行する必要があります。ワークロード オペレーター: VM の作成時に
tee-nonroot-container=trueメタデータ変数を渡します。ワークロードの作成者がnonrootonlyを設定している場合、このメタデータ変数は必須です。設定されていない場合、VM はワークロードを起動できません。
再現可能なコンテナ イメージ
再現可能な方法でコンテナ イメージを構築すると、当事者間の信頼度が高まります。Bazel を使用して再現可能なイメージをビルドできます。
Google Cloud IAM で管理されていないリソース
Google Cloud IAM で管理されていないリソースにアクセスするには、ワークロードでカスタム オーディエンスを指定する必要があります。
詳細については、 Google Cloud IAM で管理されていないリソースにアクセスするをご覧ください。
署名付きコンテナ イメージ
公開鍵を使用してコンテナ イメージに署名できます。データ コラボレーターは、WIP ポリシーでイメージ ダイジェストを指定する代わりに、この公開鍵を証明に使用できます。
つまり、データ共同編集者は、ワークロードが更新されるたびに WIP ポリシーを更新する必要がなく、ワークロードは保護されたリソースに中断なくアクセスできます。
Sigstore Cosign を使用してコンテナ イメージに署名できます。Confidential Space が署名を取得するには、ワークロード オペレーターがワークロードをデプロイする前に、署名情報を tee-signed-image-repos メタデータ変数に追加する必要があります。
ランタイム時に、署名は検証のために証明書サービスに送信されます。証明書サービスは、検証済みの署名クレームを含む証明書クレーム トークンを返します。署名クレームの例を次に示します。
"image_signatures": [
{
"key_id": "hexadecimal-sha256-fingerprint-public-key1",
"signature": "base64-encoded-signature",
"signature_algorithm": "RSASSA_PSS_SHA256"
},
{
"key_id": "hexadecimal-sha256-fingerprint-public-key2",
"signature": "base64-encoded-signature",
"signature_algorithm": "RSASSA_PSS_SHA256",
},
{
"key_id": "hexadecimal-sha256-fingerprint-public-key3",
"signature": "base64-encoded-signature",
"signature_algorithm": "RSASSA_PSS_SHA256",
}
]
コンテナ イメージの署名を構成するには、署名付きコンテナ イメージの Codelab をご覧ください。