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

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

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

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

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

5a86c47d935da998.jpeg

מה תלמדו

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

מה צריך להכין

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

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

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

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

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

איך פועל Confidential Space

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

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

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

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

  • כדי לקבל את הסקריפטים הנדרשים שנעשה בהם שימוש במסגרת הקודלאב הזה, צריך ליצור עותק (clone) של המאגר הזה באמצעות הפקודה הבאה.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • שינוי הספרייה של סדנת הקוד הזו.
cd confidential-space/codelabs/ml_model_protection/scripts
  • חשוב לוודא שהגדרתם את משתני הסביבה הנדרשים של הפרויקט, כפי שמתואר בהמשך. מידע נוסף על הגדרת פרויקט ב-GCP זמין בקודלאב הזה. כאן מוסבר איך לאחזר את מזהה הפרויקט ואיך הוא שונה משם הפרויקט וממספר הפרויקט.
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 ייווצר מהשם של הפרויקט, וייווצר משאב חדש ב-Cloud בשם הזה. אלה המשתנים הנתמכים לשמות המשאבים:

$PRIMUS_INPUT_STORAGE_BUCKET

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

$PRIMUS_WORKLOAD_IDENTITY_POOL

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

$PRIMUS_WIP_PROVIDER

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

$PRIMUS_SERVICE_ACCOUNT

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

$PRIMUS_ARTIFACT_REPOSITORY

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

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

$SECUNDUS_INPUT_STORAGE_BUCKET

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

$SECUNDUS_RESULT_STORAGE_BUCKET

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

$WORKLOAD_IMAGE_NAME

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

$WORKLOAD_IMAGE_TAG

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

$WORKLOAD_SERVICE_ACCOUNT

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

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

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

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

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

כחלק מההגדרה של משאבי הענן, נשתמש במודל TensorFlow. אנחנו יכולים לשמור את המודל כולו, שכולל את הארכיטקטורה, המשקלים וההגדרות של האימון, בארכיון ZIP. במסגרת סדנת הקוד הזו, נשתמש במודל 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 Storage ($SECUNDUS_RESULT_STORAGE_BUCKET) לאחסון התוצאה של ביצוע עומס העבודה של למידת המכונה על ידי Secundus.

כאן אפשר למצוא כמה תמונות לדוגמה לקוד הפתוח הזה.

./setup_secundus_company_resources.sh

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • מה: $WORKLOAD_IMAGE_NAME העדכני ביותר שהועלה למאגר $PRIMUS_ARTIFACT_REPOSITORY.
  • איפה: סביבת המחשוב המהימנה של Confidential Space פועלת בתמונת ה-VM של Confidential Space שנתמכת במלואה.
  • Who: חשבון השירות Secundus $WORKLOAD_SERVICE_ACCOUNT.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG  --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
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"

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

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

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --project=${SECUNDUS_PROJECT_ID} \
 --maintenance-policy=MIGRATE \
 --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}

הצגת התוצאות

אחרי שהעומס יושלם, התוצאה של עומס העבודה של ה-ML תפורסם ב-$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 predicted_class: זהו אינדקס מספרי שמייצג את הכיתה שהמודל צופה שהתמונה שייכת אליה.
  • Top_k_predictions: הפונקציה הזו מספקת עד k תחזיות לתמונה, לפי דירוג מהסבירות הגבוהה ביותר לסבירות הנמוכה ביותר. הערך של k מוגדר ל-5 ב-codelab הזה, אבל אפשר לשנות אותו בקוד של עומס העבודה כדי לקבל יותר או פחות תחזיות.

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

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

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

מחיקת קובץ התוצאות הקיים ומכונה וירטואלית

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

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

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --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=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 ($PRIMUS_INPUT_STORAGE_BUCKET).
  • חשבון השירות של Primus ($PRIMUS_SERVICEACCOUNT).
  • מאגר פריטי מידע שנוצרו בתהליך פיתוח (Artifact) של Primus‏ ($PRIMUS_ARTIFACT_REPOSITORY).
  • מאגר הזהויות של כוח העבודה ב-Primus‏ ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • חשבון השירות של כוח העבודה של Secundus‏ ($WORKLOAD_SERVICEACCOUNT).
  • קטגוריית האחסון של הקלט של Secundus‏ ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • מכונות Compute של כוח עבודה.
  • קטגוריית האחסון של התוצאה של Secundus‏ ($SECUNDUS_RESULT_STORAGE_BUCKET).
$ ./cleanup.sh

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

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

מה השלב הבא?

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