הגדרת תור מאובטח

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

הרעיון הכללי הוא לחלק את המשתמשים ואת הישויות האחרות לשלוש קטגוריות:

  1. אדמינים של תורים – למשתמשים בקבוצה הזו יש הרשאה להתקשר לשיטות ניהול של תורים ב-Cloud Tasks, או להעלות קבצים מסוג queue.yaml. הקבוצה הזו מוגבלת למספר קטן מאוד של משתמשים, כדי לצמצם את הסיכון לשיבוש הגדרת התור, במיוחד בגלל ערבוב לא מכוון של שיטות לניהול תורים של queue.yaml ו-Cloud Tasks.
  2. Cloud Tasks Workers – למשתמשים בקבוצה הזו יש הרשאה לבצע אינטראקציות נפוצות עם Cloud Tasks, כמו הוספת משימות לתור והוצאת משימות מהתור. אסור להם להפעיל שיטות לניהול תורים של Cloud Tasks.
  3. App Engine Deployers – בפרויקטים שיש בהם אפליקציות App Engine, למשתמשים בקבוצה הזו יש הרשאה לפרוס את האפליקציה. אין להם הרשאה להעלות קבצים מסוג queue.yaml או לבצע קריאות ל-Cloud Tasks API, וכך האדמינים של התור יכולים לאכוף את המדיניות המתאימה.

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

אם בפרויקט נעשה שימוש רק בשיטות לניהול תורים של Cloud Tasks, יכול להיות שיהיה הגיוני שאדמינים של תורים לא יהיו גם מפריסים של App Engine, כי זה יאפשר להעלות קובץ queue.yaml שגוי.

פרויקטים וארגונים קטנים

בפרויקטים קטנים ובארגונים קטנים אפשר להקצות תפקידים בניהול הזהויות והרשאות הגישה (IAM) ישירות למשתמשים כדי להוסיף אותם לקבוצות שלמעלה. האפשרות הזו מתאימה לצוותים שמעדיפים הגדרה פשוטה או שמבצעים שינויים בהגדרת התור או פריסות של אפליקציות App Engine באופן ידני.

מוסיפים משתמשים לקבוצות האלה באופן הבא:

מנהל תור

  1. כאדמינים של פרויקט, אתם יכולים להקצות את התפקיד cloudtasks.queueAdmin למשתמשים שמורשים לבצע קריאות ל-API לניהול תורים של Cloud Tasks או להעלות קבצים מסוג queue.yaml.

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:EMAIL \
    --role roles/cloudtasks.queueAdmin

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט
    • EMAIL: כתובת האימייל של המשתמש שהוא חבר בקבוצה
  2. כמשתמש עם תפקיד cloudtasks.queueAdmin, בהתאם לשיטות המומלצות שלמעלה, בוחרים אחת מהשיטות הבאות לשינוי הגדרת התור.

    1. משתמשים ב-Cloud Tasks API כדי לשנות את הגדרת התור.

    2. העלאה של queue.yaml באמצעות gcloud:

      gcloud app deploy queue.yaml

Cloud Tasks Worker

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

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

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.taskDeleter

    מחליפים את PROJECT_ID במזהה הפרויקט.

משתמשים עם אחד או יותר מהתפקידים שצוינו למעלה יכולים ליצור אינטראקציה עם Cloud Tasks API.

App Engine Deployer

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

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:EMAIL \
    --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:EMAIL \
    --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:EMAIL \
    --role roles/storage.admin

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט
    • EMAIL: כתובת האימייל של המשתמש שהוא חבר בקבוצה
  2. כמשתמש עם התפקידים שצוינו למעלה, פורסים אפליקציית App Engine.

    gcloud app deploy app.yaml

פרויקטים וארגונים גדולים

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

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

בהמשך מפורטות הוראות להגדרת חשבונות השירות האלה.

