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

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

  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 Cloud Shell'in ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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.

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

  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 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
  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ş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

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

ac3307bb05d30e19.png

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: