1. 概要
GPU アクセラレータ ワークロードのセキュリティとプライバシーを強化する準備はできましたか?この Codelab では、機密性の高い AI/ML ワークロードに強力なオペレーター分離とアクセラレータ サポートを提供する Trusted Space の機能について説明します。
価値の高いデータ、モデル、鍵を保護することが、これまで以上に重要になっています。Trusted Space は、ワークロード オペレーターでさえアクセスできない安全で信頼できる環境内でワークロードが動作するようにすることで、ソリューションを提供します。
Trusted Space の機能は次のとおりです。
- プライバシーとセキュリティの強化: Trusted Space は、暗号証明によって機密性の高いアセット(モデル、貴重なデータ、鍵など)が保護された状態を維持する高信頼実行環境を提供します。
- オペレーターの分離: オペレーターの干渉に関する懸念を解消します。Trusted Space では、ワークロード オペレーターでさえアクセスできないため、SSH 接続、データへのアクセス、ソフトウェアのインストール、コードの改ざんを防ぐことができます。
- アクセラレータのサポート: Trusted Space は、H100、A100、T4、L4 などの GPU を含む幅広いハードウェア アクセラレータとシームレスに連携するように設計されています。これにより、パフォーマンスが重要な AI/ML アプリケーションがスムーズに実行されます。
学習内容
- Trusted Space の主なサービスについて理解します。
- AI/ML ワークロードの貴重なアセットを保護するために、Trusted Space 環境をデプロイして構成する方法を説明します。
必要なもの
- Google Cloud Platform プロジェクト
- Google Compute Engine とアクセラレータに関する基本的な知識。
- サービス アカウント、キー管理、Workload Identity 連携、属性条件に関する基本的な知識。
- コンテナと Artifact Registry に関する基礎知識
Primus Company による機密性の高いコード生成プロンプトの保護
この Codelab では、従業員のデータのプライバシーとセキュリティを重視する企業である Primus の立場になって作業します。Primus は、開発者のコーディング タスクを支援するためにコード生成モデルをデプロイしたいと考えています。ただし、従業員が送信するプロンプトには機密性の高いコード スニペット、内部プロジェクトの詳細、独自のアルゴリズムが含まれていることが多いため、プロンプトの機密性を保護することを懸念しています。
Primus 社が Operator を信頼していないのはなぜですか?
Primus Corp は競争の激しい市場で事業を展開しています。コードベースには、独自のアルゴリズムや競争優位性をもたらす機密性の高いコード スニペットなど、貴重な知的財産が含まれています。ワークロード オペレーターによる企業スパイの可能性を懸念しています。また、従業員のプロンプトには、Primus Corp が保護したいコードの機密性の高い「Need To Know」部分が含まれている可能性があります。
この懸念に対処するため、Primus Corp は Trusted Space を活用して、コード生成用のモデルを実行する推論サーバーを分離します。仕組みは次のとおりです。
- プロンプトの暗号化: 推論サーバーにプロンプトを送信する前に、各従業員は Google Cloud の Primus Corp が管理する KMS 鍵を使用してプロンプトを暗号化します。これにより、対応する復号鍵が利用可能な Trusted Space 環境でのみ、復号してプレーンテキスト プロンプトにアクセスできるようになります。実際のシナリオでは、クライアントサイドの暗号化は、利用可能なライブラリ(tink など)で処理できます。この Codelab では、エンベロープ暗号化を使用したこのサンプル クライアント アプリケーションを使用します。
- オペレーターの分離: Trusted Space 環境内で実行されている推論サーバーのみが、暗号化に使用される鍵にアクセスでき、信頼できる環境でプロンプトを復号できます。暗号鍵へのアクセスは Workload Identity プールによって保護されます。Trusted Space の分離保証により、ワークロード オペレーターでさえ、暗号化に使用される鍵と復号されたコンテンツにアクセスできません。
- アクセラレータを使用した安全な推論: 推論サーバーは Shielded VM で起動されます(信頼できるスペースの設定の一部)。これにより、ワークロード インスタンスがブートレベルまたはカーネルレベルのマルウェアやルートキットによって侵害されていないことが保証されます。このサーバーは、Trusted Space 環境内でプロンプトを復号し、コード生成モデルを使用して推論を実行し、生成されたコードを従業員に返します。
2. Cloud リソースを設定する
始める前に
- 次のコマンドを使用して このリポジトリのクローンを作成し、この Codelab の一部として使用される必要なスクリプトを取得します。
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- この Codelab のディレクトリを変更します。
cd confidential-space/codelabs/trusted_space_codelab/scripts
- 次の図に示すように、必要なプロジェクト環境変数が設定されていることを確認します。GCP プロジェクトの設定の詳細については、 こちらの Codelab をご覧ください。プロジェクト ID の取得方法と、プロジェクト名やプロジェクト番号との違いについては、こちらをご覧ください。
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
- プロジェクトに対する課金を有効にします。
- 両方のプロジェクトで Confidential Computing API と次の API を有効にします。
gcloud services enable \
cloudapis.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudkms.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- 次のコマンドを使用して、上記で指定したリソース名の変数に値を割り当てます。これらの変数を使用すると、必要に応じてリソース名をカスタマイズできます。また、既存のリソースが作成されている場合は、そのリソースを使用することもできます。(例:
export PRIMUS_SERVICE_ACCOUNT='my-service-account')
- Primus プロジェクトの既存のクラウド リソース名を使用して、次の変数を設定できます。変数が設定されている場合は、Primus プロジェクトの対応する既存のクラウド リソースが使用されます。変数が設定されていない場合、クラウド リソース名はプロジェクト名から生成され、その名前で新しいクラウド リソースが作成されます。リソース名でサポートされている変数は次のとおりです。
| Primus 社のリージョン リソースが作成されるリージョン。 |
| Primus 社のリソースが作成されるロケーション。 |
| Primus 社のゾーンリソースが作成されるゾーン。 |
| クラウド リソースを保護するための Primus 社の Workload Identity プール。 |
| Attestation Verifier Service によって署名されたトークンに使用する認可条件を含む、Primus 社の Workload Identity プール プロバイダ。 |
|
|
| KMS 鍵は、Primus 社の従業員が提供するプロンプトの暗号化に使用されます。 |
| Primus 社の暗号鍵 |
| 暗号鍵 |
| ワークロード Docker イメージが push されるアーティファクト リポジトリ。 |
| 公開されたワークロード Docker イメージを含むアーティファクト リポジトリのリージョン。 |
| ワークロード VM の名前。 |
| ワークロード Docker イメージの名前。 |
| ワークロード コンテナ イメージのタグ。 |
| ワークロードを実行する Confidential VM にアクセスする権限を持つサービス アカウント。 |
| 推論サーバーのクライアント アプリケーションを実行するクライアント VM の名前。 |
|
|
- プロジェクト
$PRIMUS_PROJECT_IDには、Storage 管理者、Artifact Registry 管理者、Cloud KMS 管理者、サービス アカウント管理者、IAM Workload Identity プール管理者のロールが必要です。GCP Console を使用して IAM ロールを付与する方法については、こちらのガイドをご覧ください。 $PRIMUS_PROJECT_IDの場合、次のスクリプトを実行して、残りの変数名をリソース名のプロジェクト ID に基づく値に設定します。
source config_env.sh
Primus Company のリソースを設定する
このステップでは、Primus に必要なクラウド リソースを設定します。次のスクリプトを実行して、Primus のリソースを設定します。スクリプトの実行の一環として、次のリソースが作成されます。
- Primus 社の顧客データファイルを暗号化する KMS の暗号鍵(
$PRIMUS_ENC_KEY)と鍵リング($PRIMUS_ENC_KEYRING)。 - Workload Identity プール(
$PRIMUS_WORKLOAD_IDENTITY_POOL): プロバイダで構成された属性条件に基づいてクレームを検証します。 - 上記のワークロード ID プール(
$PRIMUS_WORKLOAD_IDENTITY_POOL)にアタッチされたサービス アカウント($PRIMUS_SERVICE_ACCOUNT)は、KMS 鍵を使用したデータの復号(roles/cloudkms.cryptoKeyDecrypterロールを使用)、KMS 鍵を使用したデータの暗号化(roles/cloudkms.cryptoKeyEncrypterロールを使用)、Cloud Storage バケットからのデータの読み取り(objectViewerロールを使用)、サービス アカウントとワークロード ID プールの接続(roles/iam.workloadIdentityUserを使用)を行うことができます。
./setup_primus_resources.sh
3. ワークロードを作成する
ワークロード サービス アカウントを作成する
次に、必要なロールと権限を持つワークロードのサービス アカウントを作成します。次のスクリプトを実行して、Primus プロジェクトにワークロード サービス アカウントを作成します。このサービス アカウントは、推論サーバーを実行する VM で使用されます。
このワークロード サービス アカウント($WORKLOAD_SERVICEACCOUNT)には次のロールが付与されます。
confidentialcomputing.workloadUserは証明書トークンを取得する- Cloud Logging にログを書き込むための
logging.logWriter。
./create_workload_service_account.sh
ワークロードを作成する
このステップでは、ワークロードの Docker イメージを作成します。ワークロードは Primus 社によって作成されます。この Codelab で使用するワークロードは、一般公開されている GCS バケット(Vertex Model Garden の)の codegemma モデルを使用する Python コードです。ワークロードは codegemma モデルを読み込み、Primus のデベロッパーからのコード生成リクエストを処理する推論サーバーを起動します。
コード生成リクエストで、Workload は暗号化されたプロンプトとともにラップされた DEK を取得します。ワークロードは、DEK を復号するために KMS API 呼び出しを行い、この DEK を使用してプロンプトを復号します。暗号鍵(DEK 用)は Workload Identity プールで保護され、属性条件を満たすワークロードにアクセス権が付与されます。これらの属性条件については、ワークロードの認可に関する次のセクションで詳しく説明します。推論サーバーは、復号されたプロンプトを取得すると、読み込まれたモデルを使用してコードを生成し、レスポンスを返します。
次の スクリプトを実行して、次の手順が実行されるワークロードを作成します。
- Primus が所有する Artifact Registry(
$PRIMUS_ARTIFACT_REGISTRY)を作成します。 - 必要なリソース名でワークロード コードを更新します。
- 推論サーバー ワークロードをビルドし、ワークロード コードの Docker イメージをビルドするための Dockerfile を作成します。この Codelab で使用する Dockerfile はこちらです。
- Docker イメージをビルドして、Primus が所有する Artifact Registry(
$PRIMUS_ARTIFACT_REGISTRY)に公開します。 $PRIMUS_ARTIFACT_REGISTRYに対する$WORKLOAD_SERVICEACCOUNTの読み取り権限を付与します。これは、ワークロード コンテナが Artifact Registry からワークロード Docker イメージを pull するために必要です。
./create_workload.sh
参考までに、この Codelab で作成および使用されるワークロードの generate() メソッドを次に示します(ワークロードのコード全体はこちらで確認できます)。
def generate():
try:
data = request.get_json()
ciphertext = base64.b64decode(data["ciphertext"])
wrapped_dek = base64.b64decode(data["wrapped_dek"])
unwrapped_dek_response = kms_client.decrypt(
request={"name": key_name, "ciphertext": wrapped_dek}
)
unwrapped_dek = unwrapped_dek_response.plaintext
f = Fernet(unwrapped_dek)
plaintext = f.decrypt(ciphertext)
prompt = plaintext.decode("utf-8")
tokens = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**tokens, max_new_tokens=128)
generated_code = tokenizer.decode(outputs[0])
generated_code_bytes = generated_code.encode("utf-8")
response = f.encrypt(generated_code_bytes)
ciphertext_base64 = base64.b64encode(response).decode("utf-8")
response = {"generated_code_ciphertext": ciphertext_base64}
return jsonify(response)
except (ValueError, TypeError, KeyError) as e:
return jsonify({"error": str(e)}), 500
4. ワークロードの承認と実行
ワークロードを承認する
Primus は、次のリソースの属性に基づいて、プロンプトの暗号化に使用される KMS 鍵にアクセスするワークロードを承認したいと考えています。
- 内容: 検証済みのコード
- 場所: 安全な環境
- 対象: 信頼できるオペレーター
Primus は、これらの要件に基づいてアクセス ポリシーを適用するために、Workload Identity 連携を使用します。Workload Identity 連携では、属性条件を指定できます。これらの条件により、Workload Identity プール(WIP)で認証できる ID が制限されます。証明書検証サービスを Workload Identity プール プロバイダとして WIP に追加して、測定値を提示し、ポリシーを適用できます。
Workload Identity プールは、クラウド リソースの設定手順の一環としてすでに作成されています。これで、Primus は新しい OIDC Workload Identity プール プロバイダを作成します。指定された --attribute-condition は、ワークロード コンテナへのアクセスを承認します。この構成では、次のものが必要になります。
- 内容: 最新の
$WORKLOAD_IMAGE_NAMEが$PRIMUS_ARTIFACT_REPOSITORYリポジトリにアップロードされました。 - 条件: Confidential Space の信頼できる実行環境が、完全にサポートされている Confidential Space VM イメージで実行されている。
- 対象: Primus
$WORKLOAD_SERVICE_ACCOUNTサービス アカウント。
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 iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
--location="global" \
--project="$PRIMUS_PROJECT_ID" \
--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 == 'HARDENED_SHIELDED' && assertion.hwmodel == 'GCP_SHIELDED_VM' &&
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_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
上記のコマンドは、hwmodel が「GCP_SHIELDED_VM」に設定され、swname が「HARDENED_SHIELDED」に設定されていることを確認することで、ワークロードが信頼できるスペース環境で実行されていることを検証します。さらに、image_digest や image_reference などのワークロード固有のアサーションが含まれており、セキュリティを強化し、実行中のワークロードの完全性を確保します。
ワークロードを実行
このステップの一環として、アクセラレータが接続された Trusted Space VM でワークロードを実行します。必要な TEE 引数は、メタデータ フラグを使用して渡されます。ワークロード コンテナの引数は、フラグの「tee-cmd」部分を使用して渡されます。ワークロード VM に NVIDIA Tesla T4 GPU を搭載するには、--accelerator=type=nvidia-tesla-t4,count=1 フラグを使用します。これにより、1 つの GPU が VM にアタッチされます。また、適切な GPU ドライバのインストールをトリガーするために、メタデータ フラグに tee-install-gpu-driver=true を含める必要もあります。
gcloud compute instances create ${WORKLOAD_VM} \
--accelerator=type=nvidia-tesla-t4,count=1 \
--machine-type=n1-standard-16 \
--shielded-secure-boot \
--image-project=conf-space-images-preview \
--image=confidential-space-0-gpupreview-796705b \
--zone=${PRIMUS_PROJECT_ZONE} \
--maintenance-policy=TERMINATE \
--boot-disk-size=40 \
--scopes=cloud-platform \
--service-account=${WORKLOAD_SERVICEACCOUNT}@${PRIMUS_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-install-gpu-driver=true~tee-restart-policy=Never"
推論クエリを実行する
ワークロード推論サーバーが正常に起動されたので、Primus 社の従業員は推論サーバーにコード生成リクエストを送信できるようになりました。
この Codelab では、次のスクリプトを使用して、推論サーバーとやり取りするクライアント アプリケーションを設定します。このスクリプトを実行して、クライアント VM を設定します。
./setup_client.sh
次の手順では、クライアント VM に SSH 接続し、Python 仮想環境内でサンプル クライアント アプリケーションを実行する方法を示します。このサンプル アプリケーションでは Fernet ライブラリでエンベロープ暗号化を使用していますが、特定の暗号化ライブラリはさまざまなユースケースに合わせて調整できます。
gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}
次のコマンドを実行して、クライアント VM で Python 仮想環境を有効にし、クライアント アプリケーションを実行します。
source venv/bin/activate
python3 inference_client.py
このサンプル クライアント アプリケーションの出力には、暗号化とプレーンテキストのプロンプト リクエストと、それに対応する暗号化されたレスポンスと復号されたレスポンスが表示されます。
5. クリーンアップ
この Codelab の一部として作成したリソースをクリーンアップするために使用できるスクリプトは、こちらです。このクリーンアップの一環として、次のリソースが削除されます。
- Primus サービス アカウント(
$PRIMUS_SERVICEACCOUNT)。 - Primus 暗号鍵(
$PRIMUS_ENC_KEY)。 - Primus のアーティファクト リポジトリ(
$PRIMUS_ARTIFACT_REPOSITORY)。 - プロバイダを含む Primus Workload Identity プール(
$PRIMUS_WORKLOAD_IDENTITY_POOL)。 - Primus のワークロード サービス アカウント(
$WORKLOAD_SERVICEACCOUNT)。 - ワークロード VM(
$WORKLOAD_VM)とクライアント VM($CLIENT_VM)。
./cleanup.sh
確認が終わったら、プロジェクトの削除をご検討ください。
- Cloud Platform Console に移動します。
- シャットダウンするプロジェクトを選択し、上部の [削除] をクリックします。これにより、プロジェクトの削除がスケジュールされます。