Mengenkripsi Cloud Functions menggunakan Kunci Enkripsi yang Dikelola Pelanggan (CMEK)

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 dalam penyimpanan terkait. Men-deploy fungsi dengan CMEK akan melindungi data yang terkait dengan menggunakan kunci enkripsi yang ada dalam kontrol Anda sepenuhnya. Jenis enkripsi ini memungkinkan Anda memenuhi persyaratan kepatuhan di industri tertentu, seperti jasa keuangan. Karena kunci dimiliki oleh Anda dan tidak dikontrol oleh Google, tidak seorang pun (termasuk Anda) yang dapat mengakses data yang dilindungi oleh kunci enkripsi tersebut 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 dari proses build fungsi, termasuk image container yang dibangun 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 dalam 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 terautentikasi yang diaktifkan dengan CMEK seperti Cloud Function lainnya yang memerlukan autentikasi.

Yang akan Anda pelajari

  • Cara membuat kunci CMEK pada key ring simetris yang ada
  • Cara membuat repositori Artifact Registry
  • Cara mengonfigurasi CMEK di Cloud Function untuk generasi ke-1 dan ke-2

2. Penyiapan dan Persyaratan

Prasyarat

  • Anda sudah login ke Konsol Cloud
  • Anda sebelumnya telah men-deploy Cloud Function yang dipicu HTTP (untuk memverifikasi bahwa Anda telah mengaktifkan peran dan API yang sesuai)

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell 853e55310c205094.pngS.

55efc1aaa7a4d3ad.png

Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.

9c92662c6a846a5c.pngS

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

9f0e51b578fecce5.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang dibutuhkan. 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 sudah ditetapkan ke project ID Anda.

  1. 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`
  1. 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 pada key ring baru Anda dalam Cloud KMS.

gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"

4. Membuat repositori Artifact Registry berformat Docker dengan CMEK

Di bagian ini, Anda akan membuat repositori berformat Docker di Artifact Registry yang mengaktifkan CMEK. Kunci ini akan menjadi kunci yang sama dengan 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 memberikan peran pada prinsip yang akan membuat repositori di artifact registry, 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 repositori berformat Docker yang mendukung CMEK.

Catatan: region tersebut 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. Beri Akun Layanan akses ke kunci tersebut (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 tersebut 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 untuk men-deploy Cloud Function terenkripsi CMEK.

Langkah-langkah untuk Fungsi generasi ke-2

  1. Beri agen layanan Cloud Run akses ke kunci:
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
  1. Beri agen layanan Eventarc akses ke kunci:
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
  1. Beri agen layanan Artifact Registry akses ke kunci:
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
  1. Beri agen layanan Cloud Storage akses ke kunci tersebut:
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 yang dienkripsi CMEK.

6. Beri Akun Layanan akses ke kunci tersebut (generasi ke-1)

Bagian ini membahas cara membuat 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 tersebut 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 untuk men-deploy Cloud Function terenkripsi CMEK.

Langkah-langkah untuk Fungsi generasi ke-1

  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
  1. Beri agen layanan Artifact Registry akses ke kunci:
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
  1. Beri agen layanan Cloud Storage akses ke kunci tersebut:
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 yang dienkripsi CMEK.

7. Membuat Function terenkripsi CMEK (generasi ke-2)

Bagian ini membahas pembuatan fungsi generasi ke-2. Anda dapat melanjutkan ke bagian berikutnya untuk mendapatkan 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 {i>cd<i} 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

Deploy Cloud Function generasi ke-2 menggunakan enkripsi CMEK

Catatan: Contoh di bawah menunjukkan cara men-deploy fungsi menggunakan sumber dari direktori Anda 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 functions $FUNCTION_NAME –region $REGION | {i>grep kmsKeyName<i}

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 Function setelah tombol dinonaktifkan.

8. Membuat Function terenkripsi CMEK (generasi ke-1)

Bagian ini membahas pembuatan fungsi generasi ke-1. Jika Anda sebelumnya telah membuat fungsi generasi ke-2, lanjutkan ke bagian berikutnya.

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-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 {i>cd<i} 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

Deploy Cloud Function generasi ke-1 menggunakan enkripsi CMEK

Catatan: Contoh di bawah menunjukkan cara men-deploy fungsi menggunakan sumber dari direktori Anda 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 | {i>grep kmsKeyName<i}

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 Function setelah tombol dinonaktifkan.

9. Memanggil Function terenkripsi CMEK yang kunci enkripsinya telah dinonaktifkan

Di bagian terakhir ini, Anda akan membatalkan kunci dan memanggil Function 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 Function dengan tombol 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 menjadi tidak tersedia saat kunci CMEK dinonaktifkan:

  • Kode sumber fungsi
  • Build image container dari kode sumber Anda

Misalnya, membuka tab Source 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.

ac3307bb05d30e19.png

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 pada 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: