Codelab Trusted Space

1. Ringkasan

Siap meningkatkan keamanan dan privasi workload yang dipercepat GPU? Codelab ini akan memandu Anda memahami kemampuan Trusted Space, penawaran untuk memberikan isolasi operator yang kuat dan dukungan akselerator untuk workload AI/ML sensitif Anda.

Melindungi data, model, dan kunci yang berharga menjadi semakin penting. Trusted Space menawarkan solusi dengan memastikan bahwa workload Anda beroperasi dalam lingkungan yang aman dan tepercaya, bahkan operator workload pun tidak memiliki akses.

Berikut adalah hal yang ditawarkan Trusted Space:

  • Privasi dan Keamanan yang Ditingkatkan: Trusted Space menyediakan trusted execution environment tempat aset sensitif Anda (misalnya, model, data berharga, dan kunci) tetap terlindungi, yang didukung oleh bukti kriptografis.
  • Isolasi Operator: Menghilangkan kekhawatiran tentang gangguan operator. Dengan Trusted Space, bahkan operator beban kerja Anda tidak memiliki akses, sehingga mencegah mereka melakukan SSH, mengakses data, menginstal software, atau memodifikasi kode Anda.
  • Dukungan Akselerator: Trusted Space dirancang agar dapat berfungsi dengan lancar dengan berbagai akselerator hardware, termasuk GPU seperti H100, A100, T4, dan L4. Hal ini memastikan aplikasi AI/ML yang penting bagi performa berjalan lancar.

Yang akan Anda pelajari

  • Dapatkan pemahaman tentang penawaran utama Trusted Space.
  • Pelajari cara men-deploy dan mengonfigurasi lingkungan Trusted Space untuk mengamankan aset berharga dari workload AI/ML Anda.

Yang Anda butuhkan

Melindungi Perintah Pembuatan Kode Sensitif dengan Primus Company

Dalam codelab ini, kita akan menjadi Primus, sebuah perusahaan yang memprioritaskan privasi dan keamanan data karyawannya. Primus ingin men-deploy model pembuatan kode untuk membantu developer dalam tugas coding mereka. Namun, mereka khawatir tentang perlindungan kerahasiaan perintah yang dikirimkan oleh karyawan mereka, karena perintah ini sering kali berisi cuplikan kode sensitif, detail project internal, atau algoritma eksklusif.

Mengapa Perusahaan Primus tidak memercayai Operator?

Primus Corp beroperasi di pasar yang sangat kompetitif. Codebase mereka berisi kekayaan intelektual yang berharga, termasuk algoritma eksklusif dan cuplikan kode sensitif yang memberikan keunggulan kompetitif. Mereka khawatir dengan kemungkinan spionase perusahaan oleh operator beban kerja. Selain itu, perintah karyawan mungkin menyertakan bagian kode "Perlu Diketahui" yang bersifat rahasia yang ingin dilindungi Primus Corp.

Untuk mengatasi masalah ini, Primus Corp akan memanfaatkan Trusted Space untuk mengisolasi server inferensi yang menjalankan model untuk pembuatan kode. Berikut caranya:

  • Enkripsi Perintah: Sebelum mengirim perintah ke server inferensi, setiap karyawan akan mengenkripsinya menggunakan kunci KMS yang dikelola oleh Primus Corp di Google Cloud. Hal ini memastikan bahwa hanya lingkungan Trusted Space, tempat kunci dekripsi yang sesuai tersedia, yang dapat mendekripsinya dan mengakses perintah teks biasa. Dalam skenario dunia nyata, enkripsi sisi klien dapat ditangani oleh library yang tersedia (misalnya, tink). Sebagai bagian dari codelab ini, kita akan menggunakan contoh aplikasi klien ini dengan enkripsi amplop.
  • Isolasi Operator: Hanya server inferensi, yang berjalan dalam lingkungan Trusted Space, yang akan memiliki akses ke kunci yang digunakan untuk enkripsi dan akan dapat mendekripsi perintah dalam lingkungan tepercaya. Akses kunci enkripsi akan dilindungi oleh Workload Identity Pool. Karena jaminan isolasi Trusted Space, bahkan operator workload tidak dapat mengakses kunci yang digunakan untuk enkripsi dan konten yang didekripsi.
  • Inferensi Aman menggunakan Akselerator: Server inferensi akan diluncurkan di Shielded VM (sebagai bagian dari penyiapan ruang Tepercaya) yang akan memastikan bahwa instance beban kerja tidak disusupi oleh malware atau rootkit level booting atau kernel. Server ini mendekripsi perintah dalam lingkungan Trusted Space, melakukan inferensi menggunakan model pembuatan kode, dan menampilkan kode yang dihasilkan kepada karyawan.

