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

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

  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. إنشاء مستودع بتنسيق 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"

  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. منح حسابات الخدمة إذن الوصول إلى المفتاح (الجيل الأول)

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

يجب منح العديد من وكلاء الخدمة إذن الوصول إلى المفتاح من خلال منح دور CryptoKey Encrypter/Decrypter في "إدارة الهوية وإمكانية الوصول" (roles/cloudkms.cryptoKeyEncrypterDecrypter). يتم استخدام وكلاء الخدمة هؤلاء للوصول إلى رمز المصدر المخزّن في Cloud Storage، وتخزين صور الدوال في مستودع محمي بواسطة مفتاح التشفير المُدار من العميل (CMEK) في Artifact Registry، ونشر دالة Cloud Function مشفّرة باستخدام مفتاح 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. إنشاء دالة مشفّرة باستخدام مفتاح تشفير يديره العميل (الجيل الثاني)

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

بعد إعداد مستودع 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.

ac3307bb05d30e19.png

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

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

10. تهانينا

تهانينا، لقد أكملت درس البرمجة.

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

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

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

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