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

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

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

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

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

5a86c47d935da998.jpeg

מה תלמדו

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

מה תצטרכו

תפקידים שמעורבים בהגדרה של 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. הגדרת משאבי ענן

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

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

$PRIMUS_INPUT_STORAGE_BUCKET

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

$PRIMUS_WORKLOAD_IDENTITY_POOL

מאגר הזהויות של עומסי העבודה (WIP) של Primus שמאמת את הטענות.

$PRIMUS_WIP_PROVIDER

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

$PRIMUS_SERVICE_ACCOUNT

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

$PRIMUS_ARTIFACT_REPOSITORY

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

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

$SECUNDUS_INPUT_STORAGE_BUCKET

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

$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 לקריאת נתונים מקטגוריה של Cloud Storage (באמצעות תפקיד 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 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 כדי לכתוב את תוצאת עומס העבודה לקטגוריית Cloud Storage‏ $SECUNDUS_RESULT_STORAGE_BUCKET.
./create_workload_service_account.sh

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

במסגרת השלב הזה, תיצרו קובץ אימג' של Docker של עומס העבודה. עומס העבודה ייכתב על ידי Primus. עומס העבודה שמשמש ב-codelab הזה הוא קוד Python של למידת מכונה (ML) שמקבל גישה למודל ה-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.
  • מעדכנים את קוד עומס העבודה בשמות המשאבים הנדרשים.
  • יוצרים את עומס העבודה של ה-ML וקובץ 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 רוצה לתת הרשאה לעומסי עבודה לגשת למודל למידת המכונה שלה על סמך מאפיינים של המשאבים הבאים:

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

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

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

  • מה: הגרסה האחרונה של $WORKLOAD_IMAGE_NAME הועלתה למאגר $PRIMUS_ARTIFACT_REPOSITORY.
  • איפה: סביבת המחשוב האמינה של Confidential Space פועלת בתמונת מכונת ה-VM של Confidential Space שנתמכת באופן מלא.
  • מי: חשבון השירות של 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, תופיע רשומה בתוצאות. הרשומה הזו תכלול שני פריטי מידע חשובים:

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

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

ב-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 Workload image..

הפעלה מחדש של עומס העבודה

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

צריך לוודא שיש תמונת 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 דוחה את האסימון שמוצג על ידי כוח העבודה.

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

  1. מגדירים את הפרויקט לפרויקט $SECUNDUS_PROJECT_ID.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. מוחקים את קובץ התוצאות.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. מוחקים את מופע ה-VM הסודי.
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).
  • מכונות מחשוב של עומס עבודה.
  • קטגוריית אחסון של תוצאות ב-Secundus ($SECUNDUS_RESULT_STORAGE_BUCKET).
$ ./cleanup.sh

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

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

מה השלב הבא?

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