تشفير دوال السحابة باستخدام مفاتيح التشفير المُدارة من العميل (CMEK)

1. مقدمة

نظرة عامة

Cloud Functions هي حلّ حوسبة خفيف يتيح للمطوّرين إنشاء وظائف مستقلة لغرض واحد تستجيب لأحداث السحابة الإلكترونية بدون الحاجة إلى إدارة خادم أو بيئة وقت تشغيل.

يمكنك استخدام مفاتيح التشفير المُدارة للعميل (CMEK) في "خدمة إدارة المفاتيح في السحابة الإلكترونية" لحماية دوال Cloud والبيانات ذات الصلة غير النشِطة. يؤدي نشر دالة باستخدام CMEK إلى حماية البيانات المرتبطة بها باستخدام مفتاح تشفير في وضع التحكم الكامل. ويسمح لك هذا النوع من التشفير بتلبية متطلبات الامتثال في مجالات معيّنة، مثل الخدمات المالية. بما أنّ المفتاح ملك لك ولا تتحكم فيه Google، لا يمكن لأي شخص (بما في ذلك أنت) الوصول إلى البيانات المحمية بمفاتيح التشفير هذه عند إيقاف المفاتيح أو إتلافها.

بالنسبة إلى دوال السحابة، يُشفِّر CMEK ما يلي:

  • رمز مصدر الدالة، والذي تم تحميله للنشر وتخزينه من قِبل Google في Cloud Storage، ويستخدم في عملية التصميم
  • نتائج عملية إنشاء الدالة، بما في ذلك صورة الحاوية التي تم إنشاؤها من رمز مصدر الدالة، وكل مثيل للدالة التي تم نشرها.
  • بيانات حالات عدم النشاط لقنوات نقل الأحداث الداخلية (الجيل الأول فقط)

يمكنك العثور على مزيد من المعلومات حول البيانات التي يتم تشفيرها في مستندات CMEK لدالة Cloud.

ما الذي ستقوم ببنائه

يعرض هذا الدرس التطبيقي حول الترميز كيفية نشر دالة Cloud (إما من الجيل الأول أو الجيل الثاني) مشفّرة باستخدام CMEK. يستخدم هذا الدرس التطبيقي حول الترميز وظيفة السحابة الإلكترونية العامة، أي تلك التي لا تتطلب المصادقة، لأغراض العرض التوضيحي. ويمكنك استدعاء دالة مُفعّلة بتقنية CMEK تمت مصادقتها تمامًا مثل أي وظيفة سحابية أخرى تتطلب المصادقة.

ما ستتعرَّف عليه

  • كيفية إنشاء مفتاح CMEK على سلسلة مفاتيح متماثلة حالية
  • طريقة إنشاء مستودع Artifact Registry
  • كيفية ضبط مفاتيح التشفير المُدارة (CMEK) في دالة Cloud لكل من الجيل الأول والثاني

2. الإعداد والمتطلبات

المتطلبات الأساسية

  • تم تسجيل دخولك إلى Cloud Console
  • سبق لك نشر دالة السحابة الإلكترونية التي تشغِّل HTTP (للتحقق من تفعيل الأدوار وواجهات برمجة التطبيقات المناسبة لديك)

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة تصف ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

9c92662c6a846a5c.png

من المفترَض أن تستغرق عملية توفير المتطلبات اللازمة والاتصال بخدمة Cloud Shell بضع دقائق فقط.

9f0e51b578fecce5.png

يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير اللازمة. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح.

بعد الربط بخدمة Cloud Shell، من المفترض أن تتأكّد من أنّه تمّت مصادقتك وأنّ المشروع مضبوط على رقم تعريف مشروعك.

  1. شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list

مخرجات الأمر

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. شغّل الأمر التالي في Cloud Shell للتأكد من معرفة الأمر gcloud بمشروعك:
gcloud config list project

مخرجات الأمر

[core]
project = <PROJECT_ID>

إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:

gcloud config set project <PROJECT_ID>

مخرجات الأمر

Updated property [core/project].

3- إنشاء سلسلة مفاتيح جديدة ومفتاح جديد لـ Cloud Functions

