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

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

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

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

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

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

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

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

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

מה תלמדו

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

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

ב-Codelab הזה תלמדו איך להשתמש ב-Confidential Space כדי לבצע אימות (attestation) מרחוק של קובץ אימג' של קונטיינר שחתום על ידי מפתח מהימן שפועל ב-Google Compute Engine.

מה תצטרכו

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

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

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

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

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

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

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

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

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

  • $PRIMUS_INPUT_STORAGE_BUCKET: הבאקט שבו מאוחסן קובץ נתוני הלקוח.
  • $PRIMUS_WORKLOAD_IDENTITY_POOL: מאגר הזהויות של עומסי העבודה (WIP) שמאמת את הטענות.
  • $PRIMUS_WIP_PROVIDER: ספק מאגר הזהויות של עומסי העבודה שכולל את תנאי ההרשאה לשימוש באסימונים שנחתמו על ידי שירות אימות הזהות.
  • $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 שמשמש את המבקרים או את שותפי שיתוף הנתונים לחתימה על תמונת עומס העבודה (למשל, primus bank במקרה הזה).

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

  • $SECUNDUS_ARTIFACT_REGISTRY: מאגר 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 מ-WIP. הוא מציע אסימון שירות לאימות הצהרות עם טענות לגבי עומס העבודה והסביבה.
  2. אם הצהרות המדידה של עומס העבודה באסימון של שירות אימות האימות תואמות לתנאי המאפיין במאגר הזהויות של עומסי העבודה, השירות מחזיר את אסימון הגישה עבור $PRIMUS_SERVICEACCOUNT.
  3. עומס העבודה משתמש באסימון הגישה של חשבון השירות שמשויך ל-$PRIMUS_SERVICEACCOUNT כדי לגשת לנתוני הלקוח בדלי $PRIMUS_INPUT_STORAGE_BUCKET.
  4. עומס העבודה מבצע פעולה על הנתונים האלה.
  5. עומס העבודה משתמש בחשבון השירות $WORKLOAD_SERVICEACCOUNT כדי לכתוב את התוצאות של הפעולה הזו בקטגוריה $SECUNDUS_RESULT_STORAGE_BUCKET.

תהליך עבודה חדש עם תמיכה במאגר תגים חתום

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

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

2. הגדרת משאבי ענן

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

בפרויקט Primus:

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

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

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

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

  • משכפלים את המאגר הזה באמצעות הפקודה שלמטה כדי לקבל את הסקריפטים הנדרשים שמשמשים כחלק מה-codelab הזה.
git clone https://github.com/GoogleCloudPlatform/confidential-space
  • שינוי הספרייה של ה-codelab הזה.
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 bank. מריצים את הסקריפט הבא כדי להגדיר את המשאבים של בנק Primus. במסגרת השלבים האלה, ייעשה שימוש במשאבים הבאים:

  • קטגוריה ב-Cloud Storage‏ ($PRIMUS_INPUT_STORAGE_BUCKET) לאחסון קובץ נתוני הלקוחות המוצפנים של Primus bank.
  • מפתח הצפנה ($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. במסגרת השלבים האלה, ייעשה שימוש במשאבים הבאים:

  • קטגוריה של Cloud Storage‏ ($SECUNDUS_RESULT_STORAGE_BUCKET) לאחסון התוצאה של ביצוע עומס העבודה על ידי בנק Secundus.
./setup_secundus_bank_resources.sh

3. יצירה וחתימה של עומס עבודה

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

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

  • לחשבון השירות של עומס העבודה הזה ($WORKLOAD_SERVICEACCOUNT) יהיו התפקידים הבאים:
  • confidentialcomputing.workloadUser כדי לקבל טוקן אישור
  • logging.logWriter כדי לכתוב יומנים ב-Cloud Logging.
  • objectViewer כדי לקרוא נתונים מקטגוריית אחסון בענן $PRIMUS_INPUT_STORAGE_BUCKET.
  • objectAdmin כדי לכתוב את תוצאת עומס העבודה לקטגוריית Cloud Storage‏ $SECUNDUS_RESULT_STORAGE_BUCKET.
./create_workload_serviceaccount.sh

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

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

  • יוצרים Artifact Registry‏($SECUNDUS_ARTIFACT_REGISTRY) בבעלות Secundus bank.
  • מעדכנים את קוד עומס העבודה בשמות המשאבים הנדרשים. כאן מופיע קוד העומס שמשמש ב-codelab הזה.
  • ליצור קובץ בינארי של Go וקובץ Dockerfile כדי ליצור קובץ אימג' של Docker של קוד עומס העבודה. כאן אפשר לראות את קובץ ה-Dockerfile שמשמש ב-Codelab הזה.
  • יוצרים את קובץ האימג' של Docker ומפרסמים אותו ב-Artifact Registry‏ ($SECUNDUS_ARTIFACT_REGISTRY) שבבעלות Secundus bank.
  • נותנים ל-$WORKLOAD_SERVICEACCOUNT הרשאת קריאה ל-$SECUNDUS_ARTIFACT_REGISTRY. ההרשאה הזו נדרשת כדי שהקונטיינר של עומס העבודה יוכל לשלוף את קובץ אימג' של Docker של עומס העבודה מ-Artifact Registry.
./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. יוצרים אוסף מפתחות ומפתח ב-KMS לחתימה על תמונה של עומס עבודה.
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. מקצים לחשבון השירות $WORKLOAD_SERVICEACCOUNT את התפקיד Viewer (צפייה) במאגר $PRIMUS_COSIGN_REPOSITORY. כך 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 לחתום רק באמצעות צמד מפתחות. אין תמיכה בחתימה ללא מפתח של Cosign בתכונה הזו של תמונת מאגר חתומה.

כשחותמים באמצעות צמד מפתחות, יש שתי אפשרויות:

  1. חתימה באמצעות זוג מפתחות מקומי שנוצר על ידי Cosign.
  2. חתימה באמצעות צמד מפתחות שמאוחסן במקום אחר (לדוגמה, ב-KMS).
  1. אם אין לכם זוג מפתחות, אתם יכולים ליצור אותו ב-Cosign. פרטים נוספים זמינים במאמר בנושא חתימה באמצעות מפתחות בניהול עצמי. כאן ציינו את שתי הדרכים (באופן מקומי ובאמצעות ספק KMS) ליצירת צמד מפתחות ולחתימה על עומס העבודה. צריך לבחור אחת מהדרכים האלה כדי לחתום על מאגר עומס העבודה.
// 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> : מתייחס לפתרון KMS שבו אתם משתמשים
  • ‫<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 [REQUIRED] מציין באיזה מפתח חתימה להשתמש. כשמתייחסים למפתח שמנוהל על ידי ספק KMS, צריך להשתמש בפורמט URI ספציפי מתוך תמיכה ב-Sigstore KMS. כשמתייחסים למפתח שנוצר על ידי 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]
  • ‫- [REQUIRED] מציין הערות שמצורפות למטען הייעודי (payload) של החתימה. בתמונות מאומתות של קונטיינרים של Confidential Space, צריך לצרף את המפתח הציבורי ואת אלגוריתמי החתימה למטען הייעודי (payload) של החתימה.
  • dev.cosignproject.cosign/sigalg ONLY מקבל שלושה ערכים:
  • ‫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 sign יעלה אוטומטית חתימות ל-COSIGN_REPOSITORY. שצוין

4. אישור והרצה של עומס עבודה

מתן הרשאה לעומס עבודה

במסגרת השלב הזה, נגדיר את ספק מאגרי זהויות של עומסי עבודה במאגר זהויות של עומסי עבודה ($PRIMUS_WORKLOAD_IDENTITY_POOL). מוגדרים תנאים למאפיינים של Workload Identity, כפי שמוצג בהמשך. אחד התנאים הוא לאמת את טביעת האצבע של חתימת תמונת עומס העבודה מול טביעת האצבע של המפתח הציבורי לחתימה. עם תנאי המאפיין הזה, כש-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))"

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

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

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

  • קטגוריית אחסון של קלט ב-Primus bank ($PRIMUS_INPUT_STORAGE_BUCKET).
  • חשבון שירות של בנק Primus‏ ($PRIMUS_SERVICEACCOUNT).
  • מאגר Artifact Registry של Primus Bank שמכיל חתימות של תמונות ($PRIMUS_COSIGN_REPOSITORY).
  • מאגר הזהויות של עומסי העבודה של Primus Bank ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • חשבון שירות של עומס עבודה ב-Secundus Bank ($WORKLOAD_SERVICEACCOUNT).
  • מופע מחשוב של עומס עבודה.
  • קטגוריית אחסון התוצאות של Secundus Bank ($SECUNDUS_RESULT_STORAGE_BUCKET).
  • מאגר ארטיפקטים של Secundus Bank‏ ($SECUNDUS_ARTIFACT_REGISTRY).
  • מכונת VM של עומס עבודה של Secundus Bank ($WORKLOAD_VM).
./cleanup.sh

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

  • נכנסים אל Cloud Platform Console.
  • בוחרים את הפרויקט שרוצים לסגור ולוחצים על 'מחיקה' בחלק העליון. הפעולה הזו מתזמנת את הפרויקט למחיקה.

מזל טוב

כל הכבוד, סיימתם את ה-Codelab!

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

מה השלב הבא?

כדאי לעיין במדריכי Codelab דומים נוספים…

קריאה נוספת