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

1. مقدمة

نظرة عامة

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

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

بالنسبة إلى Cloud Functions، تشفِّر ميزة "إدارة مفاتيح التشفير من جهة العميل" ما يلي:

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

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

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

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

المُعطيات

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

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

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

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

تفعيل Cloud Shell

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

55efc1aaa7a4d3ad.png

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

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 الذي تم تفعيل ميزة "إدارة مفاتيح التشفير من جهة العميل" فيه. سيكون هذا المفتاح هو المفتاح نفسه المستخدَم لنشر Cloud Function.

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

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

استخدِم الأمر التالي لمنح دور إدارة الهوية وإمكانية الوصول (IAM) لمشفِّر/أداة فك تشفير مفتاح التشفير (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 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 مُفعَّل فيه "مفتاح إدارة المفاتيح" (CMK).

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

في القسم التالي، ستتعرّف على كيفية إنشاء دالة مشفّرة باستخدام مفتاح تشفير إدارة الخدمات (CMK) ونشرها.

7- إنشاء دالة مشفَّرة باستخدام مفتاح تشفير مشترَك (الجيل الثاني)

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

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

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

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

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

أولاً، أنشئ دليلاً وانتقل إليه باستخدام الأمر cd.

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 من الجيل الثاني باستخدام تشفير 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 functions describe $FUNCTION_NAME –region $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، يمكنك استخدام أي وقت تشغيل متوافق.

أولاً، أنشئ دليلاً وانتقل إليه باستخدام الأمر cd.

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 functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName

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

يمكنك اختبار الدالة من خلال طيّها:

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

curl $FUNCTION_URL

ما يؤدّي إلى ما يلي:

Hello World!

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

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

9. استدعاء دالة مشفّرة باستخدام "التشفير الذي يديره العميل" (CMK) تم إيقاف مفتاح التشفير فيها

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

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

ويمكنك تنفيذ هذا الأمر لإيقاف المفتاح. بما أنّ هذا الدرس التطبيقي حول الترميز ينشئ إصدارًا واحدًا فقط من المفتاح، عليك إيقاف الإصدار 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:

  • رمز مصدر الدالة
  • إنشاء صورة حاوية من رمز المصدر

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

ac3307bb05d30e19.png

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

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

10. تهانينا

تهانينا، لقد أكملت دورة codelab.

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

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

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

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