Cloud Functions'ı Müşteri Tarafından Yönetilen Şifreleme Anahtarlarını (CMEK) kullanarak şifreleme

Müşteri Tarafından Yönetilen Şifreleme Anahtarlarını (CMEK) kullanarak Cloud Functions'ı şifreleme

Bu codelab hakkında

subjectSon güncelleme May 22, 2023
account_circleBir Google çalışanı tarafından yazılmıştır

1. Giriş

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

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini tıklayın.

55efc1aaa7a4d3ad.png

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.

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

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.

  1. 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`
  1. 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

  1. 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
  1. 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
  1. 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
  1. 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

  1. 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
  1. 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
  1. 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.

ac3307bb05d30e19.png

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: