סקירה כללית של התנאים בפלטפורמה לניהול הזהויות והרשאות הגישה

דף זה מתואר את תכונת התנאים של ניהול זהויות והרשאות גישה (IAM). אפשר להשתמש בתנאים של IAM כדי להגדיר ולאכוף בקרת גישה מותנית למשאבים על סמך מאפיינים. Google Cloud

תנאים וסוגי מדיניות

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

  • קישורי תפקידים במדיניות הרשאות, כולל קישורי תפקידים שמנוהלים על ידי הרשאות של Privileged Access Manager
  • כללים של מדיניות דחייה
  • קישורי מדיניות למדיניות לקביעת גבול הגישה לחשבונות משתמשים (PAB)

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

תנאים במדיניות הרשאות

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

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

כדי להוסיף תנאי לקישור תפקיד, מגדירים את השדה condition:

"bindings": [
  {
    "role": "ROLE",
    "members": [
      "MEMBER_1",
      "MEMBER_2"
    ],
    "condition": {
      "title": "TITLE",
      "description": "DESCRIPTION",
      "expression": "EXPRESSION"
    }
  }
]
אם אתם משתמשים בהרשאות של Privileged Access Manager, אתם יכולים גם להוסיף תנאים לתפקידים בהרשאה הזו. כשמשתמש מבקש בהצלחה הרשאה לזכאות הזו, הוא מקבל את התפקיד עם התנאי שצוין.

מידע נוסף על השדות בתנאי זמין בקטע מבנה התנאי שבדף הזה.

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

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

כדי לדעת איך מוסיפים, משנים ומסירים קישורי תפקידים מותנים, ראו את המאמר ניהול קישורי תפקידים מותנים

תנאים בכללי מדיניות הדחייה

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

התנאים נקבעים בכללי הדחייה במדיניות הדחייה של משאב. אם התנאי מקבל את הערך true או שהוא לא יכול לקבל שום ערך, כלל הדחייה חל וחשבונות המשתמשים לא יכולים להשתמש בהרשאות שצוינו. אם התנאי מקבל את הערך false, כלל הדחייה לא חל, וחשבונות המשתמשים יכולים להשתמש בהרשאות שצוינו אם יש להם אותן.

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

כדי להוסיף תנאי לכלל דחייה, מגדירים את השדה denialCondition:

"rules": [
  {
    "denyRule": {
      "deniedPrincipals": [
        "PRINCIPAL_1",
        "PRINCIPAL_2"
      ],
      "exceptionPrincipals": [
        "EXCEPTION_PRINCIPAL_1",
        "EXCEPTION_PRINCIPAL_2"
      ],
      "deniedPermissions": [
        "DENIED_PERMISSION_1",
        "DENIED_PERMISSION_2"
      ],
      "denialCondition": {
        "title": "TITLE",
        "description": "DESCRIPTION",
        "expression": "EXPRESSION"
      }
    }
  }
]

מידע נוסף על השדות בתנאי זמין בקטע מבנה התנאי שבדף הזה.

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

תנאים בקישורים של מדיניות לקביעת גבול הגישה לחשבונות משתמשים

אתם יכולים להשתמש בתנאים בקישורי מדיניות של מדיניות לקביעת גבול הגישה לחשבונות משתמשים כדי לצמצם את קבוצת החשבונות שהמדיניות חלה עליהם. לדוגמה, אפשר לאכוף מדיניות רק על חשבונות שירות, או להחריג את super-admin@example.com ממדיניות.

התנאים מצוינים בכל קישור למדיניות. אם קישור מדיניות כולל תנאי, המדיניות בקישור המדיניות נאכפת רק אם התנאי שווה ל-true.

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

{
  "displayName": "DISPLAY_NAME",
  "target": {
    "principalSet": "PRINCIPAL_SET"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "PAB_POLICY",
  "condition": {
    "title": "TITLE",
    "description": "DESCRIPTION",
    "expression": "EXPRESSION"
  }
}

מידע נוסף על השדות בתנאי זמין בקטע מבנה התנאי שבדף הזה.

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

מבנה התנאי

לאובייקט condition יש את המבנה הבא:

"condition": {
    "title": ...,
    "description": ...,
    "expression": ...
}

השדה title בתנאי הוא חובה. השדה description הוא אופציונלי. גם שדה הכותרת וגם שדה התיאור הם למידע בלבד, ומטרתם לעזור לכם לזהות ולתאר את התנאי.

השדה expression הוא חובה. הוא מגדיר ביטוי לוגי מבוסס-מאפיינים באמצעות קבוצת משנה של Common Expression Language (CEL). הביטוי של התנאי יכול להכיל מספר הצהרות. כל הצהרה מבצעת הערכה של מאפיין אחד. ההצהרות משולבות באמצעות אופרטורים לוגיים, בהתאם לשפת CEL.

שימוש בשפת CEL לקביעת תנאים

‫Common Expression Language (CEL) היא שפת הביטויים שמשמשת כדי לקבוע ביטוי במסגרת תנאי IAM. היא מותאמת ליצירת ביטויים לוגיים שמבוססים על מאפיינים. למידע נוסף, ראו את המפרט של CEL ואת הגדרת השפה.

בתנאים של IAM משתמשים בקבוצת משנה של CEL כדי לקבל החלטות בוליאניות לגבי הרשאות, על סמך נתוני המאפיינים. באופן כללי, ביטוי של תנאי מורכב מהצהרה או הצהרות שמחוברות על ידי אופרטורים לוגיים (&&, || או !).

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

התנאים בתנאים של IAM משתמשים במאפיינים הבאים של CEL:

  • משתנים: התנאים משתמשים במשתנים כדי לתאר מאפיין נתון, כמו request.time (מסוג Timestamp) או resource.name (מסוג String). המשתנים האלה מאוכלסים בערך שמבוסס על ההקשר בזמן הריצה.
  • אופרטורים: כל סוג נתונים, כמו Timestamp או String, תומך בקבוצה של אופרטורים שיכולים לשמש ליצירת ביטוי לוגי. בדרך כלל משתמשים באופרטורים כדי להשוות בין הערך של המשתנה לליטרל. למשל: resource.service == 'compute.googleapis.com'. בדוגמה הזו, אם ערך הקלט של resource.service הוא compute.googleapis.com, הביטוי יהיה שווה true.
  • פונקציות: פונקציה היא אופרטור מורכב שמתאים לסוגי נתונים שתומכים בפעולות מורכבות יותר. בביטויים של תנאים יש פונקציות מוגדרות מראש שאפשר להשתמש בהן עם סוגי נתונים מסוימים. לדוגמה, הפונקציה request.path.startsWith('/finance') משתמשת בפונקציית התאמה לתחילת המחרוזת, והיא תהיה שווה true אם הערך של request.path מתחיל בצורה תואמת, כמו /finance.
  • אופרטורים לוגיים: התנאים תומכים בשלושה אופרטורים לוגיים שיוצרים ביטויים לוגיים מורכבים מהצהרות פשוטות: &&, || ו-!. האופרטורים הלוגיים האלה מאפשרים להשתמש במספר משתני קלט בתוך ביטוי התנאי. לדוגמה: הביטוי request.time.getFullYear() < 2020 && resource.service == 'compute.googleapis.com' מצרף שתי הצהרות בסיסיות, והוא יהיה שווה true אם שתי ההצהרות מתקיימות.

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

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

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

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

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

מאפייני המשאבים

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

  • סוג המשאב
  • שם המשאב
  • השירות Google Cloud שבו משתמשים
  • התגים שמצורפים למשאב

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

רשימה מלאה של מאפייני המשאבים זמינה בחומר העזר בנושא מאפייני משאבים.

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

ביטויים לדוגמה

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

resource.type == 'compute.googleapis.com/Instance'

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

resource.service == 'storage.googleapis.com'

בקישור תפקיד, ביטוי התנאי הבא מאפשר גישה רק לאובייקטים ב-Cloud Storage שנמצאים בקטגוריה ספציפית:

resource.type == 'storage.googleapis.com/Object' &&
resource.name.startsWith('projects/_/buckets/exampleco-site-assets/')

בכלל דחייה, ביטוי התנאי הבא דוחה גישה למשאביGoogle Cloud עם התג env: prod:

resource.matchTag('123456789012/env', 'prod')

מאפיינים עיקריים

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

  • סוג הגורם המרכזי בבקשה
  • הזהות של חשבון המשתמש בבקשה

אפשר להשתמש במאפיינים האלה בקישורי מדיניות של מדיניות לקביעת גבול הגישה לחשבונות משתמשים (PAB).

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

ביטויים לדוגמה

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

principal.type == 'iam.googleapis.com/ServiceAccount'

בקישור של מדיניות לקביעת גבול הגישה לחשבונות משתמשים, ביטוי התנאי הבא מוודא שהמדיניות בקישור לא נאכפת עבור super-admin@example.com:

principal.subject != 'super-admin@example.com'

מאפייני הבקשות

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

  • רמת הגישה
  • התאריך והשעה
  • כתובת ה-IP והיציאה של היעד (למנהור TCP של IAP)
  • המארח או הנתיב הצפויים של כתובת ה-URL (ל-IAP)

אפשר להשתמש במאפיינים האלה בקישורים של תפקידי מדיניות הרשאות.

דוגמה לביטוי של רמת הגישה (ל-IAP בלבד)

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

'accessPolicies/199923665455/accessLevels/CorpNet' in
request.auth.access_levels

הארגון שלכם מגדיר רמות גישה על בסיס מאפייני הבקשה, כמו כתובת IP של המקור, מאפייני המכשיר, השעה ביום ועוד. לפרטים נוספים, ראו את המסמכים של Access Context Manager.

דוגמה לביטוי של מאפיין API

בקישור תפקיד לתפקיד עם ההרשאה iam.projects.setIamPolicy, ביטוי התנאי הבא מאפשר למשתמש להעניק ולבטל רק את התפקיד 'אדמין של חשבון לחיוב' (roles/billing.admin) בפרויקט:

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
                 .hasOnly(['roles/billing.admin'])

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

דוגמה לביטויים של תאריך/שעה

בקישור תפקידים, ביטוי התנאי הבא מאפשר גישה עד חצות ב-1 בינואר 2021:

request.time < timestamp('2021-01-01T00:00:00Z')

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

request.time.getHours('Europe/Berlin') >= 9 &&
request.time.getHours('Europe/Berlin') <= 17 &&
// Days of the week range from 0 to 6, where 0 == Sunday and 6 == Saturday.
request.time.getDayOfWeek('Europe/Berlin') >= 1 &&
request.time.getDayOfWeek('Europe/Berlin') <= '

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

request.time.getFullYear('Europe/Berlin') == 2020
request.time.getMonth('Europe/Berlin') < 6

כדי לציין חותמת זמן צריך להשתמש בפורמט RFC 3339. כדי לציין אזור זמן צריך להשתמש במזהים במסד הנתונים של אזור זמן IANA.

מידע נוסף על ביטויים של תאריך/שעה זמין במפרט של CEL.

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

דוגמה לביטויים של כתובת IP ויציאה של היעד (למנהור TCP של IAP)

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

destination.ip == '14.0.0.1'
destination.ip != '127.0.0.1'
destination.port == 22
destination.port > 21 && destination.port <= 23

דוגמה לביטויים של כללי העברה

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

!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes([
    'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
  ])
)

לפרטים על סכמות של איזון עומסים, קראו את המאמר שימוש בתנאי IAM במאזני עומסים של Google Cloud .

דוגמה לביטויים של מארח או נתיב כתובת URL (ל-IAP)

בקישור תפקיד, ביטוי התנאי הבא מאפשר גישה רק לתת-דומיינים מסוימים או לנתיבים מסוימים של כתובות URL בבקשה:

request.host == 'hr.example.com'
request.host.endsWith('.example.com')
request.path == '/admin/payroll.js'
request.path.startsWith('/admin')

דוגמה לביטוי עם סוגי מאפיינים שונים

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

request.time > timestamp('2018-08-03T16:00:00-07:00') &&
request.time < timestamp('2018-08-03T16:05:00-07:00') &&
((resource.name.startsWith('projects/project-123/zones/us-east1-b/instances/dev') ||
 (resource.name.startsWith('projects/project-123/zones/us-east1-b/instances/prod') &&
  'accessPolicies/34569256/accessLevels/CorpNet' in request.auth.access_levels)) ||
 resource.type != 'compute.googleapis.com/Instance')

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