אבטחת מודלים של למידת מכונה וקניין רוחני באמצעות Confidential Space

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

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

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

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

5a86c47d935da998.jpeg

מה תלמדו

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

מה צריך להכין

התפקידים שמעורבים בהגדרה של Confidential Space

ב-Codelab הזה, החברה Primus תהיה הבעלים של המשאב ומחברת עומס העבודה, שיהיה אחראי על הדברים הבאים:

  1. הגדרת משאבי ענן נדרשים באמצעות מודל למידת מכונה
  2. כתיבת הקוד של עומס העבודה
  3. פרסום התמונה של עומס העבודה
  4. הגדרת מדיניות מאגר זהויות של עומסי עבודה כדי להגן על מודל למידת מכונה מפני מפעיל לא מהימן

חברת Secundus תהיה המפעילה שאחראית על:

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

איך פועל Confidential Space

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

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

2. הגדרה של משאבי Cloud

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

  • משכפלים את המאגר הזה באמצעות הפקודה הבאה כדי לקבל את הסקריפטים הנדרשים שמשמשים כחלק מה-Codelab הזה.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • משנים את הספרייה של ה-Codelab הזה.
cd confidential-space/codelabs/ml_model_protection/scripts
  • חשוב לוודא שהגדרתם את משתני הסביבה הנדרשים של הפרויקט, כפי שמוצג בהמשך. מידע נוסף על הגדרה של פרויקט GCP זמין ב-Codelab הזה. כאן מוסבר איך מאחזרים את מזהה הפרויקט, ואיך הוא שונה משם הפרויקט ומספר הפרויקט.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
  • מפעילים חיוב בפרויקטים.
  • להפעיל את Confidential Computing API ואת ממשקי ה-API הבאים בשני הפרויקטים.
gcloud services enable \
    cloudapis.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • מקצים ערכים למשתנים לשמות המשאבים שצוינו למעלה, באמצעות הפקודה הבאה. המשתנים האלה מאפשרים להתאים אישית את שמות המשאבים לפי הצורך, וגם להשתמש במשאבים קיימים אם הם כבר נוצרו. (למשל, export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket')
  1. אפשר להגדיר את המשתנים הבאים עם שמות קיימים של משאבי ענן בפרויקט Primus. אם המשתנה מוגדר, המערכת תשתמש במשאב הענן המתאים שכבר קיים מפרויקט Primus. אם לא מגדירים את המשתנה, המערכת יוצרת שם של משאב ב-Cloud לפי שם הפרויקט, ומשאב חדש בענן ייווצר עם השם הזה. אלה המשתנים הנתמכים לשמות משאבים:

$PRIMUS_INPUT_STORAGE_BUCKET

הקטגוריה שמאחסנת את מודל למידת המכונה של פרימוס.

$PRIMUS_WORKLOAD_IDENTITY_POOL

מאגר זהויות של כוח עבודה (WIP) של Primus שמאמת הצהרות.

$PRIMUS_WIP_PROVIDER

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

$PRIMUS_SERVICE_ACCOUNT

חשבון שירות של Primus שמשמש את $PRIMUS_WORKLOAD_IDENTITY_POOL כדי לגשת למשאבים המוגנים (מודל למידת מכונה ב-Codelab הזה). בשלב הזה יש לה הרשאה לקרוא את המודל של למידת המכונה שמאוחסן בקטגוריה $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ARTIFACT_REPOSITORY

מאגר פריטי המידע שנוצרו בתהליך הפיתוח (Artifact) שבו תישלח קובץ האימג' של Docker של עומס העבודה.

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

$SECUNDUS_INPUT_STORAGE_BUCKET

הקטגוריה שמאחסנת את התמונות לדוגמה ש-Secundus רוצה לסווג באמצעות המודל שסופק על ידי Primus.

$SECUNDUS_RESULT_STORAGE_BUCKET

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

$WORKLOAD_IMAGE_NAME

שם קובץ האימג' של הקונטיינר של עומס העבודה.

$WORKLOAD_IMAGE_TAG

התג של קובץ האימג' של הקונטיינר של עומס העבודה.

$WORKLOAD_SERVICE_ACCOUNT

חשבון השירות שיש לו הרשאת גישה ל-Confidential VM שמריץ את עומס העבודה.

  • תצטרכו הרשאות מסוימות לשני הפרויקטים האלה. כדאי לעיין במדריך הזה כדי ללמוד איך מקצים תפקידי IAM באמצעות מסוף GCP:
  • בשביל $PRIMUS_PROJECT_ID צריך את ההרשאות 'אדמין אחסון', 'אדמין ב-Artifact Registry', 'אדמין של חשבון שירות', 'אדמין של מאגר זהויות של כוח עבודה ב-IAM'.
  • ל-$SECUNDUS_PROJECT_ID נדרשות אדמין של Compute, אדמין אחסון, אדמין של חשבון שירות, אדמין של מאגר זהויות של כוח עבודה ב-IAM, אדמין לענייני אבטחה (אופציונלי).
  • מריצים את הסקריפט הבא כדי להגדיר את שמות המשתנים שנותרו לערכים בהתאם למזהה הפרויקט שלכם לשמות המשאבים.
source config_env.sh

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

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

  • קטגוריה של אחסון בענן ($PRIMUS_INPUT_STORAGE_BUCKET) לאחסון מודל למידת המכונה של פרימוס.
  • מאגר זהויות של עומסי עבודה ($PRIMUS_WORKLOAD_IDENTITY_POOL) כדי לאמת תלונות על סמך תנאי מאפיינים שהוגדרו בספק שלו.
  • חשבון שירות ($PRIMUS_SERVICEACCOUNT) שמצורף למאגר הזהויות של כוח העבודה שצוין למעלה ($PRIMUS_WORKLOAD_IDENTITY_POOL), עם גישת IAM לקריאת נתונים מקטגוריית האחסון בענן (באמצעות התפקיד objectViewer) ולקישור חשבון השירות הזה למאגר הזהויות של כוח העבודה (באמצעות התפקיד roles/iam.workloadIdentityUser).

כחלק מתהליך ההגדרה של משאבי הענן, נשתמש במודל של TensorFlow. אנחנו יכולים לשמור בארכיון ZIP את המודל כולו, שכולל את הארכיטקטורה, המשקולות ותצורת האימון. למטרה ב-Codelab הזה, נשתמש במודל MobileNet V1 שאומן לפי מערך הנתונים ImageNet שנמצא כאן.

./setup_primus_company_resources.sh

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

  1. מורידים מכאן את המודל שעבר אימון מראש.
  2. לאחר ההורדה, משנים את השם של קובץ tar שהורדתם ל-model.tar.gz.
  3. מפרסמים את הקובץ model.tar.gz בקטגוריה של Cloud Storage באמצעות הפקודה הבאה מהספרייה שמכילה את הקובץ model.tar.gz.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/

הגדרת המשאבים של חברת Secundus

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

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

כאן אפשר למצוא כמה תמונות לדוגמה ב-Codelab הזה.

./setup_secundus_company_resources.sh

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

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

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

לחשבון השירות הזה של עומס העבודה ($WORKLOAD_SERVICEACCOUNT) יהיו התפקידים הבאים:

  • confidentialcomputing.workloadUser כדי לקבל אסימון אימות (attestation)
  • logging.logWriter כדי לכתוב יומנים ב-Cloud Logging.
  • objectViewer כדי לקרוא נתונים מהקטגוריה $SECUNDUS_INPUT_STORAGE_BUCKET של אחסון בענן.
  • objectUser כדי לכתוב את התוצאה של עומס העבודה בקטגוריה $SECUNDUS_RESULT_STORAGE_BUCKET של אחסון בענן.
./create_workload_service_account.sh

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

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

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

זוהי ה-method run_inference() של עומס העבודה שייווצר ב-Codelab הזה. הקוד המלא של עומס העבודה מופיע כאן.

def run_inference(image_path, model):
  try:
    # Read and preprocess the image
    image = tf.image.decode_image(tf.io.read_file(image_path), channels=3)
    image = tf.image.resize(image, (128, 128))
    image = tf.image.convert_image_dtype(image, tf.float32)
    image = tf.expand_dims(image, axis=0)

    # Get predictions from the model
    predictions = model(image)
    predicted_class = np.argmax(predictions)

    top_k = 5
    top_indices = np.argsort(predictions[0])[-top_k:][::-1]

    # Convert top_indices to a TensorFlow tensor
    top_indices_tensor = tf.convert_to_tensor(top_indices, dtype=tf.int32)

    # Use TensorFlow tensor for indexing
    top_scores = tf.gather(predictions[0], top_indices_tensor)

    return {
        "predicted_class": int(predicted_class),
        "top_k_predictions": [
            {"class_index": int(idx), "score": float(score)}
            for idx, score in zip(top_indices, top_scores)
        ],
    }
  except Exception as e:
    return {"error": str(e)}

מריצים את הסקריפט הבא כדי ליצור עומס עבודה שבו מבצעים את השלבים הבאים:

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

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

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

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

ב-Primus רוצים לתת לעומסי עבודה הרשאה לגשת למודל למידת המכונה שלהם על סמך מאפיינים של המשאבים הבאים:

  • מה: קוד מאומת
  • איפה: סביבה מאובטחת
  • מי: אופרטור מהימן

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

מאגר זהויות של כוח עבודה כבר נוצר בשלב מוקדם יותר במסגרת שלב ההגדרה של משאבי הענן. עכשיו Primus תיצור ספק חדש של מאגר זהויות של כוח עבודה ב-OIDC. הערך שצוין בשדה --attribute-condition מאפשר גישה למאגר התגים של עומס העבודה. נדרשות לו:

  • מה: העלאות אחרונות של $WORKLOAD_IMAGE_NAME למאגר $PRIMUS_ARTIFACT_REPOSITORY.
  • איפה: סביבת הביצוע המהימנה של Confidential Space פועלת בתמונת ה-VM של Confidential Space שנתמכת באופן מלא.
  • מי: חשבון שירות של Secundus $WORKLOAD_SERVICE_ACCOUNT.
export WORKLOAD_IMAGE_DIGEST=$(docker images digests ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}| awk 'NR>1{ print $3 }')
gcloud config set project $PRIMUS_PROJECT_ID
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 && 
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
 assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICEACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

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

כחלק מהשלב הזה, נפעיל את עומס העבודה ב-Confidential Space VM. ארגומנטים מסוג TEE הנדרשים מועברים באמצעות דגל המטא-נתונים. הארגומנטים של מאגר עומסי העבודה מועברים באמצעות "tee-cmd" של הדגל. תוצאת הביצוע של עומס העבודה תפורסם בכתובת $SECUNDUS_RESULT_STORAGE_BUCKET.

gcloud config set project $SECUNDUS_PROJECT_ID
gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

הצגת התוצאות

אחרי שעומס העבודה יושלם, תוצאת עומס העבודה של למידת מכונה תפורסם ב-$SECUNDUS_RESULT_STORAGE_BUCKET.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

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

Image: sample_image_1.jpeg, Response: {'predicted_class': 531, 'top_k_predictions': [{'class_index': 531, 'score': 12.08437442779541}, {'class_index': 812, 'score': 10.269512176513672}, {'class_index': 557, 'score': 9.202644348144531}, {'class_index': 782, 'score': 9.08737564086914}, {'class_index': 828, 'score': 8.912498474121094}]}

Image: sample_image_2.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 9.53619384765625}, {'class_index': 557, 'score': 7.928380966186523}, {'class_index': 783, 'score': 7.70129919052124}, {'class_index': 531, 'score': 7.611623287200928}, {'class_index': 906, 'score': 7.021416187286377}]}

Image: sample_image_3.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 6.09878396987915}, {'class_index': 447, 'score': 5.992854118347168}, {'class_index': 444, 'score': 5.9582319259643555}, {'class_index': 816, 'score': 5.502010345458984}, {'class_index': 796, 'score': 5.450454235076904}]}

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

  • Index of spend_class: זהו אינדקס מספרי שמייצג את המחלקה שאליה המודל חוזים שהתמונה שייכת.
  • Top_k_predictions: הערך הזה מספק עד k חיזויים לתמונה, מהדירוג הגבוה ביותר לנמוך ביותר. הערך של k מוגדר ל-5 ב-Codelab הזה, אבל אפשר לשנות אותו בקוד של עומס העבודה כדי לקבל יותר או פחות חיזויים.

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

בשיעור ה-Codelab הזה הדגמנו שמודל בבעלות Primus שמשוחרר רק לעומס העבודה שפועל ב-TEE. Secundus מפעילה את עומס העבודה של למידת מכונה בסביבת TEE, ועומס העבודה הזה יכול לצרוך את המודל שבבעלות Primus, אבל ל-Primus יש שליטה מלאה על המודל.

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

Secundus משנה את התמונה של עומס העבודה על ידי שליפת תמונה אחרת של עומס עבודה ממאגר ארטיפקטים שלו, שלא אושר על ידי Primus. מאגר זהויות של עומסי עבודה של Primus אישר רק תמונה אחת (${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG) של עומס עבודה.

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

כש-Secundus ינסה להריץ את עומס העבודה המקורי עם קובץ האימג' החדש של עומס העבודה הזה, הוא ייכשל. כדי להציג את השגיאה, צריך למחוק את קובץ התוצאות המקורי ואת ה-VM, ואז לנסות להריץ שוב את עומס העבודה.

צריך לוודא שמפורסמת תמונת Docer חדשה במרשם של פריטי המידע שנוצרו בתהליך הפיתוח (Artifact) של Secundus (כ-us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}) ושחשבון השירות של עומסי העבודה ($WORKLOAD_SERVICEACCOUNT) העניק לקורא במרשם של פריטי המידע שנוצרו בתהליך הפיתוח (Artifact) הרשאה לקרוא את התמונה החדשה של עומס העבודה. המטרה היא לוודא שעומס העבודה לא יוצא לפני שמדיניות ה-WIP של Primus דוחה את האסימון שמוצג על ידי עומס העבודה.

מחיקת קובץ תוצאות קיים ומופע VM

  1. מגדירים את הפרויקט לפרויקט $SECUNDUS_PROJECT_ID.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. מוחקים את קובץ התוצאות.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. מחיקת המכונה של Confidential VM.
gcloud compute instances delete ${WORKLOAD_VM}

מריצים את עומס העבודה הלא מורשה:

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \ 
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

הצגת השגיאה

במקום התוצאות של עומס העבודה, מופיעה שגיאה (The given credential is rejected by the attribute condition).

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

5. הסרת המשאבים

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

  • קטגוריית אחסון קלט של פרימוס ($PRIMUS_INPUT_STORAGE_BUCKET).
  • חשבון שירות של Primus ($PRIMUS_SERVICEACCOUNT).
  • מאגר ארטיפקטים של פרימוס ($PRIMUS_ARTIFACT_REPOSITORY).
  • מאגר זהויות של כוח עבודה ב-Primus ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • חשבון שירות עומס עבודה של Secundus ($WORKLOAD_SERVICEACCOUNT).
  • קטגוריית אחסון קלט של Secundus ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • מכונות מחשוב של עומסי עבודה (workloads).
  • קטגוריית האחסון של התוצאה של Secundus ($SECUNDUS_RESULT_STORAGE_BUCKET).
$ ./cleanup.sh

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

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

מה השלב הבא?

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