Membuat dan memberikan akses ke resource rahasia


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

Selain itu, kolaborator data perlu memilih tempat penyimpanan hasil workload Confidential Space, dan apakah data yang ditampilkan 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 apa pun 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 untuk beban kerja 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 diberi otorisasi dan berbasis di project lain kemudian dapat menggunakan WIP tersebut untuk meniru identitas akun layanan yang mendekripsi data, mengambil data yang telah didekripsi, dan memprosesnya.

Karena akun layanan digunakan untuk mendekripsi dan memproses data rahasia, 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 VM berjalan.

Lihat Membuat lingkungan Confidential Space pertama Anda untuk melihat 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, serta menangkap pengukuran urutan booting dalam register khusus perpanjangan dan dilindungi di perangkat virtual Trusted Platform Module (vTPM).

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

Jika WIP mengizinkan workload, workload tersebut kemudian 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 yang diizinkan untuk https://sts.googleapis.com.

    • 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 dirangkai 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 workload

  • Alamat akun layanan yang terhubung ke VM workload

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

  • Atribut dukungan image Confidential Space produksi

Pernyataan pengesahan

Pernyataan yang tersedia untuk membuat kebijakan pengesahan diuraikan dalam tabel berikut. Layanan ini 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: Periksa apakah gambar debug sedang digunakan.
  • disabled-since-boot: Periksa apakah gambar produksi sedang digunakan.
Contoh

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

assertion.dbgstat == "enable"

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

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

Memverifikasi bahwa versi keamanan TEE adalah image Confidential Space produksi. Gambar Confidential Space untuk proses debug tidak memiliki set atribut dukungan.

Ada tiga atribut dukungan:

  • LATEST: Ini adalah versi terbaru gambar, dan didukung. Gambar LATEST juga STABLE dan USABLE.
  • STABLE: Versi image ini didukung dan dipantau untuk mengetahui kerentanan. Gambar STABLE juga USABLE.
  • USABLE: Gambar yang hanya memiliki atribut ini tidak lagi didukung dan tidak lagi dipantau kerentanannya. Gunakan dengan risiko Anda sendiri.
Contoh

Kode berikut memverifikasi bahwa image Ruang Rahasia versi stabil sedang digunakan:

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

Memverifikasi software yang berjalan di entitas yang membuktikan. Nilai 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 CMD dan parameter yang digunakan dalam image workload.

Contoh

Kode berikut memverifikasi bahwa CMD image beban kerja 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 container.

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 workload telah mengganti variabel lingkungan dalam container.

Contoh

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

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

Kode berikut memverifikasi bahwa operator workload 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 menyetujui 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 container workload.

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

assertion.submods.container.image_reference

Berinteraksi dengan:

String

Memverifikasi lokasi container workload 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 algoritma penandatanganan dan kunci publik. Dengan menentukan kondisi ini, beberapa pihak dapat menyetujui workload yang diizinkan untuk mengakses data mereka.

Pernyataan dapat mencakup elemen berikut:

  • key_id: Sidik jari heksadesimal dari 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 terkait dengan penampung bertanda tangan dan yang 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 container 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 tertentu terhubung ke VM yang menjalankan workload, atau telah dicantumkan 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:

  • GCP_AMD_SEV
  • INTEL_TDX
Contoh
assertion.hwmodel == "GCP_AMD_SEV"

assertion.submods.confidential_space.monitoring_enabled

Berinteraksi dengan:

Boolean

Memverifikasi status pemantauan pada entitas yang membuktikan.

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 project ID 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"