שליטה בגישה באמצעות תנאי IAM

במאמר הזה מוסבר איך להשתמש בתנאי IAM כדי לשלוט בגישה למשאבי BigQuery.

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

תנאי IAM שימושיים למתן הרשאות של ניהול זהויות והרשאות גישה (IAM) למשאבים קשורים רבים בו-זמנית, כולל משאבים שעדיין לא קיימים. כדי להעניק הרשאות לקבוצות לא קשורות של משאבי BigQuery, כדאי להשתמש בתגי IAM.

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

  1. מקצים למשתמשים תפקידי IAM שמכילים את ההרשאות הנדרשות לביצוע כל משימה שמופיעה במסמך הזה.
  2. מפעילים את IAM API.

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

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

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

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

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

כדי להחיל תנאי IAM על משאבי BigQuery, נדרשות ההרשאות הבאות:

  • הגדרת גישת IAM מותנית ברמת הפרויקט: resourcemanager.projects.setIamPolicy
  • הגדרת גישת IAM מותנית למערכי נתונים:
    • bigquery.datasets.setIamPolicy
    • bigquery.datasets.update

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

אם אתם מתכננים להשתמש בתנאי IAM בכל הארגון, אתם צריכים גם הרשאות לניהול מדיניות הארגון.

במאמר מבוא ל-IAM יש מידע נוסף על תפקידים והרשאות ב-IAM ב-BigQuery.

הפעלת IAM API

כדי להפעיל את IAM API, בוחרים באחת מהאפשרויות הבאות:

המסוף

עוברים לדף Identity and Access Management (IAM) API ומפעילים את ה-API.

הפעלה של ה-API

gcloud

מריצים את הפקודה gcloud services enable:

gcloud services enable iam.googleapis.com

צפייה במדיניות של גישה מותנית במערך נתונים

בוחרים באחת מהאפשרויות הבאות:

המסוף

  1. עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית הימנית, לוחצים על כלי הניתוחים:

    כפתור מודגש לחלונית הסייר.

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

  3. בחלונית Explorer, מרחיבים את הפרויקט, לוחצים על Datasets ואז בוחרים מערך נתונים.

  4. לוחצים על שיתוף > הרשאות.

  5. לצד התפקיד המשויך, לוחצים על תנאי:TITLE כדי לראות את התנאי של התפקיד.

BQ

כדי להציג או לעדכן מדיניות של גישה מותנית ב-Cloud Shell, צריך להשתמש ב-Cloud Shell בגרסה 503.0.0 ואילך.

כדי לקבל מדיניות גישה קיימת ולשמור אותה בקובץ מקומי בפורמט JSON, משתמשים בפקודה bq show ב-Cloud Shell:

bq show --format=prettyjson PROJECT_ID:DATASET > PATH_TO_FILE

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

  • PROJECT_ID: מזהה הפרויקט
  • DATASET: השם של מערך הנתונים
  • PATH_TO_FILE: הנתיב לקובץ ה-JSON במחשב המקומי

המאפיין access בקובץ ה-JSON של משאב מערך הנתונים מכיל את מדיניות הגישה.

API

כדי להציג את מדיניות הגישה של מערך נתונים עם תנאים, קוראים ל-datasets.get עם accessPolicyVersion=3 כפרמטר בקשה. המאפיין access במשאב של מערך הנתונים מכיל את מדיניות הגישה.

שינוי גישה מותנית למשאבים

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

הוספת תנאים לארגון, לתיקייה או לפרויקט

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

הוספת גישה מותנית למערך נתונים

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

המסוף

  1. עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית הימנית, לוחצים על כלי הניתוחים:

    כפתור מודגש לחלונית הסייר.

  3. בחלונית Explorer, מרחיבים את הפרויקט, לוחצים על Datasets ואז בוחרים מערך נתונים.

  4. בחלונית הפרטים, לוחצים על שיתוף > הרשאות.

  5. לוחצים על Add Principal.

  6. בשדה New principals, מזינים חשבון משתמש.

  7. ברשימה Select a role, בוחרים תפקיד מוגדר מראש או תפקיד בהתאמה אישית.

  8. לוחצים על הוספת תנאי IAM.

  9. מוסיפים תנאים לשדה condition באמצעות מאפייני התנאים.

  10. בחלונית Add IAM condition, לוחצים על Save.

  11. בחלונית Grant access to DATASET, לוחצים על Save.

BQ

כדי להציג או לעדכן מדיניות של גישה מותנית ב-Cloud Shell, צריך להשתמש ב-Cloud Shell בגרסה 503.0.0 ואילך.

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

לדוגמה, התוספת הבאה לקטע access בקובץ ה-JSON של מערך נתונים תעניק את התפקיד roles/bigquery.dataViewer ל-cloudysanfrancisco@gmail.com עד 31 בדצמבר 2032:

"access": [
  {
    "role": "roles/bigquery.dataViewer",
    "userByEmail": "cloudysanfrancisco@gmail.com",
    "condition": {
      "title": "Grant roles/bigquery.dataViewer until 2033",
      "description": "Role expires on December 31, 2032.",
      "expression": "request.time < timestamp('2032-12-31T12:00:00Z')"
    }
  }
]

API

כדי להעניק גישה מותנית למערך נתונים באמצעות BigQuery API, צריך לפעול לפי ההוראות להענקת גישה למערך נתונים עם accessPolicyVersion=3 בפרמטר הבקשה.

אפשר להוסיף רשומות עם תנאי גישה למאפיין access.condition של משאב מערך הנתונים.

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

הסרת גישה מותנית ממערכי נתונים

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

המסוף

  1. עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית הימנית, לוחצים על כלי הניתוחים:

    כפתור מודגש לחלונית הסייר.

  3. בחלונית Explorer, מרחיבים את הפרויקט, לוחצים על Datasets ואז בוחרים מערך נתונים.

  4. בחלונית הפרטים, לוחצים על שיתוף > הרשאות.

  5. בוחרים את חשבון המשתמש שרוצים לבטל את הגישה שלו.

  6. לוחצים על מחיקה.

  7. בתיבת הדו-שיח Delete principal? (מחיקת חשבון משתמש?), לוחצים על Delete (מחיקה).

BQ

כדי להציג או לעדכן מדיניות של גישה מותנית ב-Cloud Shell, צריך להשתמש ב-Cloud Shell בגרסה 503.0.0 ואילך.

כדי להסיר גישה מותנית למערך נתונים באמצעות Cloud Shell, פועלים לפי ההוראות במאמר שלילת הגישה למערך נתונים. אפשר להסיר את הרשומה עם התנאי מהקטע access בקובץ ה-JSON של מערך הנתונים.

API

כדי לבטל גישה מותנית למערך נתונים באמצעות BigQuery API, צריך לפעול לפי ההוראות לביטול גישה למערך נתונים עם accessPolicyVersion=3 בפרמטר הבקשה.

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

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

מאפייני התנאים

אפשר להגדיר תנאי IAM במשאבי BigQuery, על סמך המאפיינים הבאים:

  • request.time: השעה שבה המשתמש מנסה לגשת למשאב ב-BigQuery. פרטים נוספים ודוגמאות מופיעים במאמר בנושא מאפיין תאריך/שעה.
  • resource.name: הנתיב של משאב BigQuery. לעיון בפורמט, אפשר לעיין בטבלאות שבמאמר פורמטים של מאפיינים.
  • resource.type: סוג המשאב ב-BigQuery. לעיון בפורמט, אפשר לעיין בטבלאות שבמאמר פורמטים של מאפיינים.
  • resource.service: השירות שמשמש את מקור הנתונים ב-BigQuery. Google Cloud לעיון בפורמט, אפשר לעיין בטבלאות שבמאמר בנושא פורמטים של מאפיינים.
  • resource.tags: התגים שמצורפים למשאב BigQuery. התגים נתמכים רק במשאבים של מערכי נתונים, טבלאות ותצוגות מפורטות ב-BigQuery. למידע על הפורמט, אפשר לעיין בטבלאות שבקטע פורמטים של מאפיינים ובמאמרי העזרה של IAM.

פורמטים של מאפיינים

כשיוצרים תנאים למערכי נתונים ב-BigQuery, צריך להשתמש בפורמטים הבאים:

מאפיין ערך
resource.type bigquery.googleapis.com/Dataset
resource.name projects/PROJECT_ID/datasets/DATASET_ID
resource.service bigquery.googleapis.com
resource.tags תמיכה בערכים hasTagKey, ‏ hasTagKeyId, ‏ matchTag ו-matchTagId. מידע נוסף זמין במאמר תגי משאבים.

כשיוצרים תנאים לטבלאות ולתצוגות מפורטות של BigQuery, צריך להשתמש בפורמטים הבאים:

מאפיין ערך
resource.type bigquery.googleapis.com/Table
resource.name projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID
resource.service bigquery.googleapis.com
resource.tags תמיכה בערכים hasTagKey, ‏ hasTagKeyId, ‏ matchTag ו-matchTagId. מידע נוסף זמין במאמר תגי משאבים.

כשיוצרים תנאים לשגרות ב-BigQuery, משתמשים בפורמטים הבאים:

מאפיין ערך
resource.type bigquery.googleapis.com/Routine
resource.name projects/PROJECT_ID/datasets/DATASET_ID/routines/ROUTINE_ID
resource.service bigquery.googleapis.com

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

מאפיין ערך
resource.type bigquery.googleapis.com/Model
resource.name projects/PROJECT_ID/datasets/DATASET_ID/models/MODEL_ID
resource.service bigquery.googleapis.com

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

  • PROJECT_ID: מזהה הפרויקט שמכיל את המשאבים שרוצים להעניק להם גישה
  • DATASET_ID: המזהה של מערך הנתונים שרוצים להעניק לו גישה
  • TABLE_ID: המזהה של הטבלה או התצוגה שרוצים להעניק להם גישה
  • ROUTINE_ID: המזהה של השגרה שרוצים להעניק לה גישה
  • MODEL_ID: המזהה של המודל שרוצים להעניק לו גישה

שיטות מומלצות לשימוש בתנאים

כשיוצרים תנאים ב-BigQuery, מומלץ לפעול לפי השיטות המומלצות הבאות:

  • מומלץ להשתמש בתנאים חיוביים עבור resource.type, resource.name ו-resource.service כדי לשפר את הדיוק. מכיוון שסוגים לא נתמכים מיוצגים על ידי מחרוזת ריקה, תנאים שליליים עשויים להתאים למגוון רחב של משאבים. מידע נוסף מופיע במאמר בנושא תנאים שליליים.
  • תנאי IAM ברמת מערך הנתונים צריכים לשמש רק לתפקידים שחלים על משאבים בתוך מערך הנתונים, כמו טבלאות, תצוגות, מודלים ושגרות. אין להשתמש בהם כדי להעניק תפקידים שפועלים ברמת מערך הנתונים או הפרויקט, כמו bigquery.user או bigquery.jobUser.
  • אל תשתמשו בתנאי resource.type == 'bigquery.googleapis.com/Dataset' במדיניות ברמת מערך הנתונים, כי הוא לא משפיע על ההרשאה. המאפיין הזה נועד לשלוט בגישה למשאבים של מערכי נתונים משניים, כמו טבלאות, תצוגות, שגרות ומודלים.
  • כדאי לכלול את resource.type, את resource.name ואת resource.service בתנאי, גם אם רמת הפירוט הזו לא נחוצה. השיטה הזו עוזרת לשמור על התנאים שלכם כשמשאבים בתהליך העבודה משתנים, כדי שמשאבים אחרים לא ייכללו בעתיד בטעות.
  • כשמעניקים הרשאות, חשוב לכלול את קבוצת ההרשאות המצומצמת ביותר האפשרית כדי לוודא שלא מעניקים בטעות גישה רחבה מדי.
  • חשוב להשתמש ב-resource.name.startsWith בזהירות. נתיבי טבלה ותצוגה ב-BigQuery מתחילים בקידומת של מזהה פרויקט האב ומזהה מערך הנתונים. תנאים לא מספיק ספציפיים עלולים להעניק יותר מדי גישה. עם זאת, אפשר להשתמש במאפיין resource.name.startsWith כדי לאפשר למשתמשים להריץ שאילתות עם תווים כלליים בטבלאות. לדוגמה, גישה שניתנה באמצעות התנאי resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix") מאפשרת למשתמשים להריץ את השאילתה SELECT * FROM my_dataset.table_prefix*.
  • אל תוסיפו תנאים למשאבי BigQuery מלבד מערכי נתונים, טבלאות, תצוגות, שגרות ומודלים.
  • מוודאים שאתם מעניקים את ההרשאות הנכונות למשאב הנכון. לדוגמה, את ההרשאה לרישום משאבים (bigquery.RESOURCE.list) צריך להעניק ברמת ההורה, אבל את ההרשאה למחיקת משאבים (bigquery.RESOURCE.delete) צריך להעניק ברמת המשאב. כדי למחוק מערך נתונים, שכולל גם את כל המשאבים שכלולים בו, צריך הרשאות למחיקת טבלאות, מודלים ושגרות במערך הנתונים.
  • חשוב לדעת שקובצי snapshot של טבלאות ומסע בזמן לא משפיעים על ההרשאות.

תנאים שליליים

תנאים שליליים כמו resource.name != resource עלולים להעניק גישה רחבה מדי בטעות. למשאבי BigQuery שלא נתמכים יש מאפייני משאב ריקים, כלומר הם תואמים לכל התנאים השליליים. יכול להיות שגם משאבים בשירותים מחוץ ל-BigQuery יתאימו לתנאים השליליים.

בנוסף, תנאים שליליים יוצרים בעיות כשמשתמשים מריצים שאילתות עם תווים כלליים. לדוגמה, נניח את התנאי השלילי resource.name != /projects/my_project/datasets/my_dataset/tables/secret. התנאי הזה נראה כאילו הוא מעניק גישה לכל המשאבים, מלבד לטבלה בשם secret. עם זאת, המשתמש עדיין יכול לשלוח שאילתה לטבלה הזו באמצעות שאילתת wildcard, כמו SELECT * from my_project.my_dataset.secre*;.

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

מגבלות

  • אי אפשר להוסיף מענקים של תצוגה מורשית, תרחיש מורשה או מערך נתונים מורשה באמצעות תנאי IAM.
  • אם משתמשים ב-accessPolicyVersion לא תואם בזמן צפייה במשאב עם תנאים, יכול להיות שהקישורים יכילו את withcond ואחריו ערך גיבוב (hash). מידע נוסף זמין במאמר בנושא פתרון בעיות שקשורות ל-withcond בכללי מדיניות ובקישורי תפקידים.
  • משתמשים עם גישה מותנית למערך נתונים או לטבלה לא יכולים לשנות את ההרשאות למשאב הזה דרך מסוף Google Cloud . אפשר לשנות הרשאות רק באמצעות כלי bq ו-BigQuery API.
  • אין תמיכה בבקרת גישה ברמת השורה וברמת העמודה ישירות דרך תנאי IAM. עם זאת, משתמש עם גישה מותנית יכול להעניק לעצמו את התפקיד BigQuery Admin ‏ (roles/bigquery.admin) בטבלה, ואז לשנות את מדיניות הגישה לשורות ולעמודות.
  • יכול להיות שיחלפו עד חמש דקות לפני שהשינויים במדיניות IAM ייכנסו לתוקף.
  • יכול להיות שמשתמשים עם גישה מותנית לא יוכלו לשלוח שאילתות לתצוגות INFORMATION_SCHEMA.
  • משתמשים שיש להם גישה מותנית לטבלה לא יכולים להריץ פונקציות של תו כללי לחיפוש בטבלאות.

דוגמאות

הנה כמה דוגמאות לתרחישי שימוש בתנאי IAM ב-BigQuery.

הענקת הרשאת קריאה לטבלה ספציפית

בדוגמה הזו, לתפקיד 'צפייה בנתונים ב-BigQuery' cloudysanfrancisco@gmail.com ניתנות הרשאות לטבלה table_1 במערך הנתונים dataset_1. המשתמש עם התפקיד הזה יכול לשלוח שאילתות לטבלה ולגשת אליה דרך הכלי bq. המשתמש לא יכול לראות את הטבלה במסוף Google Cloud כי אין לו הרשאת bigquery.tables.list בערכת הנתונים.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataViewer,
  "condition": {
    "title": "Table dataset_1.table_1",
    "description": "Allowed to read table with name table_1 in dataset_1 dataset",
    "expression":
resource.name == projects/project_1/datasets/dataset_1/tables/table_1
&& resource.type == bigquery.googleapis.com/Table
  }
}

הענקת גישה לרשימה למערך נתונים ספציפי

בדוגמה הזו, לתפקיד cloudysanfrancisco@gmail.com 'צופה במטא-נתונים של BigQuery' ניתנות הרשאות במערך הנתונים dataset_2. המשתמש עם התפקיד הזה יכול לראות את כל המשאבים במערך הנתונים, אבל הוא לא יכול להריץ שאילתות על המשאבים האלה.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.metadataViewer,
  "condition": {
    "title": "Dataset dataset_2",
    "description": "Allowed to list resources in dataset_2 dataset",
    "expression":
resource.name == projects/project_2/datasets/dataset_2
&& resource.type == bigquery.googleapis.com/Dataset
  }
}

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

בדוגמה הזו, ההרשאה BigQuery Data Owner (הבעלים של נתוני BigQuery) ניתנת למשתמש cloudysanfrancisco@gmail.com בכל הטבלאות בכל מערכי הנתונים שמתחילים בקידומת public_:

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables public_",
    "description": "Allowed owner access to tables in datasets with public_ prefix",
    "expression":
resource.name.startsWith("projects/project_3/datasets/public_")
&& resource.type == bigquery.googleapis.com/Table
  }
}

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

בדוגמה הזו, ניתנת ל-cloudysanfrancisco@gmail.com הרשאה של בעלי נתונים ב-BigQuery לכל הטבלאות, המודלים והשגרות בכל מערכי הנתונים שמתחילים בקידומת general_:

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables general_",
    "description": "Allowed owner access to tables in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Table
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Models general_",
    "description": "Allowed owner access to models in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Model
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Routines general_",
    "description": "Allowed owner access to routines in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Routine
  }
}

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