בפלטפורמה לניהול זהויות והרשאות גישה (IAM) יש כמה סוגים של כללי מדיניות שיעזרו לכם לקבוע לאילו משאבים יש למשתמשים ראשיים גישה. במדריך הזה מוסבר איך להשתמש במדיניות גישה כדי לשלוט בגישה כשמפרסמים הודעות אירועים באוטובוס Eventarc Advanced.
כללי מדיניות הגישה ב-IAM יכולים לאפשר גישה למשאבים וגם לחסום גישה למשאבים. עם זאת, בניגוד לכללי מדיניות ההרשאה והדחייה ב-IAM, כללי מדיניות של הרשאות גישה יכולים להעניק או לדחות גישה על סמך מאפיינים ספציפיים של הקשר האירוע, כמו העדיפות של הודעת האירוע.
כל מדיניות גישה היא קבוצה של כללים שמאפשרים לזהות חשבונות משתמשים ולהגדיר תנאים שקובעים את הרלוונטיות של כלל מסוים, וגם מאפשרים להפעיל בקרת גישה ברמת דיוק גבוהה. לדוגמה, בהתאם להערכה של ביטוי בשפת Common Expression Language (CEL) שמוחל על מאפיין של הקשר של אירוע, אפשר לאשר או לדחות את ההרשאה לפרסם קבוצת משנה של הודעות אירוע באוטובוס Eventarc Advanced.
במדריך הזה מוסבר איך ליצור מדיניות גישה ולהחיל אותה. לשם כך, קודם יוצרים מדיניות גישה, ואז יוצרים קשר בין המדיניות לבין Google Cloud פרויקט.
לפני שמתחילים
לפני שיוצרים ומחילים מדיניות גישה, צריך כבר ליצור אוטובוס Eventarc Advanced שאליו אפשר לפרסם הודעות אירועים.
חשוב לוודא שאתם לוקחים בחשבון את הנקודות הבאות:
צריך להחיל את מדיניות הגישה על פרויקט Google Cloud או לקשר אותה אליו. כל מדיניות גישה יכולה להיות מצורפת לעד 5 פרויקטים, ולכל פרויקט יכולות להיות מצורפות עד 5 מדיניות גישה. אפשר ליצור אוטובוס אחד לכלGoogle Cloud פרויקט לכל אזור נתמך. מדיניות גישה שמצורפת לפרויקט קובעת את הרשאת הפרסום לכל Eventarc Advanced bus בפרויקט הזה.
אפשר להשתמש במדיניות גישה כדי לשלוט בגישת הפרסום לאפיק 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 Advanced בפרויקט.
אפשר ליצור מדיניות גישה באמצעות 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 Advanced, והוא מציין את היעד של הקישור.
הדגל --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 מזהה הפרויקט שבו ייווצר הקישור. המזהה הזה צריך להיות זהה למזהה של הפרויקט שבו נוצר ה-Eventarc Advanced bus, והוא מציין את היעד של הקישור. -
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, הפעולה הושלמה ואפשר להפסיק לבצע אותה.