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

1. نظرة عامة

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

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

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

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

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

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

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

المعلومات التي ستطّلع عليها

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

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

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

المتطلبات

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

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

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

سيكون مصرف Secundus Bank هو مؤلف ومشغّل عبء العمل ويكون مسؤولاً عن:

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

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

المراجع المضمَّنة في عملية إعداد "مساحة سرية"

يشير هذا الدرس التطبيقي إلى عدد من المتغيرات التي يجب ضبطها على القيم المناسبة لمشروع 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 (WIP) التي تتحقّق من صحة المطالبات.
  • $PRIMUS_WIP_PROVIDER: موفّر مجموعة Workload Identity Pool الذي يتضمّن شرط التفويض لاستخدامه مع الرموز المميّزة الموقَّعة من خلال خدمة Attestation Verifier.
  • $PRIMUS_SERVICEACCOUNT: حساب الخدمة الذي يستخدمه $PRIMUS_WORKLOAD_IDENTITY_POOL للوصول إلى الموارد المحمية. في هذه الخطوة، يحصل على الإذن بعرض بيانات العملاء المخزَّنة في حزمة $PRIMUS_INPUT_STORAGE_BUCKET.
  • $PRIMUS_ENC_KEY: مفتاح KMS المستخدم لتشفير البيانات المخزنة في $PRIMUS_INPUT_STORAGE_BUCKET.

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

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

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

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

موارد أخرى:

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

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

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

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

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

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

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

2. إعداد موارد السحابة

كجزء من عملية إعداد "المساحة السرية"، ستنشئ أولاً موارد السحابة الإلكترونية المطلوبة ضمن مشاريع Google Cloud Platform (GCP) لمصرف Primus وSecundus. في ما يلي الموارد الجديدة في هذا الدرس التطبيقي حول الترميز:

في مشروع Primus:

  • مفتاح توقيع KMS يتم استخدامه لتوقيع أحمال عمل Secundus، بعد تدقيق الرمز البرمجي.
  • مستودع سجل Artifact لتخزين توقيعات Cosign.

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

كجزء من عملية إعداد "المساحة السرية"، ستنشئ موارد السحابة الإلكترونية المطلوبة في مشروعَي Primus وSecundus GCP.

قبل البدء

  • استنسِخ هذا المستودع باستخدام الأمر أدناه للحصول على النصوص البرمجية المطلوبة التي يتم استخدامها كجزء من هذا الدرس التطبيقي حول الترميز.
$ git clone https://github.com/GoogleCloudPlatform/confidential-space
  • تأكَّد من أنّك ضبطت المشاريع المطلوبة كما هو موضّح أدناه.
$ 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').
  • شغِّل script التالي لضبط أسماء المتغيّرات المتبقية على قيم استنادًا إلى رقم تعريف مشروعك لأسماء الموارد.
$ source config_env.sh
  • ثبِّت التوقيع المشترك باتّباع التعليمات هنا.

إعداد موارد مصرف Primus

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

  • حزمة التخزين في السحابة الإلكترونية ($PRIMUS_INPUT_STORAGE_BUCKET) لتخزين ملف بيانات العملاء المشفَّر في مصرف Primus
  • مفتاح التشفير ($PRIMUS_ENC_KEY) وسلسلة المفاتيح ($PRIMUS_ENC_KEYRING) في KMS لتشفير ملف بيانات بنك Primus.
  • مجموعة Workload Identity Pool ($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- إنشاء عبء العمل وتوقيعه

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

والآن، ستنشئ حساب خدمة لتحميل العمل يتضمّن الأدوار والأذونات المطلوبة. شغِّل script التالي لإنشاء حساب خدمة أحمال عمل في مشروع مصرف 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) من موقع جغرافي مُقدّم في الوسيطة. شغِّل script التالي لإنشاء أعباء عمل يتم فيها تنفيذ الخطوات التالية:

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

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

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

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

  1. أنشِئ مستودعًا لقاعدة إرساء Artifact Registry.
$ gcloud config set project $PRIMUS_PROJECT_ID

$ gcloud artifacts repositories create $PRIMUS_COSIGN_REPOSITORY \
  --repository-format=docker --location=us
  1. قم بإنشاء سلسلة مفاتيح ومفتاح ضمن KMS لتوقيع صورة عبء العمل.
$ gcloud config set project $PRIMUS_PROJECT_ID

$ gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=global

$ gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256
  --location=us
  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"

  • &lt;provider&gt; : يشير إلى حل KMS الذي تستخدمه
  • &lt;key&gt; : يشير إلى المسار الرئيسي في 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 [REQUIRED] يحدّد مفتاح التوقيع المطلوب استخدامه. عند الإشارة إلى مفتاح يديره موفِّر خدمة KMS، يُرجى اتّباع تنسيق معرّف موارد منتظم (URI) محدّد من فريق دعم Sigstore KMS. عند الإشارة إلى مفتاح تم إنشاؤه بواسطة Cosign، استخدم cosign.key بدلاً من ذلك.
  • يحدّد $IMAGE_REFERENCE [REQUIRED] صورة الحاوية المطلوب توقيعها. ويمكن تحديد تنسيق 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 [REQUIRED] يحدّد التعليقات التوضيحية المرفقة بحمولة التوقيع. بالنسبة إلى صور الحاوية الموقعة في المساحة السرية، يجب إرفاق خوارزميات التوقيع والمفتاح العام بحمولة التوقيع.
  • يقبل dev.cosignproject.cosign/sigalg فقط ثلاث قيم:
  • RSASSA_PSS_SHA256: خوارزمية RSASSA مع مساحة PSS المتروكة مع ملخص SHA256.
  • RSASSA_PKCS1V15_SHA256: خوارزمية RSASSA مع مساحة متروكة من PKCS#1 الإصدار 1.5 مع ملخص SHA256.
  • ECDSA_P256_SHA256: ECDSA على منحنى P-256 مع ملخص SHA256. وهذه هي أيضًا خوارزمية التوقيع التلقائية لأزواج المفاتيح التي يتم إنشاؤها باستخدام التوقيع المشترك.
  1. تحميل التوقيعات إلى مستودع Docker

ستحمّل علامة Cosign التوقيعات تلقائيًا إلى COSIGN_REPOSITORY المحددة.

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

تفويض عبء العمل

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

$ 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 config set project $SECUNDUS_PROJECT_ID

$ gcloud compute instances create signed-container-vm \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=us-west1-b \
 --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 Bank ($WORKLOAD_SERVICEACCOUNT)
  • مثيل حوسبة تحميل العمل
  • حزمة تخزين النتائج الخاصة بمصرف Secundus Bank ($SECUNDUS_RESULT_STORAGE_BUCKET)
  • سجلّ Artifact الخاص بمصرف Secundus Bank ($SECUNDUS_ARTIFACT_REGISTRY)
// run the clean up script to delete the resources created as part of this codelab.
$ ./cleanup.sh

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

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

تهانينا

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

لقد تعلمت كيفية الاستفادة من ميزة صورة الحاوية الموقعة لتحسين قابلية استخدام المساحة السرية.

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

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

قراءة إضافية