הגדרת גישה מבוססת-משאבים

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

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

  • קוראים את הסקירה הכללית על תנאי ניהול זהויות והרשאות גישה (IAM) כדי להבין את העקרונות הבסיסיים של קישורי תפקידים מותנים ב-IAM.
  • מעיינים במאפייני המשאבים שאפשר להשתמש בהם בביטוי תנאי.
  • מאפיין של שם משאב יכול לשלוט בגישה לשירותים הבאים Google Cloud :
    • Apigee
    • Application Integration
    • Apigee API Hub
    • שירות Backup and DR
    • BigQuery
    • BigQuery Reservation API
    • Bigtable
    • Binary Authorization
    • Cloud Deploy
    • Cloud Key Management Service
    • Cloud Logging
    • Cloud SQL
    • Cloud Storage
    • Compute Engine
    • Dataform
    • Google Kubernetes Engine
    • Firestore
    • Cloud NGFW
    • Integration Connectors
    • שירות מנוהל של Google Cloud ל-Apache Kafka
    • Network Security Integration
    • Parameter Manager
    • Pub/Sub Lite
    • Secret Manager
    • Spanner

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות לניהול של קישורי תפקידים מותנים, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

  • כדי לנהל את הגישה לפרויקטים: אדמין IAM של פרויקט (roles/resourcemanager.projectIamAdmin) בפרויקט
  • כדי לנהל את הגישה לתיקיות: אדמין תיקיות (roles/resourcemanager.folderAdmin) בתיקייה
  • כדי לנהל את הגישה לפרויקטים, לתיקיות ולארגונים: אדמין של ארגון (roles/resourcemanager.organizationAdmin) באותו ארגון
  • כדי לנהל את הגישה כמעט לכל Google Cloud המשאבים: אדמין לענייני אבטחה (roles/iam.securityAdmin) בפרויקט, בתיקייה או בארגון שבהם רוצים לנהל את הגישה למשאבים

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

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

ההרשאות הנדרשות

כדי לנהל קישורי תפקידים מותנים, נדרשות ההרשאות הבאות:

  • כדי לנהל גישה לפרויקטים:
    • resourcemanager.projects.getIamPolicy בפרויקט
    • resourcemanager.projects.setIamPolicy בפרויקט
  • כדי לנהל גישה לתיקיות:
    • resourcemanager.folders.getIamPolicy בתיקייה
    • resourcemanager.folders.setIamPolicy בתיקייה
  • כדי לנהל גישה לארגונים:
    • resourcemanager.organizations.getIamPolicy בארגון
    • resourcemanager.organizations.setIamPolicy בארגון

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

הענקת גישה לקבוצת משאבים על סמך תחיליות לשמות של משאבים

אפשר להשתמש בקישור תפקידים מותנה כדי להעניק גישה לחשבונות משתמשים בשביל משאבים שהשמות שלהם תואמים לתחילית. למשל, מכונות וירטואליות (VM) של Compute Engine שהשמות שלהן מתחילים במחרוזת מסוימת. התחילית של שם המשאב משמשת בדרך כלל לקיבוץ משאבים שנועדו למטרה מסוימת או שיש להם מאפיינים מסוימים.

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

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

כדי להעניק גישה על סמך תחילית שם לדיסקים ולמכונות של Compute Engine בפרויקט:

המסוף

  1. נכנסים לדף IAM במסוף Google Cloud .

    כניסה לדף IAM

  2. מאתרים את חשבון המשתמש הרצוי מרשימת חשבונות המשתמשים ולוחצים על הלחצן .

  3. בחלונית Edit permissions מאתרים את התפקיד שרוצים להגדיר תנאי לגביו. לאחר מכן, בקטע IAM condition (optional), לוחצים על Add IAM condition.

  4. בחלונית Edit condition נותנים לתנאי שם, ואפשר לתת לו גם תיאור.

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

    הכלי להגדרת תנאים:

    1. מוחקים את כל שדות התנאים הקיימים מהכלי להגדרת תנאים. השדה היחיד בכלי להגדרת התנאים צריך להיות הלחצן הוספה.
    2. יוצרים ביטוי של תנאי מקובץ שהערך שלו הוא true אם המשאב הוא דיסק שמתחיל בקידומת שצוינה:
      1. לוחצים על התפריט הנפתח Add ואז לוחצים על Grouped conditions.
      2. בתפריט הנפתח Condition type בוחרים באפשרות Resource > Type.
      3. בתפריט הנפתח Operator, בוחרים באפשרות is.
      4. בתפריט הנפתח Resource Type בוחרים באפשרות compute.googleapis.com/Disk.
      5. לוחצים על הלחצן Add הראשון שנמצא ממש מתחת לתנאי שהזנתם, כדי להוסיף תנאי נוסף לביטוי.
      6. בתפריט הנפתח Condition type בוחרים באפשרות Resource > Name.
      7. בתפריט הנפתח Operator, בוחרים באפשרות Starts with.
      8. בשדה Value מזינים את שם המשאב, כולל הקידומת הרצויה, בפורמט המתאים. לדוגמה, אפשר להשתמש ב-projects/PROJECT_ID/region/ZONE_ID/disks/PREFIX כדי לזהות דיסקים בפרויקט PROJECT_ID ובאזור ZONE_ID שהשמות שלהם מתחילים ב-PREFIX.
      9. בצד שמאל של כל סוג תנאי, לוחצים על And כדי להגדיר ששני התנאים צריכים להתקיים.
    3. יוצרים ביטוי של תנאי מקובץ ששווה ל-true אם המשאב הוא מופע שמתחיל בקידומת שצוינה:
      1. לוחצים על הלחצן Add מחוץ לקבוצת התנאים הקיימת ואז לוחצים על Grouped conditions.
      2. בתפריט הנפתח Condition type בוחרים באפשרות Resource > Type.
      3. בתפריט הנפתח Operator, בוחרים באפשרות is.
      4. בתפריט הנפתח Resource Type בוחרים באפשרות compute.googleapis.com/Instance.
      5. באותה קבוצת תנאים, לוחצים על הוספה.
      6. בתפריט הנפתח Condition type בוחרים באפשרות Resource > Name.
      7. בתפריט הנפתח Operator, בוחרים באפשרות Starts with.
      8. בשדה Value מזינים את שם המשאב עם הקידומת הרצויה בפורמט המתאים. לדוגמה, אפשר להשתמש ב-projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX כדי לזהות מכונות בפרויקט PROJECT_ID ובאזור ZONE_ID ששמותיהן מתחילים ב-PREFIX.
      9. מוודאים שאופרטור הלוגיקה שמקשר בין התנאים בקבוצה מוגדר ל-And.
    4. יוצרים ביטוי של תנאי מקובץ ששווה ל-true אם המשאב הוא לא דיסק או מופע:
      1. לוחצים על הלחצן Add מחוץ לקבוצות התנאים הקיימות ואז לוחצים על Grouped conditions.
      2. בתפריט הנפתח Condition type בוחרים באפשרות Resource > Type.
      3. בתפריט הנפתח Operator, בוחרים באפשרות is not.
      4. בתפריט הנפתח Resource Type בוחרים באפשרות compute.googleapis.com/Disk.
      5. באותה קבוצת תנאים, לוחצים על הוספה.
      6. בתפריט הנפתח Condition type בוחרים באפשרות Resource > Type.
      7. בתפריט הנפתח Operator, בוחרים באפשרות is not.
      8. בתפריט הנפתח Resource Type בוחרים באפשרות compute.googleapis.com/Instance.
      9. מוודאים שאופרטור הלוגיקה שמקשר בין התנאים בקבוצה מוגדר ל-And.
    5. מוודאים שאופרטור הלוגיקה שמקשר בין כל קבוצות הביטויים של התנאים הוא Or.

      בסיום התהליך, הכלי להגדרת תנאים אמור להיראות בערך כך:

    6. לוחצים על Save כדי להחיל את התנאי.

    7. אחרי שהחלונית Edit condition נסגרת, לוחצים שוב על Save בחלונית Edit permissions כדי לעדכן את מדיניות ההרשאות.

    עורך התנאים:

    1. לוחצים על הכרטיסייה Condition editor ומזינים את הביטוי הבא:

      (resource.type == "compute.googleapis.com/Disk" &&
      resource.name.startsWith("projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX")) ||
      (resource.type == "compute.googleapis.com/Instance" &&
      resource.name.startsWith("projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX")) ||
      (resource.type != "compute.googleapis.com/Disk" &&
      resource.type != "compute.googleapis.com/Instance")
    2. אחרי הזנת הביטוי, אפשר לבחור כלי לאיתור שגיאות בקוד (lint) כדי לבדוק את התחביר של CEL. באמצעות לחיצה על Run Linter מעל תיבת הטקסט בפינה הימנית העליונה.

    3. לוחצים על Save כדי להחיל את התנאי.

    4. לאחר שהחלונית Edit condition נסגרה, לוחצים שוב על Save בחלונית Edit permissions כדי לעדכן את מדיניות ההרשאה.