2. Menyiapkan Resource Cloud

Sebelum memulai

  • Clone repositori ini menggunakan perintah di bawah untuk mendapatkan skrip yang diperlukan yang digunakan sebagai bagian dari codelab ini.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Ubah direktori untuk codelab ini.
cd confidential-space/codelabs/trusted_space_codelab/scripts
  • Pastikan Anda telah menetapkan variabel lingkungan project yang diperlukan seperti yang ditunjukkan di bawah. Untuk informasi selengkapnya tentang cara menyiapkan project GCP, lihat codelab ini. Anda dapat membaca artikel ini untuk mendapatkan detail tentang cara mengambil project ID dan perbedaannya dengan nama project dan nomor project.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
  • Aktifkan Penagihan untuk project Anda.
  • Aktifkan Confidential Computing API dan API berikut untuk kedua project.
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
  • Tetapkan nilai ke variabel untuk nama resource yang ditentukan di atas menggunakan perintah berikut. Variabel ini memungkinkan Anda menyesuaikan nama resource sesuai kebutuhan dan juga menggunakan resource yang ada jika sudah dibuat. (misalnya export PRIMUS_SERVICE_ACCOUNT='my-service-account')
  1. Anda dapat menetapkan variabel berikut dengan nama resource cloud yang ada di project Primus. Jika variabel ditetapkan, resource cloud yang ada dan sesuai dari project Primus akan digunakan. Jika variabel tidak ditetapkan, nama resource cloud akan dibuat dari project-name dan resource cloud baru akan dibuat dengan nama tersebut. Berikut adalah variabel yang didukung untuk nama resource:

$PRIMUS_PROJECT_REGION

Region tempat resource regional akan dibuat untuk perusahaan Primus.

$PRIMUS_SERVICE_LOCATION

Lokasi tempat resource akan dibuat untuk perusahaan Primus.

$PRIMUS_PROJECT_ZONE

Zona tempat resource zona akan dibuat untuk perusahaan Primus.

$PRIMUS_WORKLOAD_IDENTITY_POOL

Workload Identity Pool perusahaan Primus untuk melindungi resource cloud.

$PRIMUS_WIP_PROVIDER

Penyedia Workload Identity Pool perusahaan Primus yang menyertakan kondisi otorisasi yang akan digunakan untuk token yang ditandatangani oleh Layanan Pengverifikasi Pengesahan.

$PRIMUS_SERVICEACCOUNT

Akun layanan perusahaan Primus yang digunakan $PRIMUS_WORKLOAD_IDENTITY_POOL untuk mengakses resource yang dilindungi. Pada langkah ini, bucket tersebut memiliki izin untuk melihat data pelanggan yang disimpan di bucket $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ENC_KEY

Kunci KMS digunakan untuk mengenkripsi perintah yang diberikan oleh karyawan perusahaan Primus.

$PRIMUS_ENC_KEYRING

Keyring KMS yang akan digunakan untuk membuat kunci enkripsi $PRIMUS_ENC_KEY untuk perusahaan Primus.

$PRIMUS_ENC_KEYVERSION

Versi kunci KMS dari kunci enkripsi $PRIMUS_ENC_KEY. Nilai default adalah 1. Perbarui ini jika Anda menggunakan kunci yang sudah ada yang dirotasi sebelumnya dan versinya diperbarui.

$PRIMUS_ARTIFACT_REPOSITORY

Repositori artefak tempat image docker beban kerja akan di-push.

$PRIMUS_PROJECT_REPOSITORY_REGION

Region untuk repositori artefak yang akan memiliki image docker beban kerja yang dipublikasikan.

$WORKLOAD_VM

Nama VM beban kerja.

$WORKLOAD_IMAGE_NAME

Nama image docker beban kerja.

$WORKLOAD_IMAGE_TAG

Tag image container workload.

$WORKLOAD_SERVICEACCOUNT

Akun layanan yang memiliki izin untuk mengakses Confidential VM yang menjalankan workload.

$CLIENT_VM

Nama VM klien yang akan menjalankan aplikasi klien server inferensi.

$CLIENT_SERVICEACCOUNT

Akun layanan yang digunakan oleh $CLIENT_VM

  • Anda memerlukan peran Storage Admin, Artifact Registry Administrator, Cloud KMS Admin, Service Account Admin, IAM Workload Identity Pool Admin untuk project $PRIMUS_PROJECT_ID. Anda dapat membaca panduan ini tentang cara memberikan peran IAM menggunakan konsol GCP.
  • Untuk $PRIMUS_PROJECT_ID, Jalankan skrip berikut untuk menetapkan nama variabel yang tersisa ke nilai berdasarkan project ID Anda untuk nama resource.
source config_env.sh

Menyiapkan resource Perusahaan Primus

Sebagai bagian dari langkah ini, Anda akan menyiapkan resource cloud yang diperlukan untuk Primus. Jalankan skrip berikut untuk menyiapkan resource untuk Primus. Resource berikut akan dibuat sebagai bagian dari eksekusi skrip:

  • Kunci enkripsi ($PRIMUS_ENC_KEY) dan ring kunci ($PRIMUS_ENC_KEYRING) di KMS untuk mengenkripsi file data pelanggan perusahaan Primus.
  • Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL) untuk memvalidasi klaim berdasarkan kondisi atribut yang dikonfigurasi di bawah penyedianya.
  • Akun layanan ($PRIMUS_SERVICE_ACCOUNT) yang dilampirkan ke kumpulan identitas beban kerja yang disebutkan di atas ($PRIMUS_WORKLOAD_IDENTITY_POOL) memiliki akses untuk mendekripsi data menggunakan kunci KMS (menggunakan peran roles/cloudkms.cryptoKeyDecrypter), mengenkripsi data menggunakan kunci KMS (menggunakan peran roles/cloudkms.cryptoKeyEncrypter), membaca data dari bucket penyimpanan cloud (menggunakan peran objectViewer), dan menghubungkan akun layanan ke kumpulan identitas beban kerja (menggunakan roles/iam.workloadIdentityUser).
./setup_primus_resources.sh

3. Membuat Beban Kerja

Membuat akun layanan workload

Sekarang, Anda akan membuat akun layanan untuk beban kerja dengan peran dan izin yang diperlukan. Jalankan skrip berikut untuk membuat akun layanan beban kerja di project Primus. Akun layanan ini akan digunakan oleh VM yang menjalankan server inferensi.

Akun layanan beban kerja ini ($WORKLOAD_SERVICEACCOUNT) akan memiliki peran berikut:

  • confidentialcomputing.workloadUser untuk mendapatkan token pengesahan
  • logging.logWriter untuk menulis log ke Cloud Logging.
./create_workload_service_account.sh

Membuat beban kerja

Sebagai bagian dari langkah ini, Anda akan membuat image docker workload. Beban kerja akan ditulis oleh perusahaan Primus. Beban kerja yang digunakan dalam codelab ini adalah kode Python yang menggunakan model codegemma dari bucket GCS yang tersedia untuk umum (dari model garden vertex). Beban kerja akan memuat model codegemma dan meluncurkan server inferensi yang akan menayangkan permintaan pembuatan kode dari developer Primus.

Pada permintaan pembuatan kode, Workload akan mendapatkan DEK yang digabungkan beserta perintah terenkripsi. Kemudian, beban kerja akan membuat panggilan KMS API untuk mendekripsi DEK, lalu mendekripsi perintah menggunakan DEK ini. Kunci enkripsi (untuk DEK) akan dilindungi melalui workload identity pool dan akses akan diberikan ke workload yang memenuhi kondisi atribut. Kondisi atribut ini dijelaskan secara lebih mendetail di bagian berikutnya tentang cara memberikan otorisasi pada beban kerja. Setelah server inferensi memiliki perintah yang didekripsi, server akan membuat kode menggunakan model yang dimuat dan akan menampilkan respons kembali.

Jalankan skrip berikut untuk membuat workload tempat langkah-langkah berikut dilakukan:

  • Buat Artifact Registry($PRIMUS_ARTIFACT_REGISTRY) yang dimiliki oleh Primus.
  • Perbarui kode beban kerja dengan nama resource yang diperlukan.
  • Build beban kerja server inferensi dan buat Dockerfile untuk mem-build image Docker dari kode beban kerja. Di sini adalah Dockerfile yang digunakan untuk codelab ini.
  • Build dan publikasikan image Docker ke Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) yang dimiliki oleh Primus.
  • Berikan izin baca $WORKLOAD_SERVICEACCOUNT untuk $PRIMUS_ARTIFACT_REGISTRY. Hal ini diperlukan agar penampung beban kerja dapat mengambil image docker beban kerja dari Artifact Registry.
./create_workload.sh

Sebagai referensi, berikut adalah metode generate() dari beban kerja yang dibuat dan digunakan dalam codelab ini (Anda dapat menemukan seluruh kode beban kerja di sini).

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. Memberi Otorisasi dan Menjalankan Workload

Memberi Otorisasi pada Beban Kerja

Primus ingin memberikan otorisasi kepada beban kerja untuk mengakses kunci KMS yang digunakan untuk enkripsi prompt berdasarkan atribut resource berikut:

  • Apa: Kode yang diverifikasi
  • Di mana: Lingkungan yang aman
  • Who: Operator yang tepercaya

Primus menggunakan Workload identity federation untuk menerapkan kebijakan akses berdasarkan persyaratan ini. Workload identity federation memungkinkan Anda menentukan kondisi atribut. Kondisi ini membatasi identitas yang dapat melakukan autentikasi dengan workload identity pool (WIP). Anda dapat menambahkan Layanan Pengverifikasi Pengesahan ke WIP sebagai penyedia workload identity pool untuk menampilkan pengukuran dan menerapkan kebijakan.

Workload identity pool telah dibuat sebelumnya sebagai bagian dari langkah penyiapan resource cloud. Sekarang Primus akan membuat penyedia workload identity pool OIDC baru. --attribute-condition yang ditentukan memberikan otorisasi akses ke penampung beban kerja. Hal ini memerlukan:

  • Apa: $WORKLOAD_IMAGE_NAME terbaru yang diupload ke repositori $PRIMUS_ARTIFACT_REPOSITORY.
  • Di mana: Trusted execution environment Confidential Space berjalan di image VM Confidential Space yang sepenuhnya didukung.
  • Siapa: Akun layanan $WORKLOAD_SERVICE_ACCOUNT Primus.
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"

Perintah di atas memverifikasi bahwa beban kerja berjalan di lingkungan ruang tepercaya dengan memeriksa apakah hwmodel disetel ke "GCP_SHIELDED_VM" dan swname disetel ke "HARDENED_SHIELDED". Selain itu, skema ini mencakup pernyataan khusus workload, seperti image_digest dan image_reference, untuk meningkatkan keamanan dan memastikan integritas workload yang sedang berjalan.

Menjalankan Beban Kerja

Sebagai bagian dari langkah ini, kita akan menjalankan beban kerja di VM Trusted Space yang akan memiliki akselerator yang terpasang. Argumen TEE yang diperlukan diteruskan menggunakan flag metadata. Argumen untuk penampung beban kerja diteruskan menggunakan bagian "tee-cmd" dari flag. Untuk melengkapi VM beban kerja dengan GPU Nvidia Tesla T4, kita akan menggunakan flag --accelerator=type=nvidia-tesla-t4,count=1. Tindakan ini akan memasang satu GPU ke VM. Kita juga harus menyertakan tee-install-gpu-driver=true dalam flag metadata untuk memicu penginstalan driver GPU yang sesuai.

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"

Menjalankan Kueri Inferensi

Setelah server inferensi beban kerja berhasil diluncurkan, kini karyawan perusahaan Primus dapat mengirim permintaan pembuatan kode ke server inferensi.

Sebagai bagian dari codelab ini, kita akan menggunakan skrip berikut untuk menyiapkan aplikasi klien yang akan berinteraksi dengan server inferensi. Jalankan skrip ini untuk menyiapkan VM klien.

./setup_client.sh

Langkah-langkah berikut menunjukkan cara menggunakan SSH ke VM klien dan menjalankan contoh aplikasi klien dalam lingkungan virtual Python. Contoh aplikasi ini menggunakan enkripsi amplop dengan library Fernet, tetapi perlu diingat bahwa library enkripsi tertentu dapat disesuaikan agar sesuai dengan kasus penggunaan yang berbeda.

gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}

Jalankan perintah berikut untuk mengaktifkan lingkungan virtual Python di VM klien dan menjalankan aplikasi klien.

source venv/bin/activate
python3 inference_client.py

Output aplikasi klien contoh ini akan menampilkan permintaan perintah terenkripsi dan teks biasa serta respons terenkripsi dan didekripsi yang sesuai.

5. Pembersihan

Berikut adalah skrip yang dapat digunakan untuk membersihkan resource yang telah kita buat sebagai bagian dari codelab ini. Sebagai bagian dari pembersihan ini, resource berikut akan dihapus:

  • Akun layanan Primus ($PRIMUS_SERVICEACCOUNT).
  • Kunci enkripsi Primus ($PRIMUS_ENC_KEY).
  • Repositori artefak Primus ($PRIMUS_ARTIFACT_REPOSITORY).
  • Workload identity pool Primus ($PRIMUS_WORKLOAD_IDENTITY_POOL) dengan penyedianya.
  • Akun layanan workload Primus ($WORKLOAD_SERVICEACCOUNT).
  • VM Beban Kerja ($WORKLOAD_VM) & VM Klien ($CLIENT_VM).
./cleanup.sh

Jika Anda sudah selesai menjelajahi, pertimbangkan untuk menghapus project Anda.

  • Buka Cloud Platform Console
  • Pilih project yang ingin dinonaktifkan, lalu klik 'Hapus' di bagian atas: tindakan ini akan menjadwalkan penghapusan project