Müşteri Tarafından Yönetilen Şifreleme Anahtarlarını (CMEK) kullanarak Cloud Functions'ı şifreleme
Bu codelab hakkında
1. Giriş
Genel Bakış
Cloud Functions, geliştiricilerin bir sunucuyu veya çalışma zamanı ortamını yönetmeye gerek kalmadan Bulut etkinliklerine yanıt veren tek amaçlı bağımsız işlevler oluşturmasına olanak tanıyan hafif bir bilgi işlem çözümüdür.
Cloud Functions'ı ve aktif olmayan ilgili verileri korumak için Cloud Key Management Service'in müşteri tarafından yönetilen şifreleme anahtarlarını (CMEK) kullanabilirsiniz. Bir işlevi CMEK ile dağıtmak, tam kontrole sahip olduğunuz bir şifreleme anahtarı kullanarak onunla ilişkili verileri korur. Bu şifreleme türü, finansal hizmetler gibi belirli sektörlerde uygunluk koşullarını karşılamanıza olanak tanır. Anahtar size ait olduğu ve Google tarafından kontrol edilmediği için, anahtarlar devre dışı bırakıldığında veya kaldırıldığında hiç kimse (siz dahil) bu şifreleme anahtarlarıyla korunan verilere erişemez.
CMEK, Cloud Functions için aşağıdakileri şifreler:
- Dağıtım için yüklenen ve Google tarafından Cloud Storage'da depolanan, derleme işleminde kullanılan işlev kaynak kodu.
- İşlev kaynak kodunuzdan derlenen container görüntüsü ve dağıtılan işlevin her bir örneği de dahil olmak üzere işlev derleme işleminin sonuçları.
- Dahili etkinlik aktarma kanalları için aktif olmayan veriler (yalnızca 1. nesil).
Hangi verilerin şifrelendiği hakkında daha fazla bilgiyi Cloud Functions işlevi CMEK belgelerinde bulabilirsiniz.
Neler oluşturacaksınız?
Bu codelab'de, CMEK kullanılarak şifrelenmiş bir Cloud Functions işlevinin (1. veya 2. nesil) nasıl dağıtılacağı gösterilmektedir. Bu codelab'de, demo amaçları doğrultusunda kimlik doğrulama gerektirmeyen herkese açık bir Cloud Functions işlevi kullanılır. Kimlik doğrulama gerektiren diğer herhangi bir Cloud Functions işlevi gibi, kimliği doğrulanmış CMEK'nin etkin olduğu bir işlevi de çağırabilirsiniz.
Neler öğreneceksiniz?
- Mevcut bir simetrik anahtarlıkta CMEK anahtarı oluşturma
- Artifact Registry deposu oluşturma
- Hem 1. hem de 2. nesil için Cloud Functions işlevinde CMEK'yi yapılandırma
2. Kurulum ve Gereksinimler
Ön koşullar
- Cloud Console'a giriş yaptınız
- Daha önce HTTP tetiklenmiş bir Cloud Functions işlevi dağıttınız (uygun rollerin ve API'lerin etkinleştirildiğini doğrulamak için).
Cloud Shell'i etkinleştirme
- Cloud Console'da, Cloud Shell'i etkinleştir
simgesini tıklayın.
Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.
- Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list
Komut çıkışı
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:
gcloud config set project <PROJECT_ID>
Komut çıkışı
Updated property [core/project].
3. Cloud Functions için yeni bir anahtarlık ve anahtar oluşturun
Aşağıdaki komutu çalıştırarak Cloud KMS API'nin etkinleştirildiğinden emin olun:
gcloud services enable cloudkms.googleapis.com
Öncelikle anahtarlık adını, anahtar adını, bölgeyi ve bu codelab'de kullanılan diğer değişkenleri içerecek ortam değişkenleri oluşturun.
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)")"
Daha sonra, Cloud KMS anahtarları ve anahtar sürümleri için kök kaynak olan bir anahtarlık oluşturun.
gcloud kms keyrings create $KEYRING_NAME --location $REGION
Son olarak, artık Cloud KMS içindeki yeni anahtar halkanızda bir simetrik anahtar oluşturabilirsiniz.
gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"
4. CMEK özellikli Docker biçimli Artifact Registry deposu oluşturma
Bu bölümde, Artifact Registry'de CMEK özellikli Docker biçimli bir depo oluşturacaksınız. Bu anahtar, Cloud Functions işlevinizi dağıtmak için kullandığınız anahtarla aynı olacaktır.
Öncelikle Artifact Registry için hizmet hesabına ihtiyacınız vardır. Bu etiketi oluşturmak için şu komutu çalıştırın:
gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID
Artifact Registry hizmet hesabına, anahtara erişim izni vermek için CryptoKey Encrypter/Decrypter IAM rolünü (roles/cloudkms.cryptoKeyEncrypterDecrypter
) vermek için aşağıdaki komutu kullanın:
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
Ayrıca, yapı kaydında depoyu oluşturacak ilkeye rolü verin (ör. şu anki etkin hesabınız. gcloud auth list çalıştırarak mevcut etkin hesabınızı doğrulayabilirsiniz.
gcloud kms keys add-iam-policy-binding \ $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \ --member user:$USER_EMAIL \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
Artık CMEK'nin etkin olduğu Docker biçimli bir depo oluşturabilirsiniz.
Not: Bölgenin, CMEK anahtarıyla aynı bölgede olması gerekir.
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
Şu komutu çalıştırarak yeni Artifact Registry deponuzu görüntüleyebilirsiniz:
gcloud artifacts repositories describe $REPO_NAME --location=$REGION
5. Hizmet Hesaplarına anahtara erişim izni verin (2. nesil)
Bu bölümde 2. nesil işlevler için hizmet hesapları oluşturma konusu ele alınmaktadır. 1. nesil işlev oluşturuyorsanız lütfen sonraki bölüme geçin.
CryptoKey Encrypter/Decrypter IAM rolünü (roles/cloudkms.cryptoKeyEncrypterDecrypter
) vererek birkaç hizmet aracısına anahtara erişim izni vermeniz gerekir. Bu hizmet aracıları; Cloud Storage'da depolanan kaynak koduna erişim elde etmek, işlev görüntülerini Artifact Registry'deki CMEK korumalı bir depoda depolamak ve CMEK ile şifrelenmiş bir Cloud Functions işlevini dağıtmak için kullanılır.
2. nesil işlevler için adımlar
- Cloud Run hizmet aracısına anahtara erişim izni verin:
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
- Eventarc hizmet aracısına anahtar için erişim verin:
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
- Artifact Registry hizmet aracısına anahtara erişim izni verin:
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
- Cloud Storage hizmet aracılarına anahtara erişim izni verin:
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
Sonraki bölümde, CMEK ile şifrelenmiş bir işlevi nasıl oluşturup dağıtacağınızı göreceksiniz.
6. Hizmet Hesaplarına anahtara erişim izni verin (1. nesil)
Bu bölümde 1. nesil işlevler için hizmet hesapları oluşturma konusu ele alınmaktadır. Daha önce 2. nesil işlev için hizmet hesapları oluşturduysanız lütfen sonraki bölüme geçin.
CryptoKey Encrypter/Decrypter IAM rolünü (roles/cloudkms.cryptoKeyEncrypterDecrypter
) vererek birkaç hizmet aracısına anahtara erişim izni vermeniz gerekir. Bu hizmet aracıları; Cloud Storage'da depolanan kaynak koduna erişim elde etmek, işlev görüntülerini Artifact Registry'deki CMEK korumalı bir depoda depolamak ve CMEK ile şifrelenmiş bir Cloud Functions işlevini dağıtmak için kullanılır.
1. nesil işlevler için adımlar
- Cloud Functions hizmet aracısına anahtara erişim izni verin:
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
- Artifact Registry hizmet aracısına anahtara erişim izni verin:
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
- Cloud Storage hizmet aracılarına anahtara erişim izni verin:
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
Sonraki bölümde, CMEK ile şifrelenmiş bir işlevi nasıl oluşturup dağıtacağınızı göreceksiniz.
7. CMEK ile şifrelenmiş bir işlev oluşturma (2. nesil)
Bu bölümde 2. nesil işlevlerin oluşturulması açıklanmaktadır. 1. nesil talimatları için bir sonraki bölüme geçebilirsiniz.
CMEK'nin etkinleştirildiği bir Artifact Registry deponuz olduğundan ve Cloud Functions'a anahtarınıza erişim izni verdiğinize göre artık CMEK anahtarınızı kullanarak şifrelenmiş bir işlev dağıtabilirsiniz.
2. nesil işlevler için adımlar:
İşlev için kaynak kodunu oluşturma
Bu codelab'de Node.js kullanılır, ancak siz desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.
İlk olarak bir dizin oluşturun ve bu dizin için cd'yi kullanın.
mkdir ~/cmek-function-2ndgen && cd $_
Ardından, package.json dosyasını oluşturun.
touch package.json echo '{ "dependencies": { "@google-cloud/functions-framework": "^2.1.0" } } ' > package.json
Sonra, index.js kaynak dosyasını oluşturun.
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
CMEK şifrelemesini kullanarak 2. nesil Cloud Functions işlevini dağıtma
Not: Aşağıdaki örnekte, geçerli dizininizdeki kaynakları kullanarak işlevi nasıl dağıtacağınız gösterilmektedir. İşlevinizin kaynak koduyla aynı dizinde olduğunuzdan emin olun.
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
Bu komutu çalıştırarak ortaya çıkan çıkışta CMEK anahtarını görebilirsiniz
gcloud Functions describe $FUNCTION_NAME –region $REGION | grep kmsAnahtarAdı
2. nesil işlevini test etme
İşlevinizi kıvırarak test edebilirsiniz:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')" curl $FUNCTION_URL
sonuç şu şekildedir:
Hello World!
Şifreleme anahtarı etkin olduğu sürece işlev, arayana başarıyı döndürür. Ancak şifreleme anahtarı devre dışı bırakıldığında arayan kişi bir hata alır.
Sonraki bölümde, anahtar devre dışı bırakıldıktan sonra İşlevi çağırdığınızda neler olduğunu göreceksiniz.
8. CMEK ile şifrelenmiş bir işlev oluşturma (1. nesil)
Bu bölümde 1. nesil işlevlerin oluşturulması açıklanmaktadır. Daha önce 2. nesil işlev oluşturduysanız lütfen sonraki bölüme geçin.
CMEK'nin etkinleştirildiği bir Artifact Registry deponuz olduğundan ve Cloud Functions'a anahtarınıza erişim izni verdiğinize göre artık CMEK anahtarınızı kullanarak şifrelenmiş bir işlev dağıtabilirsiniz.
1. nesil işlevler için adımlar:
1. nesil işlevi için kaynak kodunu oluşturma
Bu codelab'de Node.js kullanılır, ancak siz desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.
İlk olarak bir dizin oluşturun ve bu dizin için cd'yi kullanın.
mkdir ~/cmek-function-1stgen && cd $_
Sonra, package.json dosyasını oluşturun.
touch package.json echo '{ "name": "function-cmek-codelab", "version": "0.0.1" }' > package.json
Ardından, index.js kaynak dosyasını oluşturun.
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
CMEK şifrelemesini kullanarak 1. nesil Cloud Functions işlevini dağıtma
Not: Aşağıdaki örnekte, geçerli dizininizdeki kaynakları kullanarak işlevi nasıl dağıtacağınız gösterilmektedir. İşlevinizin kaynak koduyla aynı dizinde olduğunuzdan emin olun.
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
Bu komutu çalıştırarak ortaya çıkan çıkışta CMEK anahtarını görebilirsiniz
gcloud Functions describe $FUNCTION_NAME –region $REGION | grep kmsAnahtarAdı
1. nesil işlevini test edin
İşlevinizi kıvırarak test edebilirsiniz:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(httpsTrigger.url)')" curl $FUNCTION_URL
sonuç şu şekildedir:
Hello World!
Şifreleme anahtarı etkin olduğu sürece işlev, arayana başarıyı döndürür. Ancak şifreleme anahtarı devre dışı bırakıldığında arayan kişi bir hata alır.
Sonraki bölümde, anahtar devre dışı bırakıldıktan sonra İşlevi çağırdığınızda neler olduğunu göreceksiniz.
9. Şifreleme anahtarının devre dışı bırakıldığı CMEK ile şifrelenmiş bir işlevi çağırın
Bu son bölümde, anahtarı geçersiz kılacak ve ortaya çıkan hatayı görmek için İşlevi tekrar çağıracaksınız.
Şifreleme anahtarını devre dışı bırak
Anahtarı devre dışı bırakmak için bu komutu çalıştırabilirsiniz. Bu codelab, anahtarın yalnızca bir sürümünü oluşturduğu için sürüm 1'i devre dışı bırakırsınız.
gcloud kms keys versions disable 1 \ --key=$KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION
Aşağıdaki bilgileri görürsünüz:
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
Devre dışı bir tuşla işlevi çağırma
Şimdi işlevi tekrar curl
.
curl $FUNCTION_URL
ve bu sefer bir Hello World yanıtı almazsınız.
Cloud Functions işlevinin günlüklerinde
User's CMEK key has been disabled. CMEK key: projects/<PROJECT-NAME>/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function
CMEK anahtarı devre dışı bırakıldığında kaynakları görüntüleme girişimi
Bu bölümde, CMEK anahtarı devre dışı bırakıldığında aşağıdaki kaynakların kullanılamaz hâle geldiğini görürsünüz:
- İşlev kaynak kodu
- Kaynak kodunuzdan container görüntüsü derleme
Örneğin, Cloud Functions işlevinin Kaynak sekmesi ziyaret edildiğinde, arşiv getirilirken bir hata gösterilir. Kaynak kodu içeren .zip dosyasını doğrudan Cloud Storage'da görüntülemeye çalışırsanız benzer bir hata alırsınız.
Ayrıca, Artifact Registry'deki işlev için container görüntüsünü kullanma izniniz olmaz. Örneğin, bu container görüntüsünü Cloud Run'a dağıtmaya çalışırsanız görüntünün bulunamadığını belirten bir hata alırsınız.
Şifrelenmiş kaynakların tam listesi için lütfen CMEK Functions belgelerine bakın.
10. Tebrikler
Tebrikler, codelab'i tamamladınız.
İşlediklerimiz
- Mevcut bir simetrik anahtarlıkta CMEK anahtarı oluşturma
- Artifact Registry deposu oluşturma
- Bir Cloud Functions işlevinde CMEK'yi yapılandırma
Daha fazla bilgi
Aşağıdaki bağlantılarda Cloud Functions ve CMEK hakkında daha fazla bilgi bulabilirsiniz: