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

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i 853e55310c205094.png 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 ekran gösterildiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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.

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

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

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

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

ac3307bb05d30e19.png

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: