درس تطبيقي حول ترميز صورة الحاوية الموقَّعة

1. نظرة عامة

يستند هذا الدرس التطبيقي حول الترميز إلى الدرس التطبيقي حول الترميز الخاص بالمساحة السرية. يتيح استخدام صور الحاويات الموقَّعة خيار مصادقة حاوية باستخدام مفتاح عام معتمَد بدلاً من تحديد خلاصة الصورة في سياسة Workload Identity Pool (مجموعة معرّفات أعباء العمل).

التغييرات التي طرأت على إتاحة استخدام صور الحاويات الموقَّعة في "المساحة السرية":

سهولة الاستخدام المحسّنة: من خلال تقديم ميزة صور الحاويات الموقَّعة، يمكننا الآن الانتقال من نهج ملخّص صورة "وحدة العمل" إلى نهج توقيع الحاوية للمتعاونين/المدققين الذين يمنحون الإذن باستخدام صورة.

  • عند استخدام ملخّصات الصور مباشرةً، على مالكي الموارد تعديل سياساتهم باستخدام ملخّص صور في كل مرة يمنحون فيها إذنًا باستخدام صورة جديدة. باستخدام توقيعات الصور، تحتوي السياسة على بصمة مفتاح عام يملك المفتاح الخاص المقابل له المتعاون/المدقق ويستخدمه لتوقيع الصور التي تم تدقيقها.
  • في بعض نماذج الأمان، يكون الرجوع إلى مفتاح توقيع صورة موثوق به أكثر ملاءمةً من تعديل قائمة بقيم ملخّص الصورة الجديدة.

عدم حدوث أي تراجع في مستوى الأمان: لن يؤدي نهج توقيع الحاوية هذا إلى أي تراجع في مستوى الأمان مقارنةً بالنهج السابق المستند إلى خلاصة الصورة، لأنّ حدود الثقة تظل كما هي. في نهج توقيع الحاوية، يمنح مالك المورد إذنًا بمفتاح إثبات الهوية من خلال تحديد بصمة المفتاح العام الموثوق به في سياسة WIP، وتتم عملية التحقّق من الإذن من خلال خدمة التحقّق من الإثبات وسياسة WIP. تتحقّق خدمة التحقّق من الإثبات من أنّ التوقيع مرتبط بحمولة العمل الجارية، وتتحقّق سياسة WIP من أنّ المفتاح العام الذي تؤكده الخدمة مفوَّض من خلال السياسة.

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

والفرق الوحيد بين هذين الأسلوبَين هو أنّ الأسلوب الأخير يستخدم طبقة إضافية من التوسّط حيث يتم تفويض صور "حمولة العمل" باستخدام مفتاح توقيع. ولا يؤدي ذلك إلى ظهور أي ثغرات أمنية جديدة لأنّ حدود الثقة تظل كما هي.

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

في هذا الدليل التعليمي حول الرموز البرمجية، ستتعرّف على كيفية استخدام توقيع صورة الحاوية لمنح الإذن بالوصول إلى الموارد المحمية:

  • كيفية توقيع صورة حاوية تم فحصها باستخدام cosign
  • كيفية تحميل توقيعات صور الحاويات إلى سجلات OCI لاكتشاف التوقيعات وتخزينها
  • كيفية ضبط موارد السحابة الإلكترونية اللازمة لتشغيل "المساحة السرية"
  • كيفية تشغيل سير العمل في "مساحة سرية" مع إتاحة استخدام صور الحاويات الموقَّعة

يوضّح لك هذا الدليل التعليمي كيفية استخدام Confidential Space لإثبات الهوية عن بُعد لصورة حاوية موقَّعة بمفتاح موثوق به يعمل على Google Compute Engine.

المتطلبات

الأدوار المعنيّة في "مساحة سرية" تتضمّن صورة حاوية موقَّعة

في هذا البرنامج التعليمي، سيكون بنك Primus هو المدقّق وصاحب الموارد، وسيكون مسؤولاً عن ما يلي:

  1. إعداد الموارد المطلوبة باستخدام بيانات نموذجية
  2. تدقيق رمز "حمل العمل"
  3. استخدام cosign لتوقيع صورة "حمولة العمل"
  4. تحميل التوقيع إلى مستودع
  5. ضبط سياسة "المحتوى في وضع التقدّم" لحماية بيانات العملاء

سيكون بنك Secundus هو مؤلف ومسؤول "عبء العمل"، وسيكون مسؤولاً عن ما يلي:

  1. إعداد الموارد المطلوبة لتخزين النتيجة
  2. كتابة رمز العمل المُحمَّل
  3. نشر صورة عبء العمل
  4. تشغيل حمولة العمل في "مساحة سرية" مع إتاحة استخدام صور الحاويات الموقَّعة

سيطوِّر بنك Secundus وينشر عبء عمل سيستخدِم طلب بحث لبيانات العملاء المخزّنة في حزمة تخزين على السحابة الإلكترونية والتي يملكها بنك Primus. سيتحقّق بنك Primus من حمولة العمل ويوقّع على صورة الحاوية ويضبط سياسات Workload Identity Pool للسماح بالوصول إلى بياناته من خلال عمليات التحميل الموافَق عليها. سيتم تخزين نتيجة تنفيذ هذه الحِزمة في حزمة تخزين على السحابة الإلكترونية يملكها بنك Secundus.

المراجع المُستخدَمة في إعداد "مساحة سرية"

يشير رمز هذا البرنامج التعليمي إلى عدد من المتغيّرات التي يجب ضبطها على قيم مناسبة لمشروعك على Google Cloud Platform. تفترض الأوامر الواردة في هذا الدليل التعليمي أنّه تم ضبط هذه المتغيّرات. (على سبيل المثال، يمكن استخدام export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket' لضبط اسم حزمة تخزين الإدخال الخاصة بمصرف Primus). إذا لم يتم ضبط متغيّرات أسماء الموارد، سيتم إنشاؤها استنادًا إلى رقم تعريف مشروع Google Cloud Platform.

اضبط ما يلي في مشروع Primus:

  • $PRIMUS_INPUT_STORAGE_BUCKET: الحزمة التي تخزِّن ملف بيانات العملاء.
  • $PRIMUS_WORKLOAD_IDENTITY_POOL: مجموعة Workload Identity Pool التي تتحقّق من صحة المطالبات.
  • $PRIMUS_WIP_PROVIDER: موفِّر "مجموعة المعلومات التعريفية لأعباء العمل" الذي يتضمّن شرط التفويض لاستخدام الرموز المميّزة التي وقّعت عليها "خدمة التحقّق من المصادقة".
  • $PRIMUS_SERVICEACCOUNT: حساب الخدمة الذي يستخدمه $PRIMUS_WORKLOAD_IDENTITY_POOL للوصول إلى الموارد المحمية. في هذه الخطوة، يكون لديه إذن بعرض بيانات العملاء المخزّنة في حزمة $PRIMUS_INPUT_STORAGE_BUCKET.
  • $PRIMUS_ENC_KEY: مفتاح إدارة الخدمات الرئيسية المستخدَم لتشفير البيانات المخزّنة في $PRIMUS_INPUT_STORAGE_BUCKET.

مراجع جديدة في هذا الدرس التطبيقي:

  • $PRIMUS_COSIGN_REPOSITORY: Artifact Registry لتخزين توقيعات صور حمولات العمل
  • $PRIMUS_SIGNING_KEY: مفتاح إدارة الخدمات الرئيسية (KMS) المستخدَم لتوقيع صورة حِزمة العمل من قِبل المدقّق أو متعاوني البيانات (مثل بنك Primus في هذه الحالة).

اضبط ما يلي في مشروع Secundus:

  • $SECUNDUS_ARTIFACT_REGISTRY: مستودع العناصر التي سيتم دفع صورة Docker الخاصة بوحدة العمل إليه
  • $WORKLOAD_IMAGE_NAME: اسم صورة Docker لوحدة العمل
  • $WORKLOAD_IMAGE_TAG: علامة صورة Docker الخاصة بحمولة العمل
  • $WORKLOAD_SERVICEACCOUNT: حساب الخدمة الذي لديه إذن بالوصول إلى Confidential VM الذي يشغّل حمولة العمل
  • $SECUNDUS_RESULT_BUCKET: الحزمة التي تخزِّن نتائج حجم المعالجة

موارد أخرى:

  • يحتوي primus_customer_list.csv على بيانات العميل. سنحمّل هذه البيانات إلى $PRIMUS_INPUT_STORAGE_BUCKET وننشئ عبء عمل سيستعلم عن هذه البيانات.

سير العمل الحالي

عند تشغيل حمولة العمل في Confidential Space، تحدث العملية التالية باستخدام الموارد التي تم ضبطها:

  1. تطلب حِزمة العمل رمز دخول عامًا من Google للوصول إلى $PRIMUS_SERVICEACCOUNT من "الإصدار غير القابل للنشر". ويقدّم رمزًا مميزًا لخدمة "أداة التحقّق من الإثبات" مع مطالبات بحمولة العمل والبيئة.
  2. إذا كانت مطالبات قياس حمولة العمل في رمز خدمة أداة التحقّق من الإثبات تتطابق مع شرط السمة في "الحالة قيد التقدّم"، يتم عرض رمز الوصول إلى $PRIMUS_SERVICEACCOUNT..
  3. تستخدِم حِزمة العمل الرمز المميّز لوصول حساب الخدمة المرتبط بـ $PRIMUS_SERVICEACCOUNT للوصول إلى بيانات العميل في حزمة $PRIMUS_INPUT_STORAGE_BUCKET.
  4. تُجري أعباء العمل عملية على هذه البيانات.
  5. تستخدِم حِزمة العمل حساب الخدمة $WORKLOAD_SERVICEACCOUNT لكتابة نتائج هذه العملية في حزمة $SECUNDUS_RESULT_STORAGE_BUCKET.

سير عمل جديد يتيح استخدام الحاويات الموقَّعة

سيتم دمج ميزة دعم الحاوية الموقَّعة في سير العمل الحالي، كما هو موضّح أدناه. عند تشغيل حمولة العمل في Confidential Space مع إتاحة صور الحاويات الموقَّعة، تتم العملية التالية باستخدام الموارد التي تم ضبطها:

  1. ترصد "المساحة السرية" أيّ توقيعات حاويات ذات صلة بصورة الحمولة الجارية الحالية وترسلها إلى أداة التحقّق من الشهادة. يُثبت مدقّق الإقرار صحة التوقيع، ويُدرِج أيّ توقيعات صالحة في طلبات الإقرار.
  2. تطلب حِزمة العمل رمز دخول عامًا من Google للوصول إلى $PRIMUS_SERVICEACCOUNT من "الإصدار غير القابل للنشر". ويقدّم رمزًا مميزًا لخدمة "أداة التحقّق من الإثبات" مع مطالبات بحمولة العمل والبيئة.
  3. إذا كانت مطالبات توقيع الحاوية في رمز خدمة "أداة التحقّق من الإقرار" تتطابق مع شرط السمة في "الملفّ الذي لا يزال في مرحلة التطوير"، يتم عرض رمز الوصول إلى $PRIMUS_SERVICEACCOUNT.
  4. تستخدِم حِزمة العمل الرمز المميّز لوصول حساب الخدمة المرتبط بـ $PRIMUS_SERVICEACCOUNT للوصول إلى بيانات العميل في حزمة $PRIMUS_INPUT_STORAGE_BUCKET.
  5. تُجري أعباء العمل عملية على هذه البيانات.
  6. تستخدِم حِزمة العمل $WORKLOAD_SERVICEACCOUNT لكتابة نتائج هذه العملية في حزمة $SECUNDUS_RESULT_STORAGE_BUCKET.

2. إعداد موارد السحابة الإلكترونية

كجزء من إعداد Confidential Space، عليك أولاً إنشاء موارد السحابة الإلكترونية المطلوبة ضمن مشاريع GCP لكلّ من بنك Primus وSecundus. في ما يلي المراجع الجديدة في هذا الدرس التطبيقي حول الترميز:

في مشروع Primus:

  • مفتاح توقيع "إدارة الخدمات الرئيسية" المستخدَم لتوقيع أحمال عمل Secundus، بعد تدقيق الرمز
  • مستودع Artifact Registry لتخزين توقيعات Cosign

ما مِن موارد جديدة في مشروع Secundus. بعد إعداد هذه الموارد، عليك إنشاء حساب خدمة لوحدة العمل مع الأدوار والأذونات المطلوبة. ستنشئ بعد ذلك صورة حمولة وسيوقّع المدقّق، وهو بنك Primus، على صورة الحمولة. بعد ذلك، سيمنح متعاونو البيانات (بنك Primus في هذا الدليل التعليمي) الإذن بتنفيذ حمولة العمل، وسينفّذها مشغّل حمولة العمل (بنك Secundus في هذه الحالة).

كجزء من إعداد Confidential Space، عليك إنشاء موارد السحابة الإلكترونية المطلوبة في مشروعَي Primus وSecundus على Google Cloud Platform.

قبل البدء

  • يمكنك استنساخ هذا المستودع باستخدام الأمر أدناه للحصول على النصوص البرمجية المطلوبة التي يتم استخدامها كجزء من هذا الدليل التعليمي.
git clone https://github.com/GoogleCloudPlatform/confidential-space
  • غيِّر دليل هذا الدليل التعليمي.
cd confidential-space/codelabs/signed_container_codelab/scripts
  • تأكَّد من ضبط المشاريع المطلوبة كما هو موضّح أدناه.
export PRIMUS_PROJECT_ID=<GCP project id of primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of secundus bank>
  • اضبط المتغيّرات لأسماء الموارد المذكورة أعلاه باستخدام هذا الأمر. يمكنك إلغاء أسماء الموارد باستخدام هذه المتغيّرات (مثل export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket').
  • شغِّل النص البرمجي التالي لضبط أسماء المتغيّرات المتبقية على قيم استنادًا إلى رقم تعريف مشروعك لأسماء الموارد.
source config_env.sh
  • ثبِّت أداة cosign باتّباع التعليمات الواردة هنا.

إعداد موارد بنك Primus

كجزء من هذه الخطوة، عليك إعداد موارد السحابة الإلكترونية المطلوبة لبنك Primus. شغِّل النص البرمجي التالي لإعداد المراجع الخاصة بمصرف Primus. كجزء من هذه الخطوات، سيتم إنشاء الموارد المذكورة أدناه:

  • حزمة تخزين في السحابة الإلكترونية ($PRIMUS_INPUT_STORAGE_BUCKET) لتخزين ملف بيانات العملاء المشفَّر الخاص ببنك Primus
  • مفتاح التشفير ($PRIMUS_ENC_KEY) ومفتاح سلسلة المفاتيح ($PRIMUS_ENC_KEYRING) في خدمة "إدارة مفاتيح التشفير" (KMS) لتشفير ملف بيانات بنك Primus
  • مجموعة المعلومات التعريفية ($PRIMUS_WORKLOAD_IDENTITY_POOL) للتحقّق من صحة المطالبات استنادًا إلى شروط السمات التي تم ضبطها ضمن موفّرها
  • حساب الخدمة ($PRIMUS_SERVICEACCOUNT) المرتبط بمجموعة تعريفات "وحدة العمل" المذكورة أعلاه ($PRIMUS_WORKLOAD_IDENTITY_POOL) مع إذن الوصول التالي إلى "إدارة الهوية وإمكانية الوصول":
  • roles/cloudkms.cryptoKeyDecrypter لفك تشفير البيانات باستخدام مفتاح إدارة الخدمات الرئيسية (KMS).
  • objectViewer لقراءة البيانات من حزمة تخزين السحابة الإلكترونية
  • roles/iam.workloadIdentityUser لربط حساب الخدمة هذا بمجموعة المعلومات التعريفية لوحدة العمل
./setup_primus_bank_resources.sh

إعداد موارد بنك Secundus

كجزء من هذه الخطوة، عليك إعداد موارد السحابة الإلكترونية المطلوبة لبنك Secundus. شغِّل النص البرمجي التالي لإعداد المراجع لبنك Secundus. كجزء من هذه الخطوات، سيتم إنشاء المراجع المذكورة أدناه:

  • حزمة تخزين في السحابة الإلكترونية ($SECUNDUS_RESULT_STORAGE_BUCKET) لتخزين نتيجة تنفيذ حِزمة العمل من قِبل بنك Secundus
./setup_secundus_bank_resources.sh

3- إنشاء "حمل العمل" وتوقيعها

إنشاء حساب خدمة "وحدة العمل"

الآن، عليك إنشاء حساب خدمة للعملية مع الأدوار والأذونات المطلوبة. شغِّل النص البرمجي التالي لإنشاء حساب خدمة "وحدة العمل" في مشروع بنك Secundus. سيستخدم حساب الخدمة هذا الجهاز الظاهري الذي يشغّل سير العمل.

  • سيتضمّن حساب الخدمة هذا ($WORKLOAD_SERVICEACCOUNT) للأحمال المهام الأدوار التالية:
  • confidentialcomputing.workloadUser للحصول على رمز إثبات الهوية
  • logging.logWriter لكتابة السجلّات في Cloud Logging
  • objectViewer لقراءة البيانات من حزمة التخزين السحابي $PRIMUS_INPUT_STORAGE_BUCKET
  • objectAdmin لكتابة نتيجة "حمل العمل" في حزمة التخزين السحابي $SECUNDUS_RESULT_STORAGE_BUCKET
./create_workload_serviceaccount.sh

إنشاء حمل عمل

كجزء من هذه الخطوة، عليك إنشاء صورة Docker لوحدة العمل. إنّ "وحدة العمل" المستخدَمة في هذا "الكودلاب" هي تطبيق Go بسيط يستند إلى واجهة سطر الأوامر، ويحصي العملاء (من بيانات عملاء بنك Primus) من موقع جغرافي مقدَّم في الوسيطة. شغِّل النص البرمجي التالي لإنشاء حمولة يتم فيها تنفيذ الخطوات التالية:

  • أنشئ Artifact Registry($SECUNDUS_ARTIFACT_REGISTRY) مملوكًا لبنك Secundus.
  • عدِّل رمز "عبء العمل" باستخدام أسماء الموارد المطلوبة. في ما يلي رمز الحمولة الذي تم استخدامه في هذا الدرس التطبيقي حول الترميز.
  • أنشئ ملف Go ثنائيًا وأنشئ ملف Dockerfile لإنشاء صورة Docker من رمز حمولة العمل. هنا ملف Dockerfile المستخدَم في هذا الدرس التطبيقي حول الترميز.
  • أنشئ صورة Docker وانشرها في Artifact Registry‏ ($SECUNDUS_ARTIFACT_REGISTRY) الذي يملكه بنك Secundus.
  • امنح $WORKLOAD_SERVICEACCOUNT إذن القراءة لـ $SECUNDUS_ARTIFACT_REGISTRY. هذا الإجراء مطلوب لكي تسحب حاوية "حمولة العمل" صورة Docker الخاصة بها من "مستودع العناصر".
./create_workload.sh

حمل عمل التوقيع

سنستخدم Cosign لتوقيع صورة "حمولة العمل". سيخزِّن Cosign التوقيعات تلقائيًا في المستودع نفسه الذي تتوفّر فيه الصورة التي يتم التوقيع عليها. لتحديد مستودع مختلف للتوقيعات، يمكنك ضبط متغيّر البيئة COSIGN_REPOSITORY.

سنستخدم هنا Artifact Registry كمثال. يمكنك أيضًا اختيار سجلات أخرى تستند إلى OCI، مثل Docker Hub وAWS CodeArtifact، استنادًا إلى إعداداتك المفضّلة.

  1. أنشئ مستودعًا على Docker في Artifact Registry.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud artifacts repositories create $PRIMUS_COSIGN_REPOSITORY \
  --repository-format=docker --location=${PRIMUS_PROJECT_REPOSITORY_REGION}
  1. أنشئ سلسلة مفاتيح ومفتاحًا ضمن "إدارة مفاتيح السحابة" لتوقيع صورة حمولة عمل.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=${PRIMUS_PROJECT_LOCATION}
gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256 \
  --location=${PRIMUS_PROJECT_LOCATION}
  1. بالنسبة إلى Artifact Registry، من المتوقّع إدخال اسم صورة كامل مثل $LOCATION/$PROJECT/$REPOSITORY/$IMAGE_NAME. يمكنك تحميل أي صورة حاوية إلى المستودع لتخزين التوقيعات.
export COSIGN_REPOSITORY=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo
  1. امنح دور "المُشاهد" في مستودع $PRIMUS_COSIGN_REPOSITORY لحساب الخدمة $WORKLOAD_SERVICEACCOUNT. يتيح ذلك لخدمة "المساحة السرية" اكتشاف أيّ توقيعات لصور الحاوية يتم تحميلها إلى $PRIMUS_COSIGN_REPOSITORY.
gcloud artifacts repositories add-iam-policy-binding ${PRIMUS_COSIGN_REPOSITORY} \
--project=${PRIMUS_PROJECT_ID} --role='roles/viewer' --location=us \
--member="serviceAccount:${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com"

Cosign هي أداة فعّالة تتضمّن ميزات متعددة للتوقيع. في حالة الاستخدام هذه، لا نطلب من Cosign سوى التوقيع باستخدام مفتاحَي تشفير. لا تتوفّر ميزة التوقيع بدون مفتاح في Cosign لهذه الميزة الخاصة بصور الحاويات الموقَّعة.

عند التوقيع باستخدام مفتاحَي تشفير، يتوفّر خياران:

  1. التوقيع باستخدام مفتاحَي تشفير محليَين تم إنشاؤهما بواسطة Cosign
  2. التوقيع باستخدام مفتاحَي تشفير مخزَّنَين في مكان آخر (على سبيل المثال، في خدمة إدارة مفاتيح التشفير)
  1. أنشئ زوجًا من المفاتيح في Cosign إذا لم يكن لديك زوج. يُرجى الرجوع إلى مقالة التوقيع باستخدام مفاتيح مُدارة ذاتيًا لمزيد من التفاصيل. لقد حدّدنا هنا كلتا الطريقتَين (على الجهاز واستخدام مقدّم خدمة "إدارة مفاتيح التشفير") لإنشاء مفتاحَي التشفير وتوقيع حِزمة العمل، يُرجى اتّباع إحدى هاتين الطريقتَين لتوقيع حاوية حِزمة العمل.
// Set Application Default Credentials.
gcloud auth application-default login 
// Generate keys using a KMS provider.
cosign generate-key-pair --kms <provider>://<key>
// Generate keys using Cosign.
cosign generate-key-pair

في الرمز أعلاه، استبدِل <provider>://<key> gcpkms://projects/$PRIMUS_PROJECT_ID/locations/global/keyRings/$PRIMUS_SIGNING_KEYRING/cryptoKeys/$PRIMUS_SIGNING_KEY/cryptoKeyVersions/$PRIMUS_SIGNING_KEYVERSION

  • <provider> : يشير إلى حلّ إدارة مفاتيح التشفير الذي تستخدمه
  • ‫<key> : تشير إلى مسار المفتاح في خدمة "إدارة مفاتيح التشفير" (KMS)
  1. استرداد المفتاح العام للتحقّق منه
// For KMS providers.
cosign public-key --key <some provider>://<some key> > pub.pem

// For local key pair signing.
cosign public-key --key cosign.key > pub.pem
  1. وقِّع على أعباء العمل باستخدام Cosign. تنفيذ ترميز base64 غير مضاف على المفتاح العام
PUB=$(cat pub.pem | openssl base64)
// Remove spaces and trailing "=" signs.
PUB=$(echo $PUB | tr -d '[:space:]' | sed 's/[=]*$//')
  1. وقِّع على حِزمة العمل باستخدام Cosign مع إرفاق المفتاح العام الذي تم تصديره وخوارزميات التوقيع.
IMAGE_REFERENCE=us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/$SECUNDUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
// Sign with KMS support.
cosign sign --key <some provider>://<some key> $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
// Sign with a local key pair.
cosign sign --key cosign.key $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
  • --key [مطلوبة] لتحديد مفتاح التوقيع الذي سيتم استخدامه. عند الإشارة إلى مفتاح يديره موفِّر خدمة إدارة مفاتيح التشفير (KMS)، يُرجى اتّباع تنسيق معرّف موارد منتظم محدّد من دعم خدمة إدارة مفاتيح التشفير (KMS) في Sigstore. عند الإشارة إلى مفتاح تم إنشاؤه بواسطة Cosign، استخدِم cosign.key بدلاً من ذلك.
  • $IMAGE_REFERENCE [مطلوبة] تحدد صورة الحاوية المطلوب توقيعها. يمكن تحديد تنسيق IMAGE_REFERENCE من خلال العلامة أو خلاصة الصورة. على سبيل المثال: us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container:latest or us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container[IMAGE-digest]
  • ‫-a [مطلوب] لتحديد التعليقات التوضيحية المرفقة بحمولة التوقيع بالنسبة إلى صور الحاويات الموقَّعة في "مساحة سرية"، يجب إرفاق المفتاح العام وخوارزميات التوقيع بحمولة التوقيع.
  • dev.cosignproject.cosign/sigalg فقط يقبل ثلاث قيم:
  • ‫RSASSA_PSS_SHA256: خوارزمية RSASSA مع حشو PSS باستخدام خلاصة SHA256
  • ‫RSASSA_PKCS1V15_SHA256: خوارزمية RSASSA مع تعبئة PKCS#1 v1.5 باستخدام خلاصة SHA256
  • ‫ECDSA_P256_SHA256: ECDSA على منحنى P-256 مع تجزئة SHA256 وهذه هي أيضًا خوارزمية التوقيع التلقائية لمفتاحَي التشفير التي تم إنشاؤهما باستخدام Cosign.
  1. تحميل التوقيعات إلى مستودع Docker

ستُحمِّل ميزة "التوقيع المشترَك" التوقيعات تلقائيًا إلى COSIGN_REPOSITORY. المحدّد.

4. تفويض "حمل العمل" وتشغيله

منح الإذن لـ Workload

كجزء من هذه الخطوة، سنُعدّ موفِّر المعلومات التعريفية لوحدة العمل ضمن مجموعة المعلومات التعريفية لوحدة العمل ($PRIMUS_WORKLOAD_IDENTITY_POOL). تم ضبط شروط السمات للمعلومات التعريفية لوحدة العمل كما هو موضّح أدناه. ومن الشروط التحقّق من مطابقة بصمة توقيع صورة "حمّل عملك" مع بصمة المفتاح العام المُستخدَم للتوقيع. باستخدام شرط السمة هذا، عندما يُصدر بنك Secundus صورة جديدة للحِمولة، يتحقّق بنك Primus من رمز الحمولة ويوقّع على صورة الحمولة الجديدة بدون الحاجة إلى تعديل سياسة العمل الجاري باستخدام خلاصة الصورة.

gcloud config set project $PRIMUS_PROJECT_ID
PUBLIC_KEY_FINGERPRINT=$(openssl pkey -pubin -in pub.pem -outform DER | openssl sha256 | cut -d' ' -f2)
gcloud iam workload-identity-pools providers create-oidc ${PRIMUS_WIP_PROVIDER} \
   --location="global" \
   --workload-identity-pool="${PRIMUS_WORKLOAD_IDENTITY_POOL}" \
   --issuer-uri="https://confidentialcomputing.googleapis.com/" \
   --allowed-audiences="https://sts.googleapis.com" \
   --attribute-mapping="google.subject='assertion.sub'" \
   --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
  'STABLE' in assertion.submods.confidential_space.support_attributes
     && '${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com' in
     assertion.google_service_accounts
     && ['ECDSA_P256_SHA256:${PUBLIC_KEY_FINGERPRINT}']
       .exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig,sig.signature_algorithm+':'+sig.key_id))"

تشغيل "حمل العمل"

كجزء من هذه الخطوة، سنشغّل حجم العمل على "الجهاز الظاهري السري". يتم تمرير وسيطات TEE المطلوبة باستخدام علامة البيانات الوصفية. يتم تمرير الوسائط لحاوية "وحدة العمل" باستخدام الجزء "tee-cmd" من العلامة. تم ترميز حجم العمل لنشر النتيجة في $SECUNDUS_RESULT_STORAGE_BUCKET.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --project=${SECUNDUS_PROJECT_ID} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/${SECUNDUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]"~tee-signed-image-repos=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo"

عرض النتائج

في مشروع Secundus، اطّلِع على نتائج حجم العمل.

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result

من المفترض أن تكون النتيجة 3، لأنّ هذا هو عدد المستخدمين من سياتل المدرَجين في ملف primus_customer_list.csv.

5- تنظيف

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

  • أدخِل حزمة التخزين الخاصة ببنك Primus ($PRIMUS_INPUT_STORAGE_BUCKET).
  • حساب الخدمة في بنك Primus ($PRIMUS_SERVICEACCOUNT).
  • سجلّ عناصر Primus Bank الذي يحتوي على توقيعات الصور ($PRIMUS_COSIGN_REPOSITORY).
  • مجموعة عناوين العملاء في Primus Bank ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • حساب خدمة "عبء العمل" في بنك Secundus ‏ ($WORKLOAD_SERVICEACCOUNT).
  • مثيل Compute للحمولة
  • حزمة تخزين النتائج الخاصة بمصرف Secundus ($SECUNDUS_RESULT_STORAGE_BUCKET).
  • سجلّ Artifact الخاص بمصرف Secundus ($SECUNDUS_ARTIFACT_REGISTRY).
  • جهاز افتراضي لتحميل العمل في بنك Secundus ($WORKLOAD_VM).
./cleanup.sh

إذا انتهيت من الاستكشاف، يُرجى التفكير في حذف مشروعك.

  • انتقِل إلى وحدة تحكّم Cloud Platform.
  • اختَر المشروع الذي تريد إيقافه، ثم انقر على "حذف" في أعلى الصفحة: سيؤدي ذلك إلى جدولة المشروع للحذف.

تهانينا

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

لقد تعرّفت على كيفية الاستفادة من ميزة صورة الحاوية الموقَّعة لتحسين سهولة استخدام "مساحة العمل السرية".

الخطوة التالية

اطّلِع على بعض هذه الدروس التطبيقية حول الترميز المشابهة...

مراجع إضافية