1. مقدمة
نظرة عامة
Cloud Functions هو حلّ حوسبة خفيف الوزن يتيح للمطوّرين إنشاء وظائف مستقلة ذات غرض واحد تستجيب لأحداث Cloud بدون الحاجة إلى إدارة خادم أو بيئة وقت تشغيل.
يمكنك استخدام مفاتيح التشفير التي يديرها العميل (CMEK) في Cloud Key Management Service لحماية Cloud Functions والبيانات الثابتة ذات الصلة. يؤدي نشر دالة باستخدام مفتاح CMEK إلى حماية البيانات المرتبطة بها من خلال استخدام مفتاح تشفير يمكنك التحكّم فيه بشكل كامل. يتيح لك هذا النوع من التشفير استيفاء متطلبات الامتثال في مجالات معيّنة، مثل الخدمات المالية. بما أنّك تملك المفتاح ولا تتحكّم فيه Google، لن يتمكّن أحد (بما في ذلك أنت) من الوصول إلى البيانات المحمية بمفاتيح التشفير هذه عند إيقاف المفاتيح أو إتلافها.
بالنسبة إلى Cloud Functions، تشفّر مفاتيح إدارة التشفير التي تقدّمها العميل ما يلي:
- رمز مصدر الدالة الذي تم تحميله للنشر وخزّنته Google في Cloud Storage، ويتم استخدامه في عملية التصميم.
- نتائج عملية إنشاء الدالة، بما في ذلك صورة الحاوية التي تم إنشاؤها من رمز مصدر الدالة، وكل مثيل من الدالة التي تم نشرها
- البيانات غير النشطة لقنوات نقل الأحداث الداخلية (الجيل الأول فقط)
يمكنك الاطّلاع على مزيد من المعلومات حول البيانات التي يتم تشفيرها في مستندات CMEK الخاصة بـ Cloud Function.
ما ستنشئه
يوضّح هذا الدرس التطبيقي حول الترميز كيفية تفعيل دالة Cloud Function (الجيل الأول أو الثاني) يتم تشفيرها باستخدام مفتاح التشفير المُدارة من قِبل العميل (CMEK). يستخدم هذا الدرس البرمجي العملي إحدى دوال Cloud العامة، أي تلك التي لا تتطلّب مصادقة، وذلك لأغراض العرض التوضيحي. يمكنك استدعاء دالة مفعَّلة باستخدام CMEK ومصادقة تمامًا مثل أي دالة Cloud أخرى تتطلّب المصادقة.
أهداف الدورة التعليمية
- كيفية إنشاء مفتاح CMEK على سلسلة مفاتيح متماثلة حالية
- كيفية إنشاء مستودع Artifact Registry
- كيفية ضبط مفتاح التشفير المُدارة من العميل (CMEK) على دالة Cloud Function لكلّ من الجيل الأول والثاني
2. الإعداد والمتطلبات
المتطلبات الأساسية
- تسجيل الدخول إلى Cloud Console
- سبق لك نشر Cloud Function يتم تشغيلها بواسطة HTTP (للتحقّق من أنّ لديك الأدوار وواجهات برمجة التطبيقات المناسبة مفعّلة)
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.

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

يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.

يتم تحميل هذا الجهاز الافتراضي بجميع أدوات التطوير اللازمة. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إنجاز معظم عملك في هذا الدرس التطبيقي حول الترميز، إن لم يكن كله، باستخدام متصفح.
بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تم إثبات هويتك وأنّه تم ضبط المشروع على رقم تعريف مشروعك.
- نفِّذ الأمر التالي في 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`
- نفِّذ الأمر التالي في 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. إنشاء مستودع بتنسيق Docker في Artifact Registry ومفعّل فيه مفتاح التشفير الذي يديره العميل (CMEK)
في هذا القسم، ستنشئ مستودعًا بتنسيق Docker في Artifact Registry مع تفعيل مفتاح التشفير المُدارة من العميل (CMEK). سيكون هذا المفتاح هو المفتاح نفسه المستخدَم لنشر Cloud Function.
عليك أولاً الحصول على حساب الخدمة في Artifact Registry. يمكنك إنشاء هذا الملف من خلال تنفيذ الأمر التالي:
gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID
استخدِم الأمر التالي لمنح دور 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
وامنح الدور للمدير الذي سينشئ المستودع في Artifact Registry، مثل حسابك النشط الحالي. يمكنك التحقّق من حسابك النشط الحالي من خلال تنفيذ الأمر gcloud auth list.
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- منح حسابات الخدمة إذن الوصول إلى المفتاح (الجيل الثاني)
يتناول هذا القسم إنشاء حسابات خدمة للجيل الثاني من الدوال. إذا كنت بصدد إنشاء دالة من الجيل الأول، يُرجى الانتقال إلى القسم التالي.
يجب منح العديد من وكلاء الخدمة إذن الوصول إلى المفتاح من خلال منح دور CryptoKey Encrypter/Decrypter في "إدارة الهوية وإمكانية الوصول" (roles/cloudkms.cryptoKeyEncrypterDecrypter). يتم استخدام وكلاء الخدمة هؤلاء للوصول إلى رمز المصدر المخزّن في Cloud Storage، وتخزين صور الدوال في مستودع محمي بواسطة مفتاح التشفير المُدار من العميل (CMEK) في Artifact Registry، ونشر دالة Cloud Function مشفّرة باستخدام مفتاح CMEK.
خطوات استخدام الجيل الثاني من "دوال Firebase"
- امنح وكيل خدمة 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
- امنح وكيل خدمة 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
- امنح وكيل خدمة 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
- امنح وكلاء خدمة 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. منح حسابات الخدمة إذن الوصول إلى المفتاح (الجيل الأول)
يتناول هذا القسم إنشاء حسابات خدمة للجيل الأول من الدوال. إذا سبق لك إنشاء حسابات خدمة لوظيفة من الجيل الثاني، يُرجى الانتقال إلى القسم التالي.
يجب منح العديد من وكلاء الخدمة إذن الوصول إلى المفتاح من خلال منح دور CryptoKey Encrypter/Decrypter في "إدارة الهوية وإمكانية الوصول" (roles/cloudkms.cryptoKeyEncrypterDecrypter). يتم استخدام وكلاء الخدمة هؤلاء للوصول إلى رمز المصدر المخزّن في Cloud Storage، وتخزين صور الدوال في مستودع محمي بواسطة مفتاح التشفير المُدار من العميل (CMEK) في Artifact Registry، ونشر دالة Cloud Function مشفّرة باستخدام مفتاح CMEK.
خطوات استخدام الجيل الأول من "دوال السحابة"
- امنح حساب خدمة 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
- امنح وكيل خدمة 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
- امنح وكلاء خدمة 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. إنشاء دالة مشفّرة باستخدام مفتاح تشفير يديره العميل (الجيل الثاني)
يتناول هذا القسم كيفية إنشاء دوال من الجيل الثاني. يمكنك الانتقال إلى القسم التالي للاطّلاع على تعليمات الجيل الأول.
بعد إعداد مستودع Artifact Registry مع تفعيل CMEK ومنح Cloud Functions إذن الوصول إلى مفتاحك، يمكنك الآن نشر دالة مشفّرة باستخدام مفتاح CMEK.
خطوات استخدام الجيل الثاني من "دوال Google":
إنشاء رمز المصدر للدالة
على الرغم من أنّ هذا الدرس التطبيقي حول الترميز يستخدم 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
نشر الجيل الثاني من Cloud Functions باستخدام التشفير الذي يديره العميل
ملاحظة: يوضّح المثال أدناه كيفية نشر دالة باستخدام مصادر من دليلك الحالي. تأكَّد من أنّك في الدليل نفسه الذي يتضمّن الرمز المصدر للدالة.
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 functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName
اختبار الجيل الثاني من الدالة
يمكنك اختبار الدالة من خلال تنفيذ الأمر curl التالي:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')" curl $FUNCTION_URL
ما يؤدي إلى ما يلي:
Hello World!
طالما أنّ مفتاح التشفير مفعّل، ستعرض الدالة "ناجح" للمتصل. ومع ذلك، بعد إيقاف مفتاح التشفير، سيتلقّى المتصل رسالة خطأ.
في القسم التالي، ستتعرّف على ما يحدث عند استدعاء الدالة بعد إيقاف المفتاح.
8. إنشاء دالة (الجيل الأول) مشفّرة باستخدام مفتاح تشفير يديره العميل
يتناول هذا القسم كيفية إنشاء دوال من الجيل الأول. إذا سبق لك إنشاء دالة من الجيل الثاني، يُرجى الانتقال إلى القسم التالي.
بعد إعداد مستودع Artifact Registry مع تفعيل CMEK ومنح Cloud Functions إذن الوصول إلى مفتاحك، يمكنك الآن نشر دالة مشفّرة باستخدام مفتاح CMEK.
خطوات استخدام الجيل الأول من "دوال Google":
إنشاء رمز المصدر للدالة من الجيل الأول
على الرغم من أنّ هذا الدرس التطبيقي حول الترميز يستخدم 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 Functions باستخدام التشفير الذي يديره العميل
ملاحظة: يوضّح المثال أدناه كيفية نشر دالة باستخدام مصادر من دليلك الحالي. تأكَّد من أنّك في الدليل نفسه الذي يتضمّن الرمز المصدر للدالة.
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 functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName
اختبار الجيل الأول من الدالة
يمكنك اختبار الدالة من خلال تنفيذ الأمر curl التالي:
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
ولن تتلقّى ردًا من Hello World هذه المرة.
في سجلّات Cloud Function، سيظهر لك
User's CMEK key has been disabled. CMEK key: projects/<PROJECT-NAME>/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function
محاولة عرض الموارد عندما يكون مفتاح CMEK غير مفعّل
في هذا القسم، ستلاحظ أنّ الموارد التالية تصبح غير متاحة عند إيقاف مفتاح CMEK:
- رمز المصدر للدالة
- إنشاء صورة حاوية من رمز المصدر
على سبيل المثال، يؤدي الانتقال إلى علامة التبويب "المصدر" في Cloud Function إلى ظهور خطأ أثناء جلب الأرشيف. سيظهر لك خطأ مشابه إذا حاولت عرض ملف .zip الذي يحتوي على رمز المصدر مباشرةً في Cloud Storage.

بالإضافة إلى ذلك، لن يكون بإمكانك استخدام صورة الحاوية للدالة من Artifact Registry. على سبيل المثال، إذا حاولت نشر صورة الحاوية هذه على Cloud Run، ستتلقّى رسالة خطأ تفيد بأنّه لم يتم العثور على الصورة.
يُرجى الرجوع إلى مستندات "وظائف إدارة مفاتيح التشفير التي يديرها العميل" للحصول على قائمة كاملة بالموارد المشفّرة.
10. تهانينا
تهانينا، لقد أكملت درس البرمجة.
المواضيع التي تناولناها
- كيفية إنشاء مفتاح CMEK على سلسلة مفاتيح متماثلة حالية
- كيفية إنشاء مستودع Artifact Registry
- كيفية ضبط CMEK على إحدى دوال Cloud
لمزيد من المعلومات
يمكنك العثور على مزيد من المعلومات حول Cloud Functions وCMEK في الروابط التالية: