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

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

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

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

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

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

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

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

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

מה תלמדו

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

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

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

מה צריך להכין

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

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

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

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

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

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

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

בקודלאב הזה מתייחסים למספר משתנים שצריך להגדיר להם ערכים מתאימים לפרויקט ב-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: ספק מאגר הזהויות של כוח העבודה שכולל את תנאי ההרשאה לשימוש באסימונים שנחתמו על ידי שירות אימות האימות (attestation).
  • $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: מאגר הארטיפקטים שאליו ישולח קובץ האימג' של Docker של עומס העבודה.
  • $WORKLOAD_IMAGE_NAME: השם של קובץ האימג' של עומס העבודה ב-Docker.
  • $WORKLOAD_IMAGE_TAG: התג של קובץ האימג' של עומס העבודה ב-Docker.
  • $WORKLOAD_SERVICEACCOUNT: חשבון השירות שיש לו הרשאה לגשת למכונה הווירטואלית הסודית שמריצה את עומס העבודה.
  • $SECUNDUS_RESULT_BUCKET: הקטגוריה שבה מאוחסנים התוצאות של עומס העבודה.

מקורות מידע נוספים:

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

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

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

  1. עומס העבודה מבקש אסימון גישה כללי של Google ל-$PRIMUS_SERVICEACCOUNT מה-WIP. הוא מציע אסימון שירות של גורם אימות עם הצהרות על עומסי עבודה ועל סביבות.
  2. אם הצהרות המדידה של עומסי העבודה באסימון השירות של שירות האימות תואמות לתנאי המאפיין ב-WIP, המערכת מחזירה את אסימון הגישה של $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. אם הצהרות החתימה של הקונטיינר באסימון השירות של 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. אלה המקורות החדשים ב-Codelab הזה:

בפרויקט Primus:

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

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

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

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

  • כדי לקבל את הסקריפטים הנדרשים שנעשה בהם שימוש במסגרת הקודלאב הזה, צריך ליצור עותק (clone) של המאגר הזה באמצעות הפקודה הבאה.
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 Bank. מריצים את הסקריפט הבא כדי להגדיר את המשאבים של בנק 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. במסגרת השלבים האלה, המשאבים הבאים ייווצרו:

  • קטגוריה של Cloud Storage ($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 של כוח עבודה. עומס העבודה שנעשה בו שימוש ב-Codelab הזה הוא אפליקציית Go פשוטה מבוססת-CLI שמספרת לקוחות (מנתוני הלקוחות של בנק Primus) ממיקום גיאוגרפי שצוין בארגומנט. מריצים את הסקריפט הבא כדי ליצור עומס עבודה שבו מתבצעים השלבים הבאים:

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

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

  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 [חובה] קובע באיזה מפתח חתימה להשתמש. כשמדברים על מפתח שמנוהל על ידי ספק 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]
  • -a [חובה] מציין הערות שמצורפות לעומס העבודה של החתימה. בתמונות קונטיינר חתומות של Confidential Space, צריך לצרף את המפתח הציבורי ואת אלגוריתמי החתימה לעומס השימושי של החתימה.
  • השדה dev.cosignproject.cosign/sigalg מקביל לשלושה ערכים:
  • RSASSA_PSS_SHA256: אלגוריתם RSASSA עם חיפוי PSS עם סיכום SHA256.
  • RSASSA_PKCS1V15_SHA256: אלגוריתם RSASSA עם תוספת שטח (padding) של PKCS#1 v1.5 עם סיכום SHA256.
  • ECDSA_P256_SHA256: ‏ ECDSA על עקומה P-256 עם סיכום SHA256. זהו גם אלגוריתם החתימה שמוגדר כברירת מחדל לזוגות מפתחות שנוצרו באמצעות Cosign.
  1. העלאת חתימות למאגר Docker

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

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

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

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

הפעלת עומס עבודה

כחלק מהשלב הזה, נפעיל את עומס העבודה ב-Confidential VM. הארגומנטים הנדרשים ל-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 ($PRIMUS_INPUT_STORAGE_BUCKET).
  • חשבון השירות של בנק Primus ($PRIMUS_SERVICEACCOUNT).
  • מאגר הארטיפקטים של Primus Bank שמכיל חתימות על תמונות ($PRIMUS_COSIGN_REPOSITORY).
  • מאגר הזהויות של כוח העבודה של Primus Bank‏ ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • חשבון שירות של כוח עבודה ב-Secundus Bank‏ ($WORKLOAD_SERVICEACCOUNT).
  • מכונה של Compute לעומסי עבודה.
  • קטגוריית האחסון של התוצאות של בנק Secundus‏ ($SECUNDUS_RESULT_STORAGE_BUCKET).
  • מאגר הארטיפקטים של בנק Secundus‏ ($SECUNDUS_ARTIFACT_REGISTRY).
  • מכונה וירטואלית של כוח עבודה ב-Secundus Bank‏ ($WORKLOAD_VM).
./cleanup.sh

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

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

מזל טוב

מזל טוב, סיימת את הקודלהב!

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

מה השלב הבא?

כדאי לעיין בחלק מהמדריכים הבאים בנושא Codelab…

מקורות מידע נוספים