Membuat dan memberikan akses ke resource rahasia


Kolaborator data perlu menyiapkan resource berikut agar data rahasia mereka dapat diakses oleh workload:

Selain itu, kolaborator data perlu memilih tempat penyimpanan hasil workload Confidential Space, dan apakah data yang ditampilkan bersifat unik atau dibagikan. Misalnya, Anda dapat menghasilkan hasil yang sama ke beberapa bucket Cloud Storage milik setiap kolaborator data.

Menyimpan data Anda

Anda dapat menggunakan layanan Google Cloud yang menyimpan data untuk menghosting data rahasia Anda. Misalnya, Anda dapat menggunakan salah satu layanan berikut:

Anda harus memastikan data ini dienkripsi dalam penyimpanan, baik menggunakan fitur bawaan atau dengan sesuatu seperti Cloud Key Management Service (Cloud KMS).

Membuat akun layanan untuk mendekripsi data rahasia

Anda menyediakan data rahasia ke workload Ruang Rahasia—dan mengurangi eksposur manusia terhadap data tersebut—melalui akun layanan.

Misalnya, Anda dapat mengenkripsi file rahasia di Cloud Storage dengan Cloud KMS, lalu membuat akun layanan yang memiliki izin untuk mengakses data tersebut dan kunci untuk mendekripsinya.

Kemudian, Anda menghubungkan akun layanan tersebut ke WIP. Workload Confidential Space yang diotorisasi dan berbasis di project lain kemudian dapat menggunakan WIP tersebut untuk meniru akun layanan yang mendekripsi data, mengambil data yang didekripsi, dan memprosesnya.

Karena akun layanan digunakan untuk mendekripsi data rahasia dan memprosesnya, visibilitas data rahasia dibatasi untuk pemiliknya. Karena workload beroperasi di Confidential VM, enkripsi memori berbasis hardware-nya memastikan data Anda tetap bersifat pribadi saat digunakan. SSH juga dinonaktifkan di VM workload yang menggunakan image Confidential Space produksi, yang berarti tidak ada yang dapat mengakses VM saat sedang berjalan.

Lihat Membuat lingkungan Confidential Space pertama Anda untuk mengetahui contohnya.

Membuat WIP dan penyedia untuk validasi pengesahan

Untuk membantu melindungi data dari operator workload yang tidak tepercaya, Confidential Space menerapkan proses pengesahan yang mendeteksi modifikasi pada image workload atau TEE-nya. Proses ini didasarkan pada pengukuran booting terukur dan runtime yang diperpanjang Shielded VM, dan menangkap pengukuran urutan booting dalam register khusus perpanjangan dan dilindungi di perangkat Virtual Trusted Platform Module (vTPM).

Layanan pengesahan Confidential Space menghasilkan token OpenID Connect (OIDC) yang menyertakan pengesahan vTPM ini dalam bentuk yang dapat divalidasi oleh WIP, yang memeriksanya terhadap kebijakan yang ditambahkan sebagai kondisi atribut ke penyedia. Token ini ditandatangani oleh Google, berlaku selama satu jam, dan diperbarui secara otomatis.

Jika WIP memberikan otorisasi pada workload, workload tersebut dapat meniru akun layanan dalam project untuk mendekripsi dan mengambil data rahasia.

Untuk menyiapkan WIP dan penyedia, selesaikan petunjuk berikut:

  1. Buat WIP.

  2. Hubungkan akun layanan dekripsi Anda ke WIP dengan peran iam.workloadIdentityUser.

  3. Buat penyedia OIDC dengan detail berikut:

    • URI penerbit https://confidentialcomputing.googleapis.com/.

    • Audiens https://sts.googleapis.com yang diizinkan.

    • Pemetaan atribut penyedia google.subject, dengan nilai assertion.sub.

    • Kondisi atribut yang digunakan untuk memvalidasi pengesahan workload. Lihat Membuat kebijakan pengesahan untuk opsi yang tersedia.

Membuat kebijakan pengesahan

Sebagai bagian dari pembuatan WIP, Anda menambahkan kondisi atribut—kondisi yang harus dipenuhi beban kerja agar dapat mengakses data Anda. Untuk Ruang Rahasia, kondisi atribut ini membentuk kebijakan pengesahan Anda.

Kebijakan ditulis dalam Common Expression Language (CEL), dan terdiri dari serangkaian pernyataan yang dapat dirantai bersama dengan operator &&.

Berikut adalah contoh penambahan penyedia ke workload identity pool menggunakan gcloud CLI, beserta opsi attribute-condition yang menentukan kebijakan:

gcloud iam workload-identity-pools providers create-oidc attestation-verifier \
    --location=global \
    --workload-identity-pool=user-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 =='sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b' \
&& 'service-account@my-project.iam.gserviceaccount.com' in assertion.google_service_accounts \
&& assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes"

Dalam contoh ini, identitas eksternal yang mencoba meniru akun layanan yang terhubung ke workload identity pool harus membuktikan dan mencocokkan detail berikut:

  • Ringkasan image container beban kerja

  • Alamat akun layanan yang terhubung ke VM workload

  • CONFIDENTIAL_SPACE tersebut adalah software yang berjalan di VM, dengan semua jaminan keamanan bawaan.

  • Atribut dukungan image Confidential Space produksi

Pernyataan pengesahan

Pernyataan yang tersedia untuk membuat kebijakan pengesahan dijelaskan dalam tabel berikut. Mereka dapat memvalidasi pernyataan yang dibuat oleh image Confidential Space, container workload, dan VM.

Pernyataan gambar

Pernyataan Jenis Deskripsi

assertion.dbgstat

Berinteraksi dengan:

String yang ditentukan

Memverifikasi bahwa image Confidential Space adalah versi debug atau produksi.

Nilai yang valid adalah:

  • enable: Pastikan image debug sedang digunakan.
  • disabled-since-boot: Pastikan image produksi sedang digunakan.
Contoh

Kode berikut memverifikasi bahwa versi debug gambar Confidential Space sedang digunakan:

assertion.dbgstat == "enable"

Kode berikut memverifikasi bahwa versi produksi gambar Confidential Space sedang digunakan:

assertion.dbgstat == "disabled-since-boot"
assertion.submods.confidential_space.support_attributes Array string

Memverifikasi versi keamanan TEE adalah image Confidential Space produksi. Gambar Confidential Space debug tidak memiliki atribut dukungan yang ditetapkan.

Ada tiga atribut dukungan:

  • LATEST: Ini adalah versi terbaru image, dan didukung. Gambar LATEST juga STABLE dan USABLE.
  • STABLE: Versi image ini didukung dan dipantau untuk menemukan kerentanan. Gambar STABLE juga merupakan USABLE.
  • USABLE: Image yang hanya memiliki atribut ini tidak lagi didukung dan tidak lagi dipantau untuk menemukan kerentanan. Gunakan dengan menanggung sendiri risikonya.
Contoh

Kode berikut memverifikasi bahwa versi stabil image Confidential Space sedang digunakan:

"STABLE" in assertion.submods.confidential_space.support_attributes
assertion.swname String yang ditentukan

Memverifikasi software yang berjalan di entitas pengesahan. Nilainya selalu CONFIDENTIAL_SPACE.

Contoh
assertion.swname == "CONFIDENTIAL_SPACE"
assertion.swversion Array string

Memverifikasi versi software image Confidential Space. Sebaiknya gunakan assertion.submods.confidential_space.support_attributes untuk menargetkan versi terbaru gambar.

Contoh
int(assertion.swversion[0]) == 230103

Pernyataan penampung

Pernyataan Jenis Deskripsi

assertion.submods.container.cmd_override

Berinteraksi dengan:

Array string

Memverifikasi perintah dan parameter CMD yang digunakan dalam image workload.

Contoh

Kode berikut memverifikasi CMD image workload belum ditimpa:

size(assertion.submods.container.cmd_override) == 0

Kode berikut memverifikasi bahwa program adalah satu-satunya konten dalam penggantian CMD:

assertion.submods.container.cmd_override == ['program']

assertion.submods.container.env

Berinteraksi dengan:

Objek JSON

Memverifikasi bahwa variabel lingkungan dan nilainya telah diteruskan secara eksplisit ke penampung.

Contoh

Kode berikut memverifikasi bahwa variabel lingkungan example-env-1 ditetapkan ke value-1, dan example-env-2 ditetapkan ke value-2.

assertion.submods.container.env == {"example-env-1": "value-1", "example-env-2": "value-2"}

assertion.submods.container.env_override

Berinteraksi dengan:

String

Memverifikasi apakah operator beban kerja telah menimpa variabel lingkungan dalam penampung.

Contoh

Kode berikut memverifikasi bahwa operator beban kerja belum mengganti variabel lingkungan example:

!has(assertion.submods.container.env_override.example)

Kode berikut memverifikasi bahwa operator beban kerja belum menimpa variabel lingkungan apa pun:

size(assertion.submods.container.env_override) == 0
assertion.submods.container.image_digest String

Memverifikasi ringkasan image container beban kerja. Dengan menentukan kondisi ini, beberapa pihak dapat menyepakati workload resmi yang diizinkan untuk mengakses data mereka.

Contoh
assertion.submods.container.image_digest == "sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b"
assertion.submods.container.image_id String

Memverifikasi ID image penampung beban kerja.

Contoh
assertion.submods.container.image_id == "sha256:652a44b0e911271ba07cf2915cd700fdfa50abd62a98f87a57fdebc59843d93f"

assertion.submods.container.image_reference

Berinteraksi dengan:

String

Memverifikasi lokasi penampung beban kerja yang berjalan di atas image Confidential Space.

Contoh
assertion.submods.container.image_reference == "us-docker.pkg.dev/PROJECT_ID/WORKLOAD_CONTAINER:latest"

assertion.submods.container.image_signatures

Berinteraksi dengan:

Objek JSON

Memverifikasi bahwa gambar memiliki tanda tangan tertentu atau ditandatangani oleh kunci publik dan algoritma penanda tangan. Dengan menentukan kondisi ini, beberapa pihak dapat menyepakati workload resmi yang diizinkan untuk mengakses data mereka.

Pernyataan dapat mencakup elemen berikut:

  • key_id: Sidik jari heksadesimal kunci publik. Untuk mendapatkan sidik jari, Anda dapat menjalankan perintah berikut:

    openssl pkey -pubin -in public_key.pem -outform DER | openssl sha256

    Dengan public_key.pem adalah kunci publik Anda dalam format PEM.

  • signature: Tanda tangan pada payload yang dikaitkan dengan penampung yang ditandatangani dan mengikuti format Penandatanganan Sederhana.
  • signature_algorithm: Algoritma yang digunakan untuk menandatangani kunci. Salah satu dari berikut ini:

    • RSASSA_PSS_SHA256 (RSASSA-PSS dengan ringkasan SHA-256)
    • RSASSA_PKCS1V15_SHA256 (RSASSA-PKCS1 v1_5 dengan ringkasan SHA-256)
    • ECDSA_P256_SHA256 (ECDSA pada Kurva P-256 dengan ringkasan SHA-256)
Contoh
assertion.swname == 'CONFIDENTIAL_SPACE' && ['ECDSA_P256_SHA256:PUBLIC_KEY_FINGERPRINT'].exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id)) && 'serviceaccount.iam.gserviceaccount.com' in assertion.google_service_accounts"

assertion.submods.container.restart_policy

Berinteraksi dengan:

String yang ditentukan

Memverifikasi kebijakan mulai ulang peluncur penampung saat beban kerja berhenti.

Nilai yang valid adalah:

  • Never (default)
  • Always
  • OnFailure
Contoh
assertion.submods.container.restart_policy == "Never"

Pernyataan VM

Pernyataan Jenis Deskripsi

assertion.google_service_accounts

Berinteraksi dengan:

Array string

Memverifikasi bahwa akun layanan yang ditentukan terhubung ke VM yang menjalankan beban kerja, atau telah tercantum menggunakan tee-impersonate-service-accounts dalam metadata VM.

Contoh
workload-service-account@my-project.iam.gserviceaccount.com in assertion.google_service_accounts
assertion.hwmodel String

Memverifikasi teknologi Confidential Computing yang mendasarinya. Platform yang didukung adalah sebagai berikut:

Contoh
assertion.hwmodel == "GCP_AMD_SEV"

assertion.submods.confidential_space.monitoring_enabled

Berinteraksi dengan:

Boolean

Memverifikasi status pemantauan pada entitas pengesahan.

Contoh
assertion.submods.confidential_space.monitoring_enabled.memory == true
assertion.submods.gce.instance_id String

Memverifikasi ID instance VM.

Contoh
assertion.submods.gce.instance_id == "0000000000000000000"
assertion.submods.gce.instance_name String

Memverifikasi nama instance VM.

Contoh
assertion.submods.gce.instance_name == "workload-vm"
assertion.submods.gce.project_id String

Memverifikasi bahwa VM menjalankan project Google Cloud dengan ID project yang ditentukan.

Contoh
assertion.submods.gce.project_id == "project-id"
assertion.submods.gce.project_number String

Memverifikasi bahwa VM berjalan di project Google Cloud dengan nomor project yang ditentukan.

Contoh
assertion.submods.gce.project_number == "00000000000"

assertion.submods.gce.zone

Berinteraksi dengan:

String

Memverifikasi bahwa VM berjalan di zona yang ditentukan.

Contoh
assertion.submods.gce.zone == "us-central1-a"