1. Pengantar
Ringkasan
Cloud Functions adalah solusi komputasi ringan bagi developer untuk membuat fungsi yang berdiri sendiri dan bertujuan tunggal, yang merespons peristiwa Cloud tanpa perlu mengelola server atau lingkungan runtime.
Anda dapat menggunakan kunci enkripsi yang dikelola pelanggan (CMEK) Cloud Key Management Service untuk melindungi Cloud Functions dan data terkait dalam penyimpanan. Men-deploy fungsi dengan CMEK akan melindungi data yang terkait dengannya menggunakan kunci enkripsi yang ada dalam kendali penuh Anda. Jenis enkripsi ini memungkinkan Anda memenuhi persyaratan kepatuhan di industri tertentu, seperti jasa keuangan. Karena kunci tersebut dimiliki oleh Anda dan tidak dikontrol oleh Google, tidak seorang pun (termasuk Anda) yang dapat mengakses data yang dilindungi oleh kunci enkripsi ini saat kunci tersebut dinonaktifkan atau dihancurkan.
Untuk Cloud Functions, CMEK mengenkripsi hal berikut:
- Kode sumber fungsi yang diupload untuk deployment dan disimpan oleh Google di Cloud Storage, yang digunakan dalam proses build.
- Hasil proses build fungsi, termasuk image container yang dibuat dari kode sumber fungsi Anda, setiap instance fungsi yang di-deploy.
- Data dalam penyimpanan untuk saluran transportasi peristiwa internal (khusus generasi ke-1).
Anda dapat menemukan informasi selengkapnya tentang data yang dienkripsi di dokumentasi CMEK Cloud Function.
Yang akan Anda build
Codelab ini menunjukkan cara men-deploy Cloud Function (generasi ke-1 atau generasi ke-2) yang dienkripsi menggunakan CMEK. Codelab ini menggunakan Cloud Function publik, yaitu Cloud Function yang tidak memerlukan autentikasi, untuk tujuan demo. Anda dapat memanggil fungsi yang diaktifkan CMEK dan diautentikasi seperti Cloud Function lainnya yang memerlukan autentikasi.
Yang akan Anda pelajari
- Cara membuat kunci CMEK di key ring simetris yang ada
- Cara membuat repositori Artifact Registry
- Cara mengonfigurasi CMEK di Cloud Functions untuk generasi ke-1 dan ke-2
2. Penyiapan dan Persyaratan
Prasyarat
- Anda login ke Cloud Console
- Anda telah men-deploy Cloud Function yang dipicu HTTP sebelumnya (untuk memverifikasi bahwa Anda telah mengaktifkan peran dan API yang sesuai)
Mengaktifkan Cloud Shell
- Dari Cloud Console, klik Aktifkan Cloud Shell .
Jika ini adalah pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.
Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.
Virtual machine ini dimuat dengan semua alat pengembangan yang diperlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.
Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project telah ditetapkan ke project ID Anda.
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list
Output perintah
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project
Output perintah
[core] project = <PROJECT_ID>
Jika tidak, Anda dapat menyetelnya dengan perintah ini:
gcloud config set project <PROJECT_ID>
Output perintah
Updated property [core/project].
3. Membuat key ring dan kunci baru untuk Cloud Functions
Pastikan Cloud KMS API diaktifkan dengan menjalankan perintah berikut:
gcloud services enable cloudkms.googleapis.com
Pertama, buat variabel lingkungan untuk memuat nama key ring, nama kunci, region, dan variabel lain yang digunakan dalam codelab ini.
KEYRING_NAME="keyring-functions" REGION="us-central1" KEY_NAME="key-encrypted-function" PROJECT_ID=$(gcloud config get-value project) PROJECT_NUMBER="$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')" USER_EMAIL="$(gcloud config list account --format "value(core.account)")"
Selanjutnya, buat key ring yang merupakan resource root untuk kunci dan versi kunci Cloud KMS.
gcloud kms keyrings create $KEYRING_NAME --location $REGION
Terakhir, Anda kini dapat membuat kunci simetris di key ring baru dalam Cloud KMS.
gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"
4. Membuat repositori Artifact Registry berformat Docker yang mengaktifkan CMEK
Di bagian ini, Anda akan membuat repo berformat Docker di Artifact Registry yang telah mengaktifkan CMEK. Kunci ini akan sama dengan kunci yang digunakan untuk men-deploy Cloud Function Anda.
Pertama, Anda memerlukan akun layanan untuk Artifact Registry. Anda dapat membuatnya dengan menjalankan perintah ini:
gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID
Gunakan perintah berikut untuk memberikan peran IAM CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter
) ke akun layanan Artifact Registry agar memiliki izin ke kunci:
gcloud kms keys add-iam-policy-binding \ $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \ --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
Dan berikan peran ke akun yang akan membuat repo di registry artefak, misalnya akun aktif Anda saat ini. Anda dapat memverifikasi akun yang aktif saat ini dengan menjalankan gcloud auth list.
gcloud kms keys add-iam-policy-binding \ $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \ --member user:$USER_EMAIL \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
Sekarang Anda dapat membuat repo berformat Docker yang mendukung CMEK.
Catatan: region harus sama dengan region kunci CMEK.
REPO_NAME=my-cmek-encrypted-repo KEY_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/keyRings/"$KEYRING_NAME"/cryptoKeys/"$KEY_NAME" gcloud artifacts repositories create $REPO_NAME \ --repository-format=docker \ --location=$REGION \ --kms-key=$KEY_FULLPATH \ --async
Anda dapat melihat repositori Artifact Registry baru yang menjalankan perintah ini:
gcloud artifacts repositories describe $REPO_NAME --location=$REGION
5. Memberi Akun Layanan akses ke kunci (generasi ke-2)
Bagian ini membahas cara membuat akun layanan untuk fungsi generasi ke-2. Jika Anda membuat fungsi generasi ke-1, lanjutkan ke bagian berikutnya.
Anda harus memberikan akses ke kunci kepada beberapa agen layanan dengan memberikan peran IAM CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter
). Agen layanan ini digunakan untuk mendapatkan akses ke kode sumber yang disimpan di Cloud Storage, menyimpan image fungsi di repositori yang dilindungi CMEK di Artifact Registry, dan men-deploy Cloud Function yang dienkripsi CMEK.
Langkah-langkah untuk Fungsi generasi ke-2
- Berikan akses kunci ke agen layanan Cloud Run:
CLOUDRUN_SA=service-$PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$CLOUDRUN_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Berikan akses kunci ke agen layanan Eventarc:
EVENTARC_SA=service-$PROJECT_NUMBER@gcp-sa-eventarc.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$EVENTARC_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Berikan akses ke kunci kepada agen layanan Artifact Registry:
AR_SA=service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$AR_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Berikan akses kunci ke agen layanan Cloud Storage:
STORAGE_SA=service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$STORAGE_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
Di bagian berikutnya, Anda akan melihat cara membuat dan men-deploy fungsi terenkripsi CMEK.
6. Memberi Akun Layanan akses ke kunci (generasi ke-1)
Bagian ini membahas pembuatan akun layanan untuk fungsi generasi ke-1. Jika Anda sebelumnya telah membuat akun layanan untuk fungsi generasi ke-2, lanjutkan ke bagian berikutnya.
Anda harus memberikan akses ke kunci kepada beberapa agen layanan dengan memberikan peran IAM CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter
). Agen layanan ini digunakan untuk mendapatkan akses ke kode sumber yang disimpan di Cloud Storage, menyimpan image fungsi di repositori yang dilindungi CMEK di Artifact Registry, dan men-deploy Cloud Function yang dienkripsi CMEK.
Langkah-langkah untuk Fungsi generasi ke-1
- Beri agen layanan Cloud Functions akses ke kunci:
FUNCTION_SA=service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$FUNCTION_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Berikan akses ke kunci kepada agen layanan Artifact Registry:
AR_SA=service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$AR_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Berikan akses kunci ke agen layanan Cloud Storage:
STORAGE_SA=service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$STORAGE_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
Di bagian berikutnya, Anda akan melihat cara membuat dan men-deploy fungsi terenkripsi CMEK.
7. Membuat Fungsi terenkripsi CMEK (generasi ke-2)
Bagian ini membahas cara membuat fungsi generasi ke-2. Anda dapat melanjutkan ke bagian berikutnya untuk mengetahui petunjuk generasi ke-1.
Setelah memiliki repositori Artifact Registry yang dikonfigurasi dengan mengaktifkan CMEK dan memberi Cloud Functions akses ke kunci Anda, sekarang Anda dapat men-deploy fungsi yang dienkripsi menggunakan kunci CMEK.
Langkah-langkah untuk Fungsi generasi ke-2:
Membuat kode sumber untuk fungsi
Meskipun codelab ini menggunakan Node.js, Anda dapat menggunakan runtime yang didukung.
Pertama, buat direktori dan cd ke direktori tersebut.
mkdir ~/cmek-function-2ndgen && cd $_
Kemudian, buat file package.json.
touch package.json echo '{ "dependencies": { "@google-cloud/functions-framework": "^2.1.0" } } ' > package.json
Selanjutnya, buat file sumber index.js.
touch index.js echo 'const functions = require("@google-cloud/functions-framework"); functions.http("helloWorld", (req, res) => { res.send(`Hello ${req.query.name || req.body.name || "World"}!`); });' > index.js
Men-deploy Cloud Function generasi ke-2 menggunakan enkripsi CMEK
Catatan: Contoh di bawah menunjukkan cara men-deploy fungsi menggunakan sumber dari direktori saat ini. Pastikan Anda berada di direktori yang sama dengan kode sumber untuk fungsi Anda.
FUNCTION_NAME=protect-me-cmek-2ndgen ENTRY_POINT=helloWorld REPO_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/repositories/$REPO_NAME gcloud beta functions deploy $FUNCTION_NAME \ --gen2 \ --region $REGION \ --kms-key $KEY_FULLPATH \ --docker-repository $REPO_FULLPATH \ --source . \ --trigger-http \ --allow-unauthenticated \ --runtime nodejs16 \ --entry-point $ENTRY_POINT
Anda dapat melihat kunci CMEK dari output yang dihasilkan dengan menjalankan perintah ini
gcloud functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName
Menguji fungsi generasi ke-2
Anda dapat menguji fungsi dengan melakukan curl:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')" curl $FUNCTION_URL
yang menghasilkan hal berikut:
Hello World!
Selama kunci enkripsi diaktifkan, fungsi akan menampilkan keberhasilan ke pemanggil. Namun, setelah kunci enkripsi dinonaktifkan, pemanggil akan menerima pesan error.
Di bagian berikutnya, Anda akan melihat apa yang terjadi saat memanggil Fungsi setelah kunci dinonaktifkan.
8. Membuat Fungsi terenkripsi CMEK (generasi ke-1)
Bagian ini membahas cara membuat fungsi generasi ke-1. Jika sebelumnya Anda telah membuat fungsi generasi ke-2, lanjutkan ke bagian berikutnya.
Setelah memiliki repositori Artifact Registry yang dikonfigurasi dengan CMEK diaktifkan dan telah memberikan akses Cloud Functions ke kunci Anda, kini Anda dapat men-deploy fungsi yang dienkripsi menggunakan kunci CMEK Anda.
Langkah-langkah untuk Fungsi generasi ke-1:
Membuat kode sumber untuk fungsi generasi ke-1
Meskipun codelab ini menggunakan Node.js, Anda dapat menggunakan runtime yang didukung.
Pertama, buat direktori dan cd ke direktori tersebut.
mkdir ~/cmek-function-1stgen && cd $_
Berikutnya, buat file package.json.
touch package.json echo '{ "name": "function-cmek-codelab", "version": "0.0.1" }' > package.json
Kemudian, buat file sumber index.js.
touch index.js echo "exports.helloWorld = (req, res) => { let message = req.query.message || req.body.message || 'Hello World!'; res.status(200).send(message); };" > index.js
Men-deploy Cloud Function generasi ke-1 menggunakan enkripsi CMEK
Catatan: Contoh di bawah menunjukkan cara men-deploy fungsi menggunakan sumber dari direktori saat ini. Pastikan Anda berada di direktori yang sama dengan kode sumber untuk fungsi Anda.
FUNCTION_NAME=protect-me-cmek-1stgen ENTRY_POINT=helloWorld REPO_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/repositories/$REPO_NAME gcloud functions deploy $FUNCTION_NAME \ --region $REGION \ --kms-key $KEY_FULLPATH \ --docker-repository $REPO_FULLPATH \ --source . \ --trigger-http \ --allow-unauthenticated \ --runtime nodejs16 \ --entry-point $ENTRY_POINT
Anda dapat melihat kunci CMEK dari output yang dihasilkan dengan menjalankan perintah ini
gcloud functions functions $FUNCTION_NAME –region $REGION | grep kmsKeyName
Menguji fungsi generasi ke-1
Anda dapat menguji fungsi dengan melakukan curl:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(httpsTrigger.url)')" curl $FUNCTION_URL
yang menghasilkan hal berikut:
Hello World!
Selama kunci enkripsi diaktifkan, fungsi akan menampilkan keberhasilan ke pemanggil. Namun, setelah kunci enkripsi dinonaktifkan, pemanggil akan menerima pesan error.
Di bagian berikutnya, Anda akan melihat apa yang terjadi saat memanggil Fungsi setelah kunci dinonaktifkan.
9. Memanggil Fungsi terenkripsi CMEK dengan kunci enkripsi yang telah dinonaktifkan
Di bagian terakhir ini, Anda akan membatalkan validasi kunci dan memanggil Fungsi lagi untuk melihat error yang dihasilkan.
Nonaktifkan kunci enkripsi
Anda dapat menjalankan perintah ini untuk menonaktifkan kunci. Karena codelab ini hanya membuat satu versi kunci, Anda akan menonaktifkan versi 1.
gcloud kms keys versions disable 1 \ --key=$KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION
dan Anda akan melihat info yang dihasilkan:
algorithm: GOOGLE_SYMMETRIC_ENCRYPTION createTime: '2023-04-11T03:30:49.111832653Z' generateTime: '2023-04-11T03:30:49.111832653Z' name: projects/dogfood-gcf-saraford/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function/cryptoKeyVersions/1 protectionLevel: SOFTWARE state: DISABLED
Memanggil Fungsi dengan kunci yang dinonaktifkan
Sekarang curl
fungsi tersebut lagi.
curl $FUNCTION_URL
dan Anda tidak akan menerima respons Hello World kali ini.
Di log untuk Cloud Function, Anda akan melihat
User's CMEK key has been disabled. CMEK key: projects/<PROJECT-NAME>/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function
Mencoba melihat resource saat kunci CMEK dinonaktifkan
Di bagian ini, Anda akan melihat resource berikut tidak tersedia saat kunci CMEK dinonaktifkan:
- Kode sumber fungsi
- Build image container dari kode sumber Anda
Misalnya, membuka tab Sumber untuk Cloud Function akan menampilkan error saat mengambil arsip. Anda akan menerima error serupa jika mencoba melihat file .zip yang berisi kode sumber langsung di Cloud Storage.
Selain itu, Anda tidak akan memiliki akses untuk menggunakan image container untuk fungsi dari Artifact Registry. Misalnya, jika Anda mencoba men-deploy image container tersebut ke Cloud Run, Anda akan menerima error bahwa image tidak ditemukan.
Lihat dokumen CMEK Functions untuk mengetahui daftar lengkap resource terenkripsi.
10. Selamat
Selamat, Anda telah menyelesaikan codelab!
Yang telah kita bahas
- Cara membuat kunci CMEK di key ring simetris yang ada
- Cara membuat repositori Artifact Registry
- Cara mengonfigurasi CMEK di Cloud Function
Untuk informasi selengkapnya
Anda dapat menemukan informasi selengkapnya tentang Cloud Functions dan CMEK di link berikut:
- Artikel Mengamankan Cloud Functions menggunakan CMEK
- Dokumentasi Kunci enkripsi yang dikelola pelanggan