1. Giriş
Genel Bakış
Cloud Functions, bir sunucu veya çalışma zamanı ortamını yönetme gereği duymadan Cloud etkinliklerine yanıt veren tek amaçlı bağımsız işlevler oluşturmak için geliştiriciler tarafından kullanılabilecek 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, tamamen kontrolünüz altında olan bir şifreleme anahtarı kullanarak işlevle ilişkili verileri korur. Bu şifreleme türü, finansal hizmetler gibi belirli sektörlerdeki uyumluluk şartlarını karşılamanızı sağlar. Anahtar size ait olduğu ve Google tarafından kontrol edilmediği için anahtarlar devre dışı bırakıldığında veya yok edildiğinde bu şifreleme anahtarlarıyla korunan verilere siz de dahil hiç kimse erişemez.
Cloud Functions için CMEK 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 dinlenme halindeki veriler (yalnızca 1. nesil).
Hangi verilerin şifreleneceği hakkında daha fazla bilgiyi Cloud Function CMEK belgelerinde bulabilirsiniz.
Ne oluşturacaksınız?
Bu kod laboratuvarında, CMEK kullanılarak şifrelenmiş bir Cloud Functions işlevinin (1. nesil veya 2. nesil) nasıl dağıtılacağı gösterilmektedir. Bu kod laboratuvarında, demo amacıyla herkese açık bir Cloud işlevi (yani kimlik doğrulama gerektirmeyen bir işlev) kullanılmaktadır. Kimlik doğrulaması gerektiren diğer tüm Cloud Functions'lar gibi kimliği doğrulanmış CMEK özellikli 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 Cloud Functions'da CMEK'yi yapılandırma
2. Kurulum ve Gereksinimler
Ön koşullar
- Cloud Console'a giriş yapmış olmanız gerekir.
- Daha önce HTTP tetiklemeli bir Cloud Functions işlevi dağıttıysanız (uygun rollere ve API'lere sahip olduğunuzu 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 Cloud Shell'in ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
Bu sanal makine, ihtiyaç duyulan tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı 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örürsünüz.
- Kimliğinizi doğrulamak 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 projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Aksi takdirde 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)")"
Ardından, 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'deki yeni anahtarlığınızda simetrik anahtar oluşturabilirsiniz.
gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"
4. CMEK özellikli Docker biçimli bir Artifact Registry deposu oluşturma
Bu bölümde, CMEK'nin etkin olduğu bir Artifact Registry'de Docker biçimli bir depo oluşturacaksınız. Bu anahtar, Cloud işlevinizi dağıtmak için kullanılan anahtarla aynı olacaktır.
Öncelikle Artifact Registry için hizmet hesabına ihtiyacınız vardır. Aşağıdaki komutu çalıştırarak bu dosyayı oluşturabilirsiniz:
gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID
Anahtara erişim izni vermek için Artifact Registry hizmet hesabına CryptoKey Şifreleyici/Şifre Çözücü IAM rolünü (roles/cloudkms.cryptoKeyEncrypterDecrypter
) vermek üzere 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 (ör. mevcut etkin hesabınız) oluşturacak ilkeye rolü verin. gcloud auth list komutunu çalıştırarak 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 özellikli Docker biçimli bir depo oluşturabilirsiniz.
Not: Bölge, CMEK anahtarıyla aynı olmalıdır.
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
Yeni Artifact Registry deponuzu görüntülemek için şu komutu çalıştırın:
gcloud artifacts repositories describe $REPO_NAME --location=$REGION
5. Hizmet hesaplarına anahtara erişim izni verme (2. nesil)
Bu bölümde, 2. nesil işlevler için hizmet hesabı oluşturma işlemi ele alınmaktadır. 1. nesil bir işlev oluşturuyorsanız lütfen bir sonraki bölüme geçin.
CryptoKey Şifreleyici/Şifre Çözücü IAM rolünü (roles/cloudkms.cryptoKeyEncrypterDecrypter
) vererek çeşitli hizmet aracılarına anahtara erişim izni vermeniz gerekir. Bu hizmet aracıları, Cloud Storage'da depolanan kaynak koda erişim elde etmek, işlev resimlerini Artifact Registry'de CMEK ile korunan bir depoda depolamak ve CMEK ile şifrelenmiş bir Cloud Function 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 anahtara erişim izni 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şlevin nasıl oluşturulacağını ve dağıtılacağını göreceksiniz.
6. Hizmet hesaplarına anahtara erişim izni verme (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 bir işlev için hizmet hesabı oluşturduysanız lütfen bir sonraki bölüme geçin.
CryptoKey Encrypter/Decrypter IAM rolü (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'de 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şlevin nasıl oluşturulacağını ve dağıtılacağını göreceksiniz.
7. CMEK ile şifrelenmiş işlev oluşturma (2. nesil)
Bu bölümde 2. nesil işlevler oluşturma hakkında bilgi verilmektedir. 1. nesil talimatları için bir sonraki bölüme geçebilirsiniz.
CMEK etkinleştirilmiş bir Artifact Registry deponuz ve Cloud Functions'a anahtarınıza erişim izni verdiğiniz için artık CMEK anahtarınız kullanılarak şifrelenmiş bir işlev dağıtabilirsiniz.
2. nesil işlevler için adımlar:
İşlevin kaynak kodunu oluşturma
Bu kod laboratuvarında Node.js kullanılsa da desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.
Öncelikle bir dizin oluşturun ve cd komutunu kullanarak bu dizine gidin.
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
Ardından 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 şifrelemeyi kullanarak 2. nesil Cloud Functions'i dağıtma
Not: Aşağıdaki örnekte, mevcut dizininizdeki kaynakları kullanarak bir işlevin nasıl dağıtılacağı 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 elde edilen çıktıda CMEK anahtarını görebilirsiniz.
gcloud functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName
2. nesil işlevi test etme
İşlevinizi kıvırarak test edebilirsiniz:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')" curl $FUNCTION_URL
Bu durum aşağıdakilerle sonuçlanır:
Hello World!
Şifreleme anahtarı etkin olduğu sürece işlev, arayana başarı döndürür. Ancak şifreleme anahtarı devre dışı bırakıldıktan sonra arayan bir hata alır.
Bir sonraki bölümde, anahtar devre dışı bırakıldıktan sonra işlevi çağırdığınızda ne olacağını göreceksiniz.
8. CMEK ile şifrelenmiş işlev oluşturma (1. nesil)
Bu bölümde 1. nesil işlevler oluşturma hakkında bilgi verilmektedir. Daha önce 2. nesil bir işlev oluşturduysanız lütfen bir sonraki bölüme geçin.
CMEK'nin etkinleştirildiği bir Artifact Registry deponuz olduğuna 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 kod laboratuvarında Node.js kullanılsa da desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.
Önce 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 şifrelemeyi kullanarak 1. nesil Cloud Function'ı dağıtma
Not: Aşağıdaki örnekte, mevcut dizininizdeki kaynakları kullanarak bir işlevin nasıl dağıtılacağı 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 elde edilen çıktıda CMEK anahtarını görebilirsiniz.
gcloud functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName
1. nesil işlevi test etme
İşlevinizi kıvırarak test edebilirsiniz:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(httpsTrigger.url)')" curl $FUNCTION_URL
Bu durum aşağıdakilerle sonuçlanır:
Hello World!
Şifreleme anahtarı etkin olduğu sürece işlev, arayana başarı döndürür. Ancak şifreleme anahtarı devre dışı bırakıldıktan sonra arayan 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ığı bir CMEK şifrelenmiş işlevi çağırma
Bu son bölümde, anahtarı geçersiz kılar ve ortaya çıkan hatayı görmek için işlevi tekrar çağırırsınız.
Şifreleme anahtarını devre dışı bırakma
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
tıklayın. 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 kez Hello World yanıtı almazsınız.
Cloud Functions günlüklerinde şunları görürsünüz:
User's CMEK key has been disabled. CMEK key: projects/<PROJECT-NAME>/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function
CMEK anahtarı devre dışıyken kaynakları görüntülemeye çalışma
Bu bölümde, CMEK anahtarı devre dışı bırakıldığında aşağıdaki kaynakların kullanılamadığını görürsünüz:
- İşlev kaynak kodu
- Kaynak kodunuzdan container görüntüsü oluşturma
Örneğin, Cloud Functions işlevinin Kaynak sekmesine gittiğinizde arşiv getirilirken 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, işlev için Artifact Registry'deki kapsayıcı görüntüsünü kullanamazsınız. Ö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 İşlevleri belgelerine bakın.
10. Tebrikler
Tebrikler, kod laboratuvarını tamamladınız.
Ele aldığımız konular
- Mevcut bir simetrik anahtarlıkta CMEK anahtarı oluşturma
- Artifact Registry deposu oluşturma
- Cloud Functions'de CMEK'yi yapılandırma
Daha fazla bilgi için
Cloud Functions ve CMEK hakkında daha fazla bilgiyi aşağıdaki bağlantılarda bulabilirsiniz: