בקרת גישה באמצעות תנאי IAM

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

הכללים האלה עוזרים לכם לנהל הרשאות בכמה משאבים קשורים בו-זמנית, כולל נכסים עתידיים. כדי לנהל את הגישה לאוספים לא קשורים של משאבי 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. בחלונית השמאלית, לוחצים על Explorer:

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

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

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

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

  5. לצד התפקיד המשויך, לוחצים על condition: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. בחלונית השמאלית, לוחצים על Explorer:

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

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

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

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

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

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

  8. לוחצים על Add IAM condition.

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

  10. בחלונית הוספת תנאי IAM, לוחצים על שמירה.

  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. בחלונית השמאלית, לוחצים על Explorer:

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

  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, על סמך המאפיינים הבאים:

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

כשיוצרים תנאים למערכי נתונים ב-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) צריך לתת ברמת המשאב. כדי למחוק מערך נתונים, שבו כל המשאבים הכלולים נמחקים גם כן, נדרשות הרשאות למחיקת טבלאות, מודלים ושגרות במערך הנתונים.
  • חשוב לדעת שתמונות מצב של טבלאות ומסע בזמן לא משפיעים על ההרשאות.

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

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

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

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

מגבלות

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

דוגמאות

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

מתן גישת קריאה לטבלה ספציפית

בדוגמה הזו, המשתמש cloudysanfrancisco@gmail.com מקבל את התפקיד "צפייה בנתונים ב-BigQuery" בטבלה 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
  }
}

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

בדוגמה הזו, המשתמש cloudysanfrancisco@gmail.com מקבל את התפקיד "בעלי נתונים ב-BigQuery" בכל הטבלאות שבכל מערכי הנתונים שמתחילים בתחילית 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
  }
}

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