בפלטפורמה לניהול זהויות והרשאות גישה (IAM) יש כמה סוגים של כללי מדיניות שיעזרו לכם לקבוע לאילו משאבים יש למשתמשים ראשיים גישה. במדריך הזה מוסבר איך להשתמש במדיניות גישה כדי לשלוט בגישה כשמפרסמים הודעות אירועים באפיק (bus) מתקדם של Eventarc Advanced.
כללי מדיניות הגישה ב-IAM יכולים לאפשר או לדחות גישה למשאבים. עם זאת, בניגוד למדיניות ההרשאה והדחייה ב-IAM, מדיניות הגישה יכולה להעניק או לדחות גישה על סמך מאפיינים ספציפיים של הקשר האירוע, כמו העדיפות של הודעת האירוע.
כל מדיניות גישה היא קבוצה של כללים שמאפשרת לכם לזהות חשבונות משתמשים ולהגדיר תנאים שקובעים את הרלוונטיות של כלל, וגם מאפשרת לכם להפעיל בקרת גישה ברמת פירוט גבוהה. לדוגמה, בהתאם להערכה של ביטוי בשפת Common Expression Language (CEL) שמוחל על מאפיין של הקשר של אירוע, אפשר לאשר או לדחות את ההרשאה לפרסם קבוצת משנה של הודעות אירוע באוטובוס Eventarc Advanced.
במדריך הזה נסביר איך ליצור מדיניות גישה ולהחיל אותה. לשם כך, קודם יוצרים מדיניות גישה, ואז יוצרים קשר בין המדיניות לבין Google Cloud פרויקט.
לפני שמתחילים
לפני שיוצרים ומחילים מדיניות גישה, צריך כבר ליצור אפיק (bus) Eventarc Advanced שאליו אפשר לפרסם הודעות אירועים.
צריך להשבית את האכיפה של האילוץ המנוהל Disable binding access policy to resource (
constraints/iam.managed.disableAccessPolicyBindings). כברירת מחדל, האילוץ הבוליאני הזה מופעל בארגונים חדשים, ומונע מכם לקשר מדיניות גישה ל-API ב-IAM v3 למשאב. מידע נוסף זמין במאמר בנושא עדכון מדיניות באמצעות כללים בוליאניים.חשוב לוודא שאתם לוקחים בחשבון את הנקודות הבאות:
צריך להחיל את מדיניות הגישה על פרויקט Google Cloud או לקשר אותה אליו. כל מדיניות גישה יכולה להיות מצורפת לעד 5 פרויקטים, ולכל פרויקט יכולות להיות מצורפות עד 5 מדיניות גישה. אפשר ליצור אוטובוס אחד לכלGoogle Cloud פרויקט לכל אזור נתמך. מדיניות גישה שמצורפת לפרויקט קובעת את גישת הפרסום לכל מרכז בקרה מתקדם של Eventarc בפרויקט הזה.
אפשר להשתמש במדיניות גישה כדי לשלוט בגישת הפרסום לאפיק Eventarc Advanced, אבל אי אפשר להשתמש בה כדי לשלוט בגישה להרשמה להודעות מאפיק מסוים. ההרשאה הנתמכת היא
eventarc.messageBuses.publish.בקרת הגישה יכולה להתבסס רק על מאפייני ההקשר של האירוע ולא על תוכן מטען הייעודי (payload) של האירוע.
הודעות על אירועים שפורסמו ממקורות של Google ונדחו נמחקות. אם הגורם המרכזי מפרסם ישירות הודעת אירוע, הדבר מצוין בהודעת יומן
Event published successfully. עם זאת, אם הודעת האירוע נדחית על ידי התנאי במדיניות הגישה, מתרחשת שגיאה דומה לזו:ERROR: (gcloud.beta.eventarc.message-buses.publish) PERMISSION_DENIED: Permission 'eventarc.googleapis.com/messageBuses.publish' denied on resource due to an IAM Access Policy. This command is authenticated as user@example.com which is the active account specified by the [core/account] property. '@type': type.googleapis.com/google.rpc.ErrorInfo domain: iam.googleapis.com metadata: permission: eventarc.googleapis.com/messageBuses.publish reason: IAM_PERMISSION_DENIED
אם עדיין לא עשיתם את זה, מפעילים את ממשקי ה-API של Eventarc ו-IAM:
gcloud services enable eventarc.googleapis.com \ eventarcpublishing.googleapis.com \ iam.googleapis.com
מגדירים את האימות:
gcloud
במסוף Google Cloud , מפעילים את Cloud Shell.
בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
API בארכיטקטורת REST
כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.
התקינו את ה-CLI של Google Cloud.
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .
התפקידים הנדרשים
תפקיד ב-IAM מכיל קבוצה של הרשאות שמאפשרות לבצע פעולות ספציפיות במשאבים של Google Cloud .
כדי לקבל את ההרשאות שדרושות לשליטה בגישת הפרסום, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
-
יצירת מדיניות גישה: אדמין מדיניות גישה (
roles/iam.accessPolicyAdmin) -
החלת מדיניות גישה:
אדמין IAM של פרויקט (
roles/resourcemanager.projectIamAdmin)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
התפקידים המוגדרים מראש האלה כוללים את ההרשאות שנדרשות לשליטה בגישת הפרסום. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:
ההרשאות הנדרשות
כדי לשלוט בגישת הפרסום, נדרשות ההרשאות הבאות:
-
יצירת מדיניות גישה:
iam.accessPolicies.create -
החלת מדיניות גישה:
-
iam.accessPolicies.bind -
resourcemanager.projects.createPolicyBinding
-
יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
יצירת מדיניות גישה
יצירת מדיניות גישה כדי לשלוט בגישה כשמפרסמים באוטובוס מתקדם של Eventarc בפרויקט.
אפשר ליצור מדיניות גישה באמצעות Google Cloud CLI או באמצעות שליחת בקשה ישירה אל IAM v3 API.
gcloud
כדי ליצור מדיניות גישה, מריצים את הפקודה gcloud beta iam access-policies create.
gcloud beta iam access-policies create POLICY_ID \ --project=POLICY_PROJECT_ID \ --location=global \ --details-rules="description="POLICY_DESCRIPTION",effect=EFFECT, \ principals=[PRINCIPALS],excludedPrincipals=[EXCLUDED_PRINCIPALS], \ operation={permissions=[eventarc.googleapis.com/messageBuses.publish]}, \ conditions={eventarc.googleapis.com={expression="CEL_EXPRESSION"}}"
מחליפים את מה שכתוב בשדות הבאים:
-
POLICY_ID: שם ייחודי למדיניות הגישה, לדוגמהmy-access-policy. -
POLICY_PROJECT_ID: מזהה הפרויקט ב- Google Cloud שבו תיווצר המדיניות. -
POLICY_DESCRIPTION: תיאור אופציונלי של המדיניות (256 תווים לכל היותר). -
EFFECT: ההשפעה של הכלל (ALLOWאוDENY). -
PRINCIPALS: הזהויות שהכלל הזה חל עליהן. הפורמט של המזהה תלוי בסוג חשבון המשתמש שאליו רוצים להתייחס. מידע נוסף זמין במאמר בנושא סוגי חשבונות משתמשים במדיניות גישה. -
EXCLUDED_PRINCIPALS: הזהויות שמוחרגות מהחלת הכלל, גם אם הן מופיעות ב-principals. לדוגמה, אפשר להוסיף קבוצת Google ל-principalsואז להחריג משתמשים ספציפיים ששייכים לקבוצה הזו. -
CEL_EXPRESSION: ביטוי CEL שיוערך כדי לקבוע אם הכלל רלוונטי. לדוגמה:message.version != \"v1\". מידע נוסף זמין במאמר בנושא שימוש ב-Common Expression Language.
שימו לב לנקודות הבאות:
- הדגל
--locationמציין את המיקום של מדיניות הגישה, והוא חייב להיותglobal. בדגל
--details-rulesאפשר לציין את הנתיב לקובץ מדיניות הגישה, שאפשר לכתוב בפורמט JSON או YAML. לדוגמה:--details-rules=path_to_file.json.אפשר גם לחזור על הדגל כשמגדירים כמה כללים. כל כלל מוערך בנפרד.
אפשר להשתמש בפורמט הבא בשביל מדיניות גישה:
{ "displayName": "POLICY_DISPLAY_NAME", "details": { "rules": [ { "description": "POLICY_DESCRIPTION", "effect": "EFFECT", "principals": [ "PRINCIPALS" ], "excludedPrincipals": [ "EXCLUDED_PRINCIPALS" ], "operation": { "permissions": ["eventarc.googleapis.com/messageBuses.publish"] }, "conditions": { "eventarc.googleapis.com": { "expression": "CEL_EXPRESSION" } } } ] } }
התשובה מכילה פעולה ממושכת שמייצגת את הבקשה שלכם. כדי ללמוד איך מקבלים את הסטטוס של פעולה ממושכת, אפשר לעיין בקטע בדיקת הסטטוס של פעולה ממושכת במסמך הזה.
דוגמה
הפקודה הבאה יוצרת מדיניות גישה שמאפשרת לחשבון המשתמש שצוין לפרסם הודעות אירוע לאוטובוס, אבל חוסמת פרסום אם סוג נתוני המדיה הוא JSON.
gcloud beta iam access-policies create my-access-policy \ --project=my-project-id \ --location=global \ --details-rules=description="Allow publishing to bus",effect=ALLOW,principals=[principal://goog/subject/user@example.com],operation={permissions=[eventarc.googleapis.com/messageBuses.publish]} \ --details-rules=description="Deny publishing to bus if media type is JSON",effect=DENY,principals=[principal://goog/subject/user@example.com],operation={permissions=[eventarc.googleapis.com/messageBuses.publish]},conditions={eventarc.googleapis.com={expression="message.datacontenttype=='application/json'"}}
API בארכיטקטורת REST
אפשר ליצור מדיניות גישה באמצעות projects.locations.accessPolicies.create method.
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
POLICY_DISPLAY_NAME: אופציונלי. שם של מדיניות הגישה שקריא לאנשים – לדוגמה, Example policy. השם המוצג יכול לכלול עד 63 תווים. -
POLICY_DESCRIPTION: אופציונלי. תיאור של מדיניות הגישה שכתוב בצורה שקריאה לאנשים – לדוגמה, Example description. התיאור יכול להכיל עד 256 תווים. -
EFFECT: ההשפעה של הכלל,ALLOWאוDENY. -
PRINCIPALS: הזהויות שהכלל הזה חל עליהן. הפורמט של המזהה תלוי בסוג של חשבון המשתמש שאליו רוצים להתייחס. מידע נוסף זמין במאמר בנושא סוגי חשבונות משתמשים במדיניות גישה. -
EXCLUDED_PRINCIPALS: הזהויות שמוחרגות מהחלת הכלל, גם אם הן מופיעות ב-principals. לדוגמה, אפשר להוסיף קבוצת Google ל-principalsואז להחריג משתמשים ספציפיים ששייכים לקבוצה הזו. -
CEL_EXPRESSION: ביטוי CEL שיוערך כדי לקבוע אם הכלל רלוונטי. מידע נוסף זמין במאמר בנושא שימוש בשפה Common Expression Language. -
POLICY_PROJECT_ID: מזהה הפרויקט Google Cloud שבו תיצור את המדיניות. -
POLICY_ID: שם ייחודי למדיניות הגישה, למשלmy-access-policy.
יכולים להיות כמה כללים. כל כלל מוערך בנפרד. אם כלל מסוים לא חל, יכול להיות שכללים אחרים כן יחולו.
תוכן בקשת JSON:
{
"displayName": "POLICY_DISPLAY_NAME",
"details": {
"rules": [
{
"description": "POLICY_DESCRIPTION",
"effect": "EFFECT",
"principals": [
"PRINCIPALS"
],
"excludedPrincipals": [
"EXCLUDED_PRINCIPALS"
],
"operation": {
"permissions": [
"eventarc.googleapis.com/messageBuses.publish"
]
},
"conditions": {
"eventarc.googleapis.com": {
"expression": "CEL_EXPRESSION"
}
}
}
]
}
}
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
התשובה מכילה פעולה ממושכת שמייצגת את הבקשה שלכם. בקטע בדיקת הסטטוס של פעולה ממושכת שבדף הזה מוסבר איך מקבלים את הסטטוס של פעולה ממושכת.
{
"name": "projects/POLICY_PROJECT_ID/locations/global/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.iam.v3.OperationMetadata",
"createTime": "2025-01-25T17:17:45.782370139Z",
"target": "projects/POLICY_PROJECT_ID/locations/global/accessPolicies/POLICY_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v3"
},
"done": false
}
דוגמה
מדיניות הגישה הבאה מאפשרת לגורם שצוין לפרסם הודעות אירוע באוטובוס, אבל לא מאפשרת פרסום אם העדיפות של ההודעה היא HIGH.
cat > request.json << 'EOF' { "displayName": "Eventarc Advanced access policy", "details": { "rules": [ { "description": "Allow publishing to bus", "effect": "ALLOW", "principals": [ "principal://goog/subject/user@example.com" ], "operation": { "permissions": [ "eventarc.googleapis.com/messageBuses.publish" ] } }, { "description": "Deny publishing to bus if message priority is HIGH", "effect": "DENY", "principals": [ "principal://goog/subject/user@example.com" ], "operation": { "permissions": [ "eventarc.googleapis.com/messageBuses.publish" ] }, "conditions": { "eventarc.googleapis.com": { "expression": "message.priority == \"HIGH\"" } } } ] } } EOF curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://iam.googleapis.com/v3/projects/POLICY_PROJECT_ID/locations/global/accessPolicies?access_policy_id=POLICY_ID"
החלת מדיניות גישה
יוצרים קשר בין מדיניות כדי להחיל את מדיניות הגישה על Google Cloud פרויקט. כל קישור מדיניות מקשר בין מדיניות גישה אחת למשאב אחד.
אפשר להחיל מדיניות גישה באמצעות Google Cloud CLI או באמצעות שליחת בקשה ישירה אל IAM v3 API.
gcloud
כדי ליצור קשר בין מדיניות ולהחיל את מדיניות הגישה, מריצים את הפקודה gcloud beta iam policy-bindings create.
gcloud beta iam policy-bindings create BINDING_ID \ --project=BINDING_PROJECT_ID \ --location=global \ --policy=projects/POLICY_PROJECT_ID/locations/global/accessPolicies/POLICY_ID \ --target-resource=//cloudresourcemanager.googleapis.com/projects/BINDING_PROJECT_ID
מחליפים את מה שכתוב בשדות הבאים:
-
BINDING_ID: שם ייחודי לקשירת המדיניות, לדוגמהmy-access-policy-binding. -
BINDING_PROJECT_ID: מזהה Google Cloud הפרויקט שבו ייווצר הקישור. המזהה הזה צריך להיות זהה למזהה של הפרויקט שבו נוצר מרכז הבקרה המתקדם של Eventarc, והוא מציין את היעד של הקישור.
הדגל --location מציין את המיקום של קישור המדיניות, והוא חייב להיות global.
התשובה מכילה פעולה ממושכת שמייצגת את הבקשה שלכם. כדי ללמוד איך מקבלים את הסטטוס של פעולה ממושכת, אפשר לעיין בקטע בדיקת הסטטוס של פעולה ממושכת במסמך הזה.
דוגמה
הפקודה הבאה יוצרת קשר בין מדיניות לבין פרויקט, ומחילת את מדיניות הגישה שצוינה על הפרויקט Google Cloud :
gcloud beta iam policy-bindings create my-access-policy-binding \ --project=my-project-id \ --location=global \ --policy=projects/my-project-id/locations/global/accessPolicies/my-access-policy \ --target-resource=//cloudresourcemanager.googleapis.com/projects/my-project-id
API בארכיטקטורת REST
אפשר ליצור קשר בין מדיניות ולהחיל את מדיניות הגישה באמצעות projects.locations.policyBindings.create method.
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
BINDING_DISPLAY_NAME: אופציונלי. שם של קשירת המדיניות שקריא לאנשים – לדוגמה, Example binding. השם המוצג יכול לכלול עד 63 תווים. -
BINDING_PROJECT_ID: Google Cloud מזהה הפרויקט שבו ייווצר הקישור. המזהה הזה צריך להיות זהה למזהה של הפרויקט שבו נוצר ה-bus המתקדם של Eventarc, והוא מציין את היעד של הקישור. -
POLICY_PROJECT_ID: מזהה הפרויקט Google Cloud שבו נוצרה המדיניות. -
POLICY_ID: השם של מדיניות הגישה שרוצים לקשר – לדוגמה,my-access-policy.
תוכן בקשת JSON:
{
"display_name": "BINDING_DISPLAY_NAME",
"target": {"resource": "//cloudresourcemanager.googleapis.com/projects/BINDING_PROJECT_ID"},
"policy_kind": "ACCESS",
"policy": "projects/POLICY_PROJECT_ID/locations/global/accessPolicies/POLICY_ID"
}
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
התשובה מכילה פעולה ממושכת שמייצגת את הבקשה שלכם. בקטע בדיקת הסטטוס של פעולה ממושכת שבדף הזה מוסבר איך מקבלים את הסטטוס של פעולה ממושכת.
{
"name": "projects/BINDING_PROJECT_ID/locations/global/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.iam.v3.OperationMetadata",
"createTime": "2025-01-25T17:17:45.782370139Z",
"target": "projects/BINDING_PROJECT_ID/locations/global/policyBindings/POLICY_ID-binding",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v3"
},
"done": false
}
בדיקת הסטטוס של פעולה ממושכת
כשמשתמשים ב-API בארכיטקטורת REST של IAM, כל שיטה שמשנה מדיניות הרשאות או קשירה מחזירה פעולה ממושכת (LRO). הפעולה הממושכת עוקבת אחרי הסטטוס של הבקשה ומציינת אם השינוי במדיניות או בקישור הושלם.
השיטה
operations.get
מחזירה את הסטטוס של פעולה ממושכת.
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
OPERATION_NAME: השם המלא של הפעולה. השם הזה מופיע בתגובה לבקשה המקורית.שם הפעולה הוא בפורמט הבא:
projects/PROJECT_ID/locations/global/operations/OPERATION_ID
-
PROJECT_ID: Google Cloud מזהה הפרויקט שבו מוחזרת הפעולה.
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_ID/locations/global/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.iam.v3.OperationMetadata",
"createTime": "2025-01-28T00:05:12.006289686Z",
"endTime": "2025-01-28T00:05:12.192141801Z",
"target": "projects/PROJECT_ID/locations/global/accessPolicies/POLICY_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v3"
},
"done": true,
"response": {
ACCESS_POLICY
}
}
אם השדה done של הפעולה לא מופיע, אפשר לבצע את הפעולה שוב ושוב
כדי להמשיך לעקוב אחר הסטטוס שלה. צריך להשתמש בהשהיה מעריכית קטועה לפני ניסיון חוזר כדי ליצור עיכוב בין כל בקשה. כשהערך של השדה done מוגדר בתור true, הפעולה הושלמה ואפשר להפסיק לבצע אותה.