gcloud

כללי מדיניות ההרשאה מוגדרים באמצעות התבנית קריאה-שינוי-כתיבה.

מפעילים את הפקודה gcloud projects get-iam-policy כדי לקבל את מדיניות ההרשאה הנוכחית בשביל הפרויקט. בדוגמה הבאה, מתבצעת הורדה של גרסת ה-JSON של מדיניות ההרשאה לנתיב בדיסק.

פקודה:

gcloud projects get-iam-policy project-id --format=json > filepath

מתבצעת הורדה של פורמט ה-JSON של מדיניות ההרשאה:

{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "group:my-group@example.com"
      ],
      "role": "roles/compute.instanceAdmin"
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 1
}

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

{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "group:my-group@example.com"
      ],
      "role": "roles/compute.instanceAdmin",
      "condition": {
          "title": "PREFIX_only",
          "description": "Only gives access to VMs with the PREFIX prefix",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

בשלב הבא מגדירים את מדיניות ההרשאות החדשה על-ידי הפעלת הפקודה gcloud projects set-iam-policy:

gcloud projects set-iam-policy project-id filepath

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

  • חברים בקישור התפקידים יכולים להשתמש בהרשאות לדיסקים ולמכונות רק כדי לגשת לדיסקים ולמכונות שהשמות שלהם מתחילים בתחילית שצוינה
  • חברים בקישור התפקיד יכולים להשתמש בכל שאר ההרשאות בתפקיד אדמין מכונות (roles/compute.instanceAdmin) כדי לגשת לכל המשאבים מלבד דיסקים ומופעים.

REST

באמצעות התבנית קריאה-שינוי-כתיבה אפשר לגשת למשאבים ספציפיים.

קודם כל, צריך לקרוא את מדיניות ההרשאה של הפרויקט:

ה-method projects.getIamPolicy של ה-API של מנהל המשאבים מחזירה את מדיניות ההרשאות של הפרויקט.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
  • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן אחזור מדיניות.

ה-method של ה-HTTP וכתובת ה-URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy

תוכן בקשת JSON:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:my-user@example.com
      ]
    },
    {
      "members": [
        "group:my-group@example.com"
      ],
      "role": "roles/compute.instanceAdmin"
    }
  ]
}

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

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:my-user@example.com"
      ]
    },
    {
      "role": "roles/compute.instanceAdmin",
      "members": [
        "group:my-group@example.com"
      ],
      "condition": {
          "title": "PREFIX_only",
          "description": "Only gives access to VMs with the PREFIX prefix",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
      }
    }
  ]
}

לבסוף, כותבים את מדיניות ההרשאה המעודכנת:

ה-method projects.setIamPolicy של ה-API של מנהל המשאבים מגדירה את מדיניות ההרשאה שנשלחה בבקשה בתור המדיניות החדשה של הפרויקט.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.

ה-method של ה-HTTP וכתובת ה-URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

תוכן בקשת JSON:

{
  "policy": {
    "version": 3,
    "etag": "BwWKmjvelug=",
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:my-user@example.com"
        ]
      },
      {
        "role": "roles/compute.instanceAdmin",
        "members": [
          "group:my-group@example.com"
        ],
        "condition": {
          "title": "Dev_access_only",
          "description": "Only access to devAccess* VMs",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
        }
      }
    ]
  }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

התגובה מכילה את מדיניות ההרשאה המעודכנת.


חילוץ ערכים משמות משאבים

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

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

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

דוגמה: התאמת הזמנות מ-30 הימים האחרונים

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

projects/_/buckets/acme-orders-aaa/objects/data_lake/orders/order_date=2019-11-03/aef87g87ae0876

נניח שאתם רוצים לאפשר לחשבון משתמש לגשת לכל הזמנה מ-30 הימים האחרונים. התנאי הבא תואם לאובייקטים של Cloud Storage בשביל ההזמנות האלה. נשתמש בפונקציות duration() ו-date() כדי לחסר 30 יום (2,592,000 שניות) מזמן הבקשה, ואז נשווה את חותמת הזמן הזו לתאריך ההזמנה:

resource.type == 'storage.googleapis.com/Object' &&
  request.time - duration('2592000s') < date(resource.name.extract('/order_date={date_str}/'))

מידע נוסף על הפונקציות date() ו-duration(), מופיע במאמר הסבר על מאפיין תאריך/שעה.

דוגמה: התאמת מכונות VM של Compute Engine בכל מיקום

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

הפורמט של שם המשאב למכונה הוירטואלית דומה ל-projects/PROJECT_ID/zones/ZONE_ID/instances/INSTANCE_ID. התנאי הבא מקבל ערך true למכונות וירטואליות שהשם שלהן מתחיל במחרוזת dev-, וגם לכל סוגי המשאבים שהם לא מכונות וירטואליות:

resource.type != 'compute.googleapis.com/Instance' ||
  resource.name.extract('/instances/{name}').startsWith('dev-')

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

שיקולים חשובים בשימוש בתנאים מבוססי-משאבים

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

תנאים שעברו בירושה

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

כשמשתמשים במאפיינים ברמת הארגון, התיקייה או הפרויקט, חשוב לזכור שרוב המאפיינים זמינים רק לסוגי משאבים ספציפיים. אם חלק מתנאי מסוים ישתמש במאפיין שלא זמין למשאב, החלק הזה של התנאי אף פעם לא יפורש כמתן גישה. לדוגמה, התנאי resource.name.endsWith == devResource אף פעם לא מעניק גישה למשאב IAM כלשהו, כי משאבי IAM לא מספקים את שם המשאב.

כדי למנוע את הבעיה, השתמשו במאפיינים של סוג המשאב ושירות המשאב כדי להגביל את היקף התנאי. לדוגמה, התנאי הבא מקבל את הערך true לכל סוגי המשאבים, מלבד למופעים של Compute Engine. בניגוד לזה, במופעים של Compute Engine, התנאי בודק את שם המשאב:

resource.type != 'compute.googleapis.com/Disk' ||
    resource.name.endsWith('devResource')

תפקידים בהתאמה אישית

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

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

ביטוי התנאי הבא יגרום להתנהגות לא צפויה. ההרשאות לביצוע פעולות במכונות וירטואליות של Compute Engine חסומות:

resource.type == 'compute.googleapis.com/Disk' &&
 resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/staging')

ביטוי התנאי הבא כולל גם דיסקים וגם מכונות, והוא ינהל את הגישה על סמך שם המשאב בשביל שני הסוגים האלו:

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/staging')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/staging'))

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

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/staging')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/staging')) ||
 (resource.type != 'compute.googleapis.com/Disk' &&
  resource.type != 'compute.googleapis.com/Instance')

הרשאות להורה בלבד

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

כדי להעניק גישה להרשאות *.*.list באופן תקין כשמשתמשים בתנאים, ביטוי התנאי צריך להגדיר את המאפיינים resource.service ו-resource.type בהתאם לסוג משאב ההורה של משאבי היעד שיירשמו.

ריכזנו כאן כמה דוגמאות. בעזרת הדוגמה של Compute Engine מהקטע הקודם, הביטוי הבא מונע גישה להרשאות compute.disks.list ו-compute.instances.list, כי למשאב שבו נבדקות ההרשאות יש במאפיין resource.type ערך cloudresourcemanager.googleapis.com/Project.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX'))

מקובל שההרשאות list מוענקות יחד עם הרשאות אחרות בשביל פעולות רגילות על המשאב. כדי להגדיל את היקף ההרשאות המוענקות במקרה כזה, אפשר להרחיב את ההיקף בשביל סוג cloudresourcemanager.googleapis.com/Project בלבד או בשביל כל ההרשאות האחרות, שהן לא מסוג מכונה או דיסק.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
 resource.type == 'cloudresourcemanager.googleapis.com/Project'

או

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
 (resource.type != 'compute.googleapis.com/Disk' &&
  resource.type != 'compute.googleapis.com/Instance')