מנהל תור

  1. בתור אדמין בפרויקט, יוצרים את חשבון השירות.

    gcloud iam service-accounts create queue-admin \
    --display-name "Queue Admin"
  2. מקצים לחשבון השירות את התפקיד cloudtasks.queueAdmin כדי שיוכל להעלות קובצי queue.yaml ולבצע קריאות ל-API לניהול תורים של Cloud Tasks.

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:queue-admin@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.queueAdmin

    מחליפים את PROJECT_ID במזהה הפרויקט.

  3. מאפשרים באופן סלקטיבי התחזות לחשבון השירות 'אדמין של תור' שיצרתם.

    בדרך כלל מדובר בקבוצה קטנה של ישויות שפועלות כאדמינים של התור. מקצים לחשבונות המשתמשים האלה את התפקיד iam.serviceAccountTokenCreator בחשבון השירות 'אדמין של תור' שיצרתם. הוראות מפורטות מופיעות במאמר איך נותנים או מבטלים תפקידים בודדים במסמכי ה-IAM.

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

    • שימוש ב-Cloud Tasks כדי לשנות את הגדרות התור.

    • העלאה queue.yaml באמצעות ה-CLI של gcloud

Cloud Tasks Worker

  1. בתור אדמין בפרויקט, יוצרים את חשבון השירות.

    gcloud iam service-accounts create cloud-tasks-worker \
    --display-name "Cloud Tasks Worker"
  2. נותנים לחשבון השירות תפקידים כדי שהוא יוכל לבצע אינטראקציה עם Cloud Tasks, אבל לא יוכל לשנות את הגדרות התור.

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.taskDeleter

    מחליפים את PROJECT_ID במזהה הפרויקט.

  3. מתן הרשאה סלקטיבית להתחזות לחשבון השירות 'Cloud Tasks Worker' שיצרתם.

    לחשבונות ראשיים שפועלים עם Cloud Tasks, צריך להעניק את התפקיד iam.serviceAccountTokenCreator בחשבון השירות 'Cloud Tasks Worker' שיצרתם. כדי ללמוד איך, ראו הענקת או ביטול תפקיד יחיד במאמרי העזרה בנושא IAM.

App Engine Deployer

  1. בתור אדמין בפרויקט, יוצרים את חשבון השירות.

    gcloud iam service-accounts create app-engine-deployer \
    --display-name "App Engine Deployer"
  2. מקצים תפקידים לחשבון השירות כדי שהוא יוכל לפרוס אפליקציות של App Engine אבל לא queue.yaml.

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:app-engine-deployer@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:app-engine-deployer@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:app-engine-deployer@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/storage.admin

    מחליפים את PROJECT_ID במזהה הפרויקט.

  3. מאפשרים באופן סלקטיבי התחזות לחשבון השירות 'App Engine Deployer' שיצרתם.

    כדי לאפשר לחשבונות משתמשים לפרוס שירותי App Engine, צריך להעניק להם את התפקיד iam.serviceAccountTokenCreator בחשבון השירות 'App Engine Deployer' שיצרתם. כדי ללמוד איך, ראו הענקת או ביטול תפקיד יחיד במסמכי התיעוד של IAM.

הגבלת הגישה לתורים בודדים

אם יש לכם כמה תורים בפרויקט ואתם רוצים להגביל את הגישה לתורים ספציפיים, אתם יכולים להשתמש במדיניות IAM ברמת התור במקום ברמת הפרויקט. כדי להגביל את הגישה לפי תור, משתמשים בפקודה gcloud tasks queues add-iam-policy-binding. לדוגמה:

  gcloud tasks queues add-iam-policy-binding QUEUE_NAME --location=LOCATION \
  --member=serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer

מחליפים את מה שכתוב בשדות הבאים:

  • QUEUE_NAME: השם של התור
  • LOCATION: המיקום של התור
  • PROJECT_ID: מזהה הפרויקט

המאמרים הבאים