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 ilgili aktif olmayan verileri korumak için Cloud Key Management Service müşteri tarafından yönetilen şifreleme anahtarlarını (CMEK) kullanabilirsiniz. CMEK ile bir işlev dağıtmak, tam kontrolünüzde olan bir şifreleme anahtarı kullanarak işlevle ilişkili verileri korur. Bu şifreleme türü, finansal hizmetler gibi belirli sektörlerdeki uygunluk koşullarını karşılamanıza olanak tanır. Anahtarın sahibi siz olduğunuz ve Google tarafından kontrol edilmediği için anahtarlar devre dışı bırakıldığında veya yok edildiğinde siz de dahil olmak üzere hiç kimse bu şifreleme anahtarlarıyla korunan verilere erişemez.
Cloud Functions için CMEK aşağıdaki öğeleri şifreler:
- Dağıtım için yüklenen ve Google tarafından Cloud Storage'da depolanan işlev kaynak kodu, derleme işlemi sırasında kullanılır.
- İşlev kaynak kodunuzdan oluşturulan container görüntüsü de dahil olmak üzere işlev derleme işleminin sonuçları ve dağıtılan işlevin her örneği.
- Dahili etkinlik aktarım kanalları için bekleyen veriler (yalnızca 1. nesil).
Hangi verilerin şifrelendiği hakkında daha fazla bilgiyi Cloud Functions CMEK belgelerinde bulabilirsiniz.
Ne 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, demo amacıyla herkese açık bir Cloud Function (kimlik doğrulama gerektirmeyen) kullanır. Kimliği doğrulanmış bir CMEK özellikli işlevi, kimlik doğrulaması gerektiren diğer Cloud Functions işlevleri gibi başlatabilirsiniz.
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ş yapmış olmanız gerekir.
- Daha önce HTTP tetiklemeli bir Cloud Functions işlevi dağıtmış olmanı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 'i
tıklayın.

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.
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ğinizin doğrulandığını onaylamak için Cloud Shell'de şu 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>
Değilse şu 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şturma
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çeren 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, Cloud KMS'deki yeni anahtarlığınızda simetrik bir 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, Artifact Registry'de CMEK'nin etkin olduğu Docker biçimli bir depo oluşturacaksınız. Bu anahtar, Cloud Function'ınızı dağıtmak için kullanılan anahtarla aynı olacaktır.
Öncelikle Artifact Registry için hizmet hesabına ihtiyacınız vardır. Bu komutu çalıştırarak oluşturabilirsiniz:
gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID
Anahtara izin 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, rolü yapay eser kayıt defterinde depo oluşturacak asıl kullanıcıya (ör. şu anda etkin olan hesabınız) verin. gcloud auth list komutunu ç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 özellikli, Docker biçimli bir depo oluşturabilirsiniz.
Bölgenin, CMEK anahtarıyla aynı bölge olması gerektiğini unutmayın.
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
Aşağıdaki 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 (2. nesil) erişim izni verme
Bu bölümde, 2. nesil işlevler için hizmet hesabı oluşturma konusu ele alınmaktadır. 1. nesil bir işlev oluşturuyorsanız lütfen sonraki bölüme geçin.
CryptoKey Encrypter/Decrypter IAM rolünü (roles/cloudkms.cryptoKeyEncrypterDecrypter) vererek çeşitli hizmet aracılarının anahtara erişmesine izin vermeniz gerekir. Bu hizmet aracıları, Cloud Storage'da depolanan kaynak koduna erişmek, işlev resimlerini Artifact Registry'deki CMEK ile korunan bir depoya kaydetmek 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ının anahtara erişmesine izin 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şturulup 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 hesabı oluşturma konusu ele alınmaktadır. Daha önce 2. nesil bir işlev için hizmet hesapları oluşturduysanız lütfen bir sonraki bölüme geçin.
CryptoKey Encrypter/Decrypter IAM rolünü (roles/cloudkms.cryptoKeyEncrypterDecrypter) vererek çeşitli hizmet aracılarının anahtara erişmesine izin vermeniz gerekir. Bu hizmet aracıları, Cloud Storage'da depolanan kaynak koduna erişmek, işlev resimlerini Artifact Registry'deki CMEK ile korunan bir depoya kaydetmek ve CMEK ile şifrelenmiş bir Cloud Function'ı 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ının anahtara erişmesine izin 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şturulup dağıtılacağını göreceksiniz.
7. CMEK ile şifrelenmiş bir işlev (2. nesil) oluşturma
Bu bölümde 2. nesil işlevlerin oluşturulması ele alınmaktadır. 1. nesil cihazlarla ilgili talimatlar için bir sonraki bölüme geçebilirsiniz.
CMEK'nin etkinleştirildiği bir Artifact Registry deposunu yapılandırdığınıza ve Cloud Functions'a anahtarınıza erişim izni verdiğinize göre artık CMEK anahtarınız kullanılarak şifrelenmiş bir işlev dağıtabilirsiniz.
2. nesil İşlevler için adımlar:
İşlevin kaynak kodunu oluşturma
Bu codelab'de Node.js kullanılsa da desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.
Öncelikle bir dizin oluşturun ve 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 şifrelemesini kullanarak 2. nesil Cloud Functions işlevini 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 sonuçtaki çıktıda CMEK anahtarını görebilirsiniz.
gcloud functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName
2. nesil işlevi test etme
İşlevinizi curl komutuyla 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ı yanıtını döndürür. Ancak şifreleme anahtarı devre dışı bırakıldığında arayan kişi 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şlevlerin oluşturulması ele alınmaktadır. 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 deposunu yapılandırdığınıza ve Cloud Functions'a anahtarınıza erişim izni verdiğinize göre artık CMEK anahtarınız kullanılarak şifrelenmiş bir işlev dağıtabilirsiniz.
1. nesil İşlevler için adımlar:
1. nesil işlevin kaynak kodunu oluşturma
Bu codelab'de Node.js kullanılsa da desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.
Öncelikle bir dizin oluşturun ve bu dizine gidin.
mkdir ~/cmek-function-1stgen && cd $_
Ardından, 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, 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 sonuçtaki çıktıda CMEK anahtarını görebilirsiniz.
gcloud functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName
1. nesil işlevi test etme
İşlevinizi curl komutuyla 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ı yanıtını döndürür. Ancak şifreleme anahtarı devre dışı bırakıldığında arayan kişi 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.
9. Şifreleme anahtarının devre dışı bırakıldığı CMEK ile şifrelenmiş bir işlevi çağırma
Bu son bölümde, anahtarı geçersiz kılacak ve sonuçtaki hatayı görmek için işlevi tekrar çağıracaksınız.
Şifreleme anahtarını devre dışı bırakma
Bu komutu çalıştırarak anahtarı devre dışı bırakabilirsiniz. Bu codelab'de yalnızca anahtarın bir sürümü oluşturulduğu için 1. sürümü devre dışı bırakacaksınız.
gcloud kms keys versions disable 1 \
--key=$KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION
ve sonuçtaki bilgileri görmeniz gerekir:
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
İşlevi devre dışı bırakılmış bir anahtarla çağırma
Şimdi işlevi tekrar curl.
curl $FUNCTION_URL
ve bu kez Hello World yanıtı almazsınız.
Cloud Function 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ışmak
Bu bölümde, CMEK anahtarı devre dışı bırakıldığında aşağıdaki kaynakların kullanılamaz hale geldiğini görürsünüz:
- İşlev kaynak kodu
- Kaynak kodunuzdan oluşturulan kapsayıcı görüntüsü
Örneğin, Cloud Functions işlevinin Kaynak sekmesini ziyaret ettiğinizde arşiv getirilirken bir hata gösterilir. Kaynak kodunu 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'den işlev için kapsayıcı görüntüsünü kullanmaya erişemezsiniz. Örneğin, bu container görüntüsünü Cloud Run'a dağıtmaya çalışırsanız görüntünün bulunamadığına dair bir hata alırsınız.
Şifrelenmiş kaynakların tam listesi için lütfen CMEK İşlevleri belgelerine bakın.
10. Tebrikler
Tebrikler, codelab'i tamamladınız.
İşlediğimiz konular
- Mevcut bir simetrik anahtarlıkta CMEK anahtarı oluşturma
- Artifact Registry deposu oluşturma
- Cloud Functions'da CMEK'yi yapılandırma
Daha fazla bilgi
Cloud Functions ve CMEK hakkında daha fazla bilgiyi aşağıdaki bağlantılarda bulabilirsiniz: