Codelab Trusted Space

1. Ringkasan

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

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

Berikut yang ditawarkan Ruang Tepercaya:

  • Privasi dan Keamanan yang Ditingkatkan: Trusted Space menyediakan trusted execution environment tempat aset sensitif Anda (misalnya, model, data dan kunci berharga) tetap terlindungi, yang didukung oleh bukti kriptografi.
  • Isolasi Operator: Menghilangkan kekhawatiran tentang gangguan operator. Dengan Ruang Tepercaya, 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 didesain agar dapat bekerja secara lancar dengan berbagai akselerator hardware, termasuk GPU seperti H100, A100, T4, dan L4. Hal ini memastikan aplikasi AI/ML yang penting untuk performa Anda berjalan lancar.

Yang akan Anda pelajari

  • Pahami penawaran utama Ruang Tepercaya.
  • Pelajari cara men-deploy dan mengonfigurasi lingkungan Ruang Tepercaya 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 berperan sebagai Primus, sebuah perusahaan yang memprioritaskan privasi dan keamanan data karyawannya. Primus ingin men-deploy model pembuatan kode untuk membantu developernya dalam tugas coding. 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. Basis kode mereka berisi kekayaan intelektual yang berharga, termasuk algoritma eksklusif dan cuplikan kode sensitif yang memberikan keunggulan kompetitif. Mereka khawatir tentang kemungkinan spionase perusahaan oleh operator beban kerja. Selain itu, perintah karyawan mungkin menyertakan bagian kode "Perlu Diketahui" yang bersifat rahasia yang ingin dilindungi oleh 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 mengirimkan 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 Ruang Tepercaya, 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 aplikasi klien contoh ini dengan enkripsi amplop.
  • Isolasi Operator: Hanya server inferensi, yang berjalan dalam lingkungan Ruang Tepercaya, yang akan memiliki akses ke kunci yang digunakan untuk enkripsi dan dapat mendekripsi perintah dalam lingkungan tepercaya. Akses ke 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 workload tidak disusupi oleh malware atau rootkit level booting atau kernel. Server ini mendekripsi perintah dalam lingkungan Ruang Tepercaya, 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 mengetahui informasi selengkapnya tentang cara menyiapkan project GCP, lihat codelab ini. Anda dapat melihat 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 disetel, nama resource cloud akan dibuat dari project-name dan cloud-resource 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 zonal 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 mencakup kondisi otorisasi untuk digunakan pada token yang ditandatangani oleh Layanan Verifikasi Pengesahan.

$PRIMUS_SERVICEACCOUNT

Akun layanan perusahaan Primus yang digunakan $PRIMUS_WORKLOAD_IDENTITY_POOL untuk mengakses resource yang dilindungi. Pada langkah ini, pengguna 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 pada masa lalu dan versinya diperbarui.

$PRIMUS_ARTIFACT_REPOSITORY

Repositori artefak tempat image Docker beban kerja akan dikirim.

$PRIMUS_PROJECT_REPOSITORY_REGION

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

$WORKLOAD_VM

Nama VM workload.

$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 Admin Penyimpanan, Administrator Artifact Registry, Admin Cloud KMS, Admin Akun Layanan, Admin IAM Workload Identity Pool untuk project $PRIMUS_PROJECT_ID. Anda dapat melihat 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 keyring ($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 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

Buat 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 workload 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 dibuat oleh perusahaan Primus. Beban kerja yang digunakan dalam codelab ini adalah kode Python yang menggunakan model codegemma dari bucket GCS yang tersedia secara publik (dari Vertex Model Garden). Workload akan memuat model codegemma dan meluncurkan server inferensi yang akan melayani permintaan pembuatan kode dari developer Primus.

Pada permintaan pembuatan kode, Workload akan mendapatkan DEK yang dienkapsulasi bersama dengan perintah terenkripsi. Workload kemudian akan melakukan panggilan KMS API untuk mendekripsi DEK, lalu akan mendekripsi perintah menggunakan DEK ini. Kunci enkripsi (untuk DEK) akan dilindungi melalui workload identity pool dan akses akan diberikan kepada workload yang memenuhi kondisi atribut. Kondisi atribut ini dijelaskan secara lebih mendetail di bagian berikutnya tentang 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 yang melakukan langkah-langkah berikut:

  • Buat Artifact Registry($PRIMUS_ARTIFACT_REGISTRY) yang dimiliki oleh Primus.
  • Perbarui kode workload dengan nama resource yang diperlukan.
  • Bangun beban kerja server inferensi dan buat Dockerfile untuk membangun image Docker dari kode beban kerja. Berikut adalah Dockerfile yang digunakan untuk codelab ini.
  • Bangun dan publikasikan image Docker ke Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) yang dimiliki oleh Primus.
  • Beri izin baca $WORKLOAD_SERVICEACCOUNT untuk $PRIMUS_ARTIFACT_REGISTRY. Hal ini diperlukan agar container workload dapat menarik image Docker workload 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 Beban Kerja

Memberi Otorisasi Beban Kerja

Primus ingin mengizinkan beban kerja mengakses kunci KMS-nya yang digunakan untuk enkripsi perintah berdasarkan atribut resource berikut:

  • Apa: Kode yang diverifikasi
  • Tempat: Lingkungan yang aman
  • Siapa: 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 Verifikasi Pengesahan ke WIP sebagai penyedia workload identity pool untuk menyajikan pengukuran dan menerapkan kebijakan.

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

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

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, hal 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 workload di VM Ruang Tepercaya yang akan memiliki akselerator terpasang. Argumen TEE yang diperlukan diteruskan menggunakan flag metadata. Argumen untuk container workload diteruskan menggunakan bagian "tee-cmd" dari flag. Untuk melengkapi VM beban kerja dengan GPU Nvidia Tesla T4, kita akan menggunakan tanda --accelerator=type=nvidia-tesla-t4,count=1. Tindakan ini akan memasang satu GPU ke VM. Kita juga perlu menyertakan tee-install-gpu-driver=true dalam tanda 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, karyawan perusahaan Primus kini 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 melakukan SSH ke VM klien dan menjalankan contoh aplikasi klien dalam lingkungan virtual Python. Aplikasi contoh ini menggunakan enkripsi amplop dengan library Fernet, tetapi perlu diingat bahwa library enkripsi tertentu dapat disesuaikan untuk berbagai kasus penggunaan.

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).
  • Workload VM ($WORKLOAD_VM) & Client VM ($CLIENT_VM).
./cleanup.sh

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

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