تأكَّد من تفعيل Cloud KMS API من خلال تنفيذ الأمر التالي:

gcloud services enable cloudkms.googleapis.com

أولاً، أنشِئ متغيّرات للبيئة تتضمّن اسم حلقة المفاتيح واسم المفتاح والمنطقة وغيرها من المتغيرات المستخدَمة في هذا الدرس التطبيقي حول الترميز.

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

بعد ذلك، أنشِئ سلسلة مفاتيح، وهي المصدر الجذري لمفاتيح Cloud KMS والإصدارات الرئيسية.

gcloud kms keyrings create $KEYRING_NAME --location $REGION

أخيرًا، يمكنك الآن إنشاء مفتاح متماثل في حلقة المفاتيح الجديدة ضمن Cloud KMS.

gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"

4. إنشاء مستودع Artifact Registry متوافق مع Docker

في هذا القسم، ستنشئ مستودعًا بتنسيق Docker في Artifact Registry وتفعيل بروتوكول CMEK. وسيكون هذا المفتاح هو المفتاح نفسه المستخدَم لنشر دالة Cloud.

أولاً، ستحتاج إلى حساب الخدمة لـ Artifact Registry. يمكنك إنشاء الملف من خلال تنفيذ الأمر التالي:

gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID

استخدِم الأمر التالي لمنح دور إدارة الهوية وإمكانية الوصول (IAM) في CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) لحساب خدمة Artifact Registry للحصول على أذونات المفتاح:

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

وامنح الدور للمبدأ الذي سينشئ المستودع في سجلّ الأدوات، على سبيل المثال. لحسابك الحالي النشط يمكنك إثبات ملكية حسابك النشط الحالي من خلال تشغيل قائمة مصادقة gcloud.

gcloud kms keys add-iam-policy-binding \
       $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \
       --member user:$USER_EMAIL \
       --role roles/cloudkms.cryptoKeyEncrypterDecrypter

يمكنك الآن إنشاء مستودع بتنسيق Docker يمكن تفعيل CMEK فيه.

ملاحظة: يجب أن تكون المنطقة هي نفسها منطقة مفتاح CMEK.

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

يمكنك الاطّلاع على مستودع Artifact Registry الجديد من خلال تنفيذ الأمر التالي:

gcloud artifacts repositories describe $REPO_NAME --location=$REGION

5- منح حسابات الخدمة إذن الوصول إلى المفتاح (الجيل الثاني)

يتناول هذا القسم إنشاء حسابات الخدمة لوظائف الجيل الثاني. إذا كنت تريد إنشاء دالة من الجيل الأول، يُرجى الانتقال إلى القسم التالي.

يجب منح العديد من وكلاء الخدمة إذن الوصول إلى المفتاح من خلال منح دور إدارة الهوية وإمكانية الوصول (IAM) في CryptoKey Encrypter/Decryter (roles/cloudkms.cryptoKeyEncrypterDecrypter). ويتم استخدام برامج وكلاء الخدمة هؤلاء للحصول على إمكانية الوصول إلى رمز المصدر المُخزَّن في Cloud Storage، وتخزين صور الوظائف في مستودع محمي بمفاتيح التشفير المُدارة للعميل (CMEK) في Artifact Registry، واستخدام دالة سحابة إلكترونية مُشفَّرة بترميز CMEK.

خطوات لدوال الجيل الثاني

  1. امنح وكيل خدمة Cloud Run إذن الوصول إلى المفتاح:
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 إذن الوصول إلى المفتاح:
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 الإذن بالوصول إلى المفتاح:
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 إذن الوصول إلى المفتاح:
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

في القسم التالي، ستطلع على كيفية إنشاء دالة مشفّرة ببروتوكول CMEK ونشرها.

6- منح حسابات الخدمة إذن الوصول إلى المفتاح (الجيل الأول)

يتناول هذا القسم إنشاء حسابات الخدمة لوظائف الجيل الأول. إذا سبق لك إنشاء حسابات خدمة لوظيفة من الجيل الثاني، يُرجى المتابعة إلى القسم التالي.

يجب منح العديد من وكلاء الخدمة إذن الوصول إلى المفتاح من خلال منح دور إدارة الهوية وإمكانية الوصول (IAM) في CryptoKey Encrypter/Decryter (roles/cloudkms.cryptoKeyEncrypterDecrypter). ويتم استخدام برامج وكلاء الخدمة هؤلاء للحصول على إمكانية الوصول إلى رمز المصدر المُخزَّن في Cloud Storage، وتخزين صور الوظائف في مستودع محمي بمفاتيح التشفير المُدارة للعميل (CMEK) في Artifact Registry، واستخدام دالة سحابة إلكترونية مُشفَّرة بترميز CMEK.

خطوات لدوال الجيل الأول

  1. امنح وكيل خدمة Cloud Functions إذن الوصول إلى المفتاح:
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 الإذن بالوصول إلى المفتاح:
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 إذن الوصول إلى المفتاح:
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

في القسم التالي، ستطلع على كيفية إنشاء دالة مشفّرة ببروتوكول CMEK ونشرها.

7. إنشاء دالة مشفَّرة بمفاتيح التشفير CMEK (الجيل الثاني)

يتناول هذا القسم إنشاء دوال الجيل الثاني. يمكنك الانتقال إلى القسم التالي للاطّلاع على تعليمات الجيل الأول.

بعد أن أصبح لديك مستودع Artifact Registry تم فيه تفعيل CMEK ومنحت دوال Cloud إمكانية الوصول إلى مفتاحك، يمكنك الآن تفعيل دالة مشفّرة باستخدام مفتاح CMEK الخاص بك.

خطوات لدوال الجيل الثاني:

إنشاء رمز المصدر للدالة

مع أنّ هذا الدرس التطبيقي حول الترميز يستخدم Node.js، يمكنك استخدام أي وقت تشغيل متوافق.

أولاً، أنشئ دليلاً وقرصًا مضغوطًا في هذا الدليل.

mkdir ~/cmek-function-2ndgen && cd $_

ثم أنشئ ملف package.json.

touch package.json

echo '{
  "dependencies": {
    "@google-cloud/functions-framework": "^2.1.0"
  }
}
' > package.json

بعد ذلك، أنشئ ملف المصدر index.js.

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)

ملاحظة: يوضح المثال أدناه كيفية نشر دالة باستخدام مصادر من الدليل الحالي. تأكد من أنك في نفس الدليل الذي يوجد فيه رمز المصدر للدالة.

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

يمكنك الاطّلاع على مفتاح CMEK من الإخراج الناتج من خلال تنفيذ هذا الأمر.

تصف دوال gcloud $FUNCTION_NAME –المنطقة $region | grep kmsKeyName

اختبار دالة الجيل الثاني

يمكنك اختبار الدالة عن طريق التجعيد بها:

FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')"

curl $FUNCTION_URL

وينتج عن ذلك ما يلي:

Hello World!

طالما تم تفعيل مفتاح التشفير، ستعود الدالة بنجاح إلى المتصل. ومع ذلك، بعد إيقاف مفتاح التشفير، سيتلقى المتصل رسالة خطأ.

في القسم التالي، سترى ما يحدث عند استدعاء الدالة بعد إيقاف المفتاح.

8. إنشاء دالة مشفَّرة بمفاتيح التشفير CMEK (الجيل الأول)

يتناول هذا القسم إنشاء دوال الجيل الأول. إذا سبق لك إنشاء دالة من الجيل الثاني، يُرجى الانتقال إلى القسم التالي.

بعد أن أصبح لديك مستودع Artifact Registry تم فيه تفعيل CMEK ومنحت دوال Cloud إمكانية الوصول إلى مفتاحك، يمكنك الآن تفعيل دالة مشفّرة باستخدام مفتاح CMEK الخاص بك.

خطوات لدوال الجيل الأول:

إنشاء رمز المصدر لدالة الجيل الأول

مع أنّ هذا الدرس التطبيقي حول الترميز يستخدم Node.js، يمكنك استخدام أي وقت تشغيل متوافق.

أولاً، أنشئ دليلاً وقرصًا مضغوطًا في هذا الدليل.

mkdir ~/cmek-function-1stgen && cd $_

بعد ذلك، أنشئ ملف package.json.

touch package.json

echo '{
    "name": "function-cmek-codelab",
    "version": "0.0.1"
}' > package.json

بعد ذلك، أنشئ ملف المصدر index.js.

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

نشر الجيل الأول من دالة Cloud باستخدام تشفير CMEK

ملاحظة: يوضح المثال أدناه كيفية نشر دالة باستخدام مصادر من الدليل الحالي. تأكد من أنك في نفس الدليل الذي يوجد فيه رمز المصدر للدالة.

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

يمكنك الاطّلاع على مفتاح CMEK من الإخراج الناتج من خلال تنفيذ هذا الأمر.

تصف دوال gcloud $FUNCTION_NAME –المنطقة $region | grep kmsKeyName

اختبار دالة الجيل الأول

يمكنك اختبار الدالة عن طريق التجعيد بها:

FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(httpsTrigger.url)')"

curl $FUNCTION_URL

وينتج عن ذلك ما يلي:

Hello World!

طالما تم تفعيل مفتاح التشفير، ستعود الدالة بنجاح إلى المتصل. ومع ذلك، بعد إيقاف مفتاح التشفير، سيتلقى المتصل رسالة خطأ.

في القسم التالي، سترى ما يحدث عند استدعاء الدالة بعد إيقاف المفتاح.

9. استدعاء دالة مشفرة ببروتوكول CMEK حيث تم إيقاف مفتاح التشفير

في هذا القسم الأخير، سيتم إلغاء المفتاح واستدعاء الدالة مرة أخرى لرؤية الخطأ الناتج.

إيقاف مفتاح التشفير

ويمكنك تشغيل هذا الأمر لإيقاف المفتاح. بما أنّ هذا الدرس التطبيقي ينشئ نسخة واحدة فقط من المفتاح، عليك إيقاف الإصدار 1.

gcloud kms keys versions disable 1 \
    --key=$KEY_NAME \
    --keyring=$KEYRING_NAME \
    --location=$REGION

ومن المفترض أن تظهر لك المعلومات الناتجة عن ذلك:

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

استدعاء الدالة باستخدام مفتاح غير مفعّل

الآن curl الدالة مرة أخرى.

curl $FUNCTION_URL

ولن تتلقى ردًا على مرحبًا بالعالم هذه المرة.

في سجلات دالة Cloud، سترى

User's CMEK key has been disabled. CMEK key: projects/<PROJECT-NAME>/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function

محاولة عرض الموارد عند إيقاف مفتاح CMEK

في هذا القسم، ستظهر لك الموارد التالية غير متاحة عند إيقاف مفتاح CMEK:

  • رمز مصدر الدالة
  • نسخة صورة الحاوية من رمز المصدر

على سبيل المثال، يؤدي الانتقال إلى علامة التبويب "المصدر" لدالة السحابة الإلكترونية إلى عرض خطأ أثناء جلب الأرشيف. وسيظهر لك خطأ مشابه إذا حاولت عرض ملف .zip الذي يحتوي على رمز المصدر مباشرةً في Cloud Storage.

ac3307bb05d30e19.png

بالإضافة إلى ذلك، لن يكون لديك الإذن بالوصول لاستخدام صورة الحاوية للدالة من Artifact Registry. على سبيل المثال، إذا حاولت نشر صورة الحاوية هذه في تشغيل السحابة الإلكترونية، ستتلقى رسالة خطأ تفيد بعدم العثور على الصورة.

يُرجى الاطّلاع على مستندات وظائف CMEK للحصول على قائمة كاملة بالموارد المشفّرة.

10. تهانينا

تهانينا، لقد أنهيت الدرس التطبيقي حول الترميز.

المواضيع التي تناولناها

  • كيفية إنشاء مفتاح CMEK على سلسلة مفاتيح متماثلة حالية
  • طريقة إنشاء مستودع Artifact Registry
  • كيفية ضبط مفاتيح التشفير المُدارة (CMEK) في دالة سحابة إلكترونية

لمزيد من المعلومات

يمكنك العثور على مزيد من المعلومات حول دوال Cloud وCMEK في الروابط التالية: