Codelab של תמונת קונטיינר חתום

1. סקירה כללית

ה-Codelab הזה מתבסס על Confidential Space Codelab תמיכה בתמונת קונטיינר חתומה שקיבלו אפשרות לאמת קונטיינר באמצעות מפתח ציבורי מאומת במקום לציין תקציר תמונה במדיניות Workload Identity Pool (WIP).

מה השתנה בתמיכה בקובצי אימג' חתומים של קונטיינר ב-Confidential Space:

נוחות שימוש משופרת: עם ההשקה של התכונה 'קובץ אימג' חתום', אנחנו יכולים לעבור עכשיו מגישה של תקציר תמונות של עומסי עבודה לגישה של חתימת קונטיינר בשביל שותפי עריכה או מבקרים שמאשרים תמונה.

  • כשמשתמשים בתקצירי תמונות באופן ישיר, בעלי המשאבים צריכים לעדכן את המדיניות שלהם באמצעות תקציר תמונות בכל פעם שהם מאשרים תמונה חדשה. באמצעות חתימות של תמונות, המדיניות מכילה טביעת אצבע של מפתח ציבורי, שהמפתח הפרטי שלה נמצא בבעלות שותף העריכה או המבקר ומשמש לחתימה על התמונות המבוקרות.
  • במודלים מסוימים של אבטחה, הדרך נוחה יותר להפנות למפתח מהימן לחתימה על תמונה מאשר לעדכן רשימה של ערכים חדשים לתקציר תמונות.

אין רגרסיה של אבטחה: הגישה הזו של חתימת קונטיינר לא תגרום לרגרסיה של אבטחה מהגישה הקודמת של תקציר התמונה, כי גבולות האמון לא השתנו. בגישת חתימת הקונטיינר, בעלי המשאב מאשרים מפתח אימות על ידי ציון טביעת האצבע של המפתח הציבורי המהימן במדיניות WIP. בדיקת ההרשאה מתבצעת על ידי שירות אימות הזהות ו-WIP. שירות האימות לאימות (attestation) מאמת שהחתימה משויכת לעומס העבודה הפעיל, ומדיניות ה-WIP בודקת שהמפתח הציבורי שהוצהר על ידי השירות מורשה לפי מדיניות.

אבטחה חזקה: שימוש בחתימות של קובצי אימג' בקונטיינר מאפשר להעניק אמון בחותם התמונה. כשמציינים במדיניות האימות את טביעת האצבע של המפתח הציבורי של חותם מהימן, בעלי המשאב מאשרים לחותם להעניק המלצות לגבי תמונות של קונטיינרים שעומדים במדיניות. שירות האימות לאימות (attestation) מאמת שהחתימה משויכת לעומס העבודה הפעיל, והמדיניות בודקת שהמפתח הציבורי שיצר את החתימה מורשה על פי מדיניות. באמצעות השיטה הזו, שכבת העקיפה הנוספת שמאפשרת חתימה על תמונות שומרת על האבטחה החזקה של Confidential Space.

ההבדל היחיד בין הגישות האלה הוא שבגישה השנייה נעשה שימוש בשכבה נוספת של עקיפה שבה תמונות של עומסי עבודה מורשות באמצעות מפתח חתימה. המצב הזה לא יוצר פרצות אבטחה חדשות כי גבולות האמון לא השתנו.

מה תלמדו

ב-Codelab הזה תלמדו איך להשתמש בחתימת קובץ אימג' בקונטיינר כדי לאשר גישה למשאבים מוגנים:

  • איך חותמים על קובץ אימג' של קונטיינר מבוקר באמצעות חתימה משותפת
  • איך להעלות חתימות של קובץ אימג' בקונטיינר למרשמים ל-OCI לצורך גילוי ואחסון חתימות
  • איך להגדיר את משאבי הענן שנחוצים להרצת Confidential Space
  • איך מריצים את עומס העבודה ב-Confidential Space עם תמיכה בקובצי אימג' חתומים של קונטיינר

ב-Codelab הזה מוסבר איך להשתמש ב-Confidential Space כדי לאמת מרחוק תמונת קונטיינר חתומה על ידי מפתח מהימן שפועל ב-Google Compute Engine.

מה צריך להכין

התפקידים שמעורבים במרחב סודי עם תמונה של קונטיינר חתום

ב-Codelab הזה, Primus Bank יהיה המבקר ובעל המשאב, שיהיה אחראי על:

  1. הגדרת המשאבים הנדרשים עם נתונים לדוגמה.
  2. בדיקת הקוד של עומס העבודה.
  3. שימוש ב-cosign כדי לחתום על התמונה של עומס העבודה.
  4. העלאת החתימה למאגר.
  5. הגדרת מדיניות WIP להגנה על נתוני לקוחות.

Secundus Bank יהיה המחבר והמפעיל של עומס העבודה, ויהיה אחראי על:

  1. הגדרת המשאבים הדרושים לאחסון התוצאה.
  2. כתיבת הקוד של עומס העבודה
  3. פרסום התמונה של עומס העבודה.
  4. הרצת עומס העבודה ב-Confidential Space עם תמיכה בקובצי אימג' חתומים של קונטיינר.

Secundus Bank יפתח ויפרסם עומס עבודה (workload) שישלח שאילתות על נתוני לקוחות שמאוחסנים בקטגוריה של אחסון בענן ונמצאים בבעלות Primus Bank. בנק Primus Bank יבדוק את עומס העבודה, יחתום על קובץ האימג' של הקונטיינר ויגדיר מדיניות WIP כדי לאפשר גישה לנתונים של עומסי עבודה שאושרו. תוצאת הביצוע של עומס העבודה הזה תאוחסן בקטגוריית אחסון בענן שבבעלות בנק Secundus.

המשאבים שמעורבים בהגדרה של Confidential Space

ה-Codelab הזה מפנה למספר משתנים שכדאי להגדיר לערכים המתאימים לפרויקט GCP. הפקודות ב-Codelab האלה מניחות שהמשתנים האלה הוגדרו. (לדוגמה, אפשר להשתמש ב-export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket' כדי להגדיר את השם של קטגוריית האחסון לקלט של Primus Bank). אם לא הוגדרו משתנים של שמות המשאבים, הם ייווצרו על סמך מזהה הפרויקט ב-GCP.

מגדירים את ההגדרות הבאות בפרויקט Primus:

  • $PRIMUS_INPUT_STORAGE_BUCKET: הקטגוריה שמאחסנת את קובץ נתוני הלקוחות.
  • $PRIMUS_WORKLOAD_IDENTITY_POOL: מאגר זהויות של עומסי עבודה (WIP) שמאמת הצהרות.
  • $PRIMUS_WIP_PROVIDER: הספק של Workload Identity Pool, שכולל את תנאי ההרשאה לשימוש באסימונים שנחתמו על ידי ServiceVerifier.
  • $PRIMUS_SERVICEACCOUNT: חשבון השירות שמשמש את $PRIMUS_WORKLOAD_IDENTITY_POOL כדי לגשת למשאבים המוגנים. בשלב הזה יש לו הרשאה לצפות בנתוני הלקוחות שמאוחסנים בקטגוריה $PRIMUS_INPUT_STORAGE_BUCKET.
  • $PRIMUS_ENC_KEY: מפתח ה-KMS המשמש להצפנת הנתונים שמאוחסנים ב-$PRIMUS_INPUT_STORAGE_BUCKET.

משאבים חדשים ב-Codelab הזה:

  • $PRIMUS_COSIGN_REPOSITORY: Artifact Registry לאחסון חתימות של קובצי אימג' של עומסי עבודה.
  • $PRIMUS_SIGNING_KEY: מפתח ה-KMS המשמש לחתימה על התמונה של עומס העבודה על ידי מבקרים/שותפי נתונים (למשל, בנק פרימוס במקרה הזה).

מגדירים את ההגדרות הבאות בפרויקט Secundus:

  • $SECUNDUS_ARTIFACT_REGISTRY: מרשם פריטי המידע שנוצרו בתהליך הפיתוח (Artifact) שבו תישלח תמונת Docer של עומס העבודה.
  • $WORKLOAD_IMAGE_NAME: שם קובץ האימג' של Docker של עומסי העבודה.
  • $WORKLOAD_IMAGE_TAG: התג של תמונת Docer של עומס העבודה.
  • $WORKLOAD_SERVICEACCOUNT: חשבון השירות שיש לו הרשאת גישה ל-Confidential VM שמריץ את עומס העבודה.
  • $SECUNDUS_RESULT_BUCKET: הקטגוריה שמאחסנת את התוצאות של עומס העבודה.

מקורות מידע אחרים:

  • primus_customer_list.csv מכיל את נתוני הלקוחות. אנחנו נעלה את הנתונים האלה אל $PRIMUS_INPUT_STORAGE_BUCKET וניצור עומס עבודה (workload) שיבצע שאילתה על הנתונים האלה.

תהליך עבודה קיים

כשמריצים את עומס העבודה ב-Confidential Space, באמצעות המשאבים שהוגדרו:

  1. עומס העבודה מבקש מה-WIP אסימון גישה כללי של Google ל-$PRIMUS_SERVICEACCOUNT. הוא כולל אסימון שירות של 'מאמת אימות' עם הצהרות על עומס עבודה וסביבה.
  2. אם ההצהרות על מדידת עומסי העבודה באסימון השירות של Attestation Verifier תואמות לתנאי המאפיין ב-WIP, הוא יחזיר את אסימון הגישה עבור $PRIMUS_SERVICEACCOUNT.
  3. עומס העבודה משתמש באסימון הגישה לחשבון השירות שמשויך ל-$PRIMUS_SERVICEACCOUNT כדי לגשת לנתוני הלקוחות בקטגוריה $PRIMUS_INPUT_STORAGE_BUCKET.
  4. עומס העבודה מבצע פעולה על הנתונים האלה.
  5. עומס העבודה משתמש בחשבון השירות $WORKLOAD_SERVICEACCOUNT כדי לכתוב את התוצאות של הפעולה הזו בקטגוריה $SECUNDUS_RESULT_STORAGE_BUCKET.

תהליך עבודה חדש עם תמיכה בקונטיינר חתום

התמיכה בקונטיינר החתום תשולב בתהליך העבודה הקיים, כפי שמוצג בהמשך. כשמריצים את עומס העבודה ב-Confidential Space עם תמיכה בקובצי אימג' חתומים של קונטיינר, מתרחש התהליך הבא באמצעות המשאבים שהוגדרו:

  1. שירות Confidential Space מזהה חתימות של קונטיינרים שקשורות לקובץ האימג' הנוכחי של עומס העבודה שפועל, ושולח אותן למאמת האימות. מאמת האימות מאמת את החתימה, וכולל חתימות תקפות בהצהרות האימות.
  2. עומס העבודה מבקש מה-WIP אסימון גישה כללי של Google ל-$PRIMUS_SERVICEACCOUNT. הוא כולל אסימון שירות של 'מאמת אימות' עם הצהרות על עומס עבודה וסביבה.
  3. אם ההצהרות של חתימת הקונטיינר באסימון השירות של Attestation Verifier תואמות לתנאי המאפיין ב-WIP, הוא יחזיר את אסימון הגישה עבור $PRIMUS_SERVICEACCOUNT.
  4. עומס העבודה משתמש באסימון הגישה לחשבון השירות שמשויך ל-$PRIMUS_SERVICEACCOUNT כדי לגשת לנתוני הלקוחות בקטגוריה $PRIMUS_INPUT_STORAGE_BUCKET.
  5. עומס העבודה מבצע פעולה על הנתונים האלה.
  6. עומס העבודה משתמש ב-$WORKLOAD_SERVICEACCOUNT כדי לכתוב את התוצאות של הפעולה הזו בקטגוריה $SECUNDUS_RESULT_STORAGE_BUCKET.

2. הגדרת משאבים ב-Cloud

במסגרת ההגדרה של Confidential Space, קודם עליך ליצור את משאבי הענן הנדרשים בפרויקטים של GCP של Primus ו-Secundus Bank. אלה המשאבים החדשים ב-Codelab הזה:

בפרויקט Primus:

  • מפתח החתימה של KMS שמשמש לחתימה על עומסי עבודה של Secundus, אחרי בדיקת הקוד.
  • מאגר רישום של Artifact לאחסון חתימות של Cosign.

אין משאבים חדשים בפרויקט Secundus. אחרי שמגדירים את המשאבים האלה, יוצרים חשבון שירות לעומס העבודה עם התפקידים וההרשאות הנדרשים. לאחר מכן אפשר ליצור תמונה של עומס עבודה, והמבקר, Primus Bank, יחתום על התמונה של עומס העבודה. לאחר מכן עומס העבודה יאושר על ידי שותפי נתונים (בבנק של Primus ב-Codelab הזה) ומפעיל עומס העבודה (Secundus Bank במקרה הזה) יריץ את עומס העבודה.

במסגרת ההגדרה של Confidential Space, עליך ליצור את משאבי הענן הנדרשים בפרויקטים של Primus ו-Secundus ב-GCP.

לפני שמתחילים

  • משכפלים את המאגר הזה באמצעות הפקודה הבאה כדי לקבל את הסקריפטים הנדרשים שמשמשים כחלק מה-Codelab הזה.
$ 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')
  • מריצים את הסקריפט הבא כדי להגדיר את שמות המשתנים שנותרו לערכים בהתאם למזהה הפרויקט שלכם לשמות המשאבים.
$ source config_env.sh
  • כאן אפשר להתקין את החתימה המשותפת.

הגדרת המשאבים של הבנק של Primus

במסגרת השלב הזה, צריך להגדיר את משאבי הענן הנדרשים לבנק Primus. מריצים את הסקריפט הבא כדי להגדיר את המשאבים לבנק Primus. במסגרת השלבים האלה ניצור את המשאבים הבאים:

  • קטגוריה של Cloud Storage ($PRIMUS_INPUT_STORAGE_BUCKET) לאחסון קובץ נתוני הלקוחות המוצפן של בנק Primus.
  • מפתח הצפנה ($PRIMUS_ENC_KEY) ואוסף מפתחות ($PRIMUS_ENC_KEYRING) ב-KMS כדי להצפין את קובץ הנתונים של בנק Primus.
  • מאגר זהויות של עומסי עבודה ($PRIMUS_WORKLOAD_IDENTITY_POOL) כדי לאמת תלונות על סמך תנאי מאפיינים שהוגדרו אצל הספק.
  • חשבון השירות ($PRIMUS_SERVICEACCOUNT) מצורף למאגר הזהויות של עומסי העבודה ($PRIMUS_WORKLOAD_IDENTITY_POOL) שצוין למעלה, עם הרשאת הגישה הבאה ב-IAM:
  • 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 כדי לקבל אסימון אימות (attestation)
  • logging.logWriter כדי לכתוב יומנים ב-Cloud Logging.
  • objectViewer כדי לקרוא נתונים מהקטגוריה $PRIMUS_INPUT_STORAGE_BUCKET של אחסון בענן.
  • objectAdmin כדי לכתוב את התוצאה של עומס העבודה בקטגוריה $SECUNDUS_RESULT_STORAGE_BUCKET של אחסון בענן.
$ ./create_workload_serviceaccount.sh

יצירת עומס עבודה

במסגרת השלב הזה, יוצרים קובץ אימג' של Docker לעומס עבודה. עומס העבודה ב-Codelab הזה הוא אפליקציה פשוטה של Go שמבוססת על CLI, שסופרת לקוחות (מנתוני לקוחות של בנק Primus) ממיקום גיאוגרפי נתון בארגומנט. מריצים את הסקריפט הבא כדי ליצור עומס עבודה שבו מבצעים את השלבים הבאים:

  • צריך ליצור Artifact Registry($SECUNDUS_ARTIFACT_REGISTRY) בבעלות בנק Secundus.
  • מעדכנים את הקוד של עומס העבודה בשמות הנדרשים של המשאבים. כאן מופיע הקוד של עומס העבודה שמשמש ל-Codelab הזה.
  • מפתחים קובץ בינארי ב-Go ויוצרים קובץ Docker לפיתוח קובץ אימג' של Docker של קוד עומס העבודה. כאן נמצא קובץ ה-Docker שמשמש ל-Codelab הזה.
  • יוצרים ומפרסמים את תמונת ה-Docker ב-Artifact Registry ($SECUNDUS_ARTIFACT_REGISTRY) שבבעלות בנק Secundus.
  • הענקת הרשאת קריאה ל-$WORKLOAD_SERVICEACCOUNT עבור $SECUNDUS_ARTIFACT_REGISTRY. צריך לעשות זאת כדי שהקונטיינר של עומס העבודה יאחזר את קובץ האימג' של ה-Docker של עומס העבודה מ-Artifact Registry.
$ ./create_workload.sh

עומס עבודה של חתימה

אנחנו נשתמש ב-Cosign כדי לחתום על התמונה של עומס העבודה. כברירת מחדל, Cosign יאחסן חתימות באותו מאגר שבו נמצאת התמונה שעליה הוא חותם. כדי לציין מאגר אחר לחתימות, אתם יכולים להגדיר את משתנה הסביבה COSIGN_REPOSITORY.

כאן נשתמש ב-Artifact Registry כדוגמה. אפשר גם לבחור מרשמים אחרים מבוססי OCI כמו Docker Hub, AWS CodeArtifact בהתאם להעדפות שלכם.

  1. יצירת מאגר Docer של 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. כך ל-Confidential Space תהיה אפשרות לגלות חתימות של קובצי אימג' בקונטיינר שהועלו ל-$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 רק באמצעות זוג מפתחות. התכונה הזו של קובץ אימג' של קונטיינר חתום לא תומכת בחתימה ללא מפתח של חתימה דיגיטלית.

יש שתי אפשרויות לחתימה באמצעות זוג מפתחות:

  1. חתימה באמצעות זוג מפתחות מקומי שנוצר על ידי Cosign.
  2. חותמים באמצעות זוג מפתחות שמאוחסן במקום אחר (לדוגמה, ב-KMS).
  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 [נדרש] מציין באיזה מפתח חתימה להשתמש. כאשר מפנים למפתח שמנוהל על ידי ספק 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] מציין הערות שמצורפות למטען הייעודי (payload) של החתימה. כשמדובר בתמונות קונטיינרים חתומים של Confidential Space, יש לצרף את האלגוריתמים של המפתח הציבורי והחתימה למטען הייעודי (payload) של החתימה.
  • 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. זהו גם אלגוריתם החתימה שמוגדר כברירת מחדל לזוגות מפתחות שנוצרו באמצעות חתימה משותפת.
  1. העלאת חתימות למאגר Docker

החתימה הדיגיטלית תעלה באופן אוטומטי חתימות ל-COSIGN_REPOSITORY שצוין.

4. הרשאה והפעלה של עומס עבודה (workload)

אישור עומס עבודה (workload)

כחלק מהשלב הזה, נגדיר את ספק הזהויות של כוח העבודה למאגר הזהויות של כוח העבודה ($PRIMUS_WORKLOAD_IDENTITY_POOL). קיימים תנאים למאפיינים שהוגדרו לזהות של עומס העבודה, כפי שמוצג בהמשך. אחד מהתנאים הוא לאמת את טביעת האצבע של חתימת התמונה של עומס העבודה כנגד חתימה על טביעת האצבע של המפתח הציבורי. באמצעות תנאי המאפיין הזה, כש-Secundus Bank מפרסם תמונה חדשה של עומס עבודה, Primus Bank בודק את הקוד של עומס העבודה וחותם על התמונה של עומס העבודה החדש בלי שיהיה צורך לעדכן את מדיניות ה-WIP בתקציר התמונה.

$ 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))"

הפעלת עומס העבודה (workload)

כחלק מהשלב הזה, נפעיל את עומס העבודה ב-Confidential VM. ארגומנטים מסוג 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. הסרת המשאבים

כאן מופיע הסקריפט שיכול לשמש לניקוי המשאבים שיצרנו במסגרת ה-Codelab הזה. במסגרת הניקוי הזה, המשאבים הבאים יימחקו:

  • קטגוריית אחסון קלט של בנק Primus ($PRIMUS_INPUT_STORAGE_BUCKET).
  • חשבון שירות בנק של Primus ($PRIMUS_SERVICEACCOUNT).
  • רישום ארטיפקטים של Primus Bank שמכיל חתימות של תמונות ($PRIMUS_COSIGN_REPOSITORY).
  • מאגר זהויות של כוח עבודה ב-Primus Bank ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • חשבון שירות עומס עבודה של Secundus Bank ($WORKLOAD_SERVICEACCOUNT).
  • מכונה של מחשוב של עומסי עבודה (workload).
  • קטגוריית האחסון של התוצאה של Secundus Bank ($SECUNDUS_RESULT_STORAGE_BUCKET).
  • רישום ארטיפקט של Secundus Bank ($SECUNDUS_ARTIFACT_REGISTRY).
// run the clean up script to delete the resources created as part of this codelab.
$ ./cleanup.sh

אם סיימת לבחון את הנושא, כדאי למחוק את הפרויקט.

  • עוברים אל Cloud Platform Console
  • בוחרים את הפרויקט שרוצים להשבית ולוחצים על Delete (מחיקה). למעלה: מתזמנת את הפרויקט למחיקה

מזל טוב

כל הכבוד! השלמת את ה-Codelab בהצלחה!

למדנו איך להשתמש בתכונה של קובץ אימג' חתום כדי לשפר את השימושיות של Confidential Space.

מה השלב הבא?

התנסות בכמה מ-Codelabs הדומות האלה...

קריאה נוספת