שליטה בגישה למשאבים באמצעות IAM
במסמך הזה מוסבר איך להציג, להעניק ולבטל אמצעי בקרה לגישה למערכי נתונים של BigQuery ולמשאבים בתוך מערכי נתונים: טבלאות, תצוגות ושגרות. למרות שמודלים הם גם משאבים ברמת מערך הנתונים, אי אפשר להעניק גישה למודלים ספציפיים באמצעות תפקידי IAM.
אפשר להעניק גישה למשאבים ב- Google Cloud באמצעות כללי מדיניות ההרשאה, שנקראים גם כללי מדיניות של ניהול זהויות והרשאות גישה (IAM) ומצורפים למשאבים. אפשר לצרף רק מדיניות הרשאה אחת לכל משאב. מדיניות ההרשאה שולטת בגישה למשאב עצמו, וכן לכל הצאצאים של המשאב שיורשים את מדיניות ההרשאה.
מידע נוסף על מדיניות הרשאות מופיע במאמר מבנה המדיניות במסמכי התיעוד של IAM.
במסמך הזה מניחים שיש לכם ידע בניהול זהויות והרשאות גישה (IAM) ב- Google Cloud.
מגבלות
- רשימות שגרתיות של בקרת גישה (ACL) לא נכללות בשגרה משוכפלת.
- שגרות בתוך מערכי נתונים חיצוניים או מקושרים לא תומכות באמצעי בקרה לגישה.
- אין תמיכה באמצעי בקרה לגישה לטבלאות בתוך מערכי נתונים חיצוניים או מקושרים.
- אי אפשר להגדיר אמצעי בקרת גישה לתרחישים באמצעות Terraform.
- אי אפשר להגדיר אמצעי בקרה לגישה לתרחישים באמצעות Google Cloud SDK.
- אי אפשר להגדיר בקרת גישה שגרתית באמצעות שפת בקרת הנתונים (DCL) ב-BigQuery.
- ב-Data Catalog אין תמיכה באמצעי בקרה שגרתיים על הגישה. אם משתמש העניק גישה ברמת השגרה בתנאי מסוים, הוא לא יראה את השגרה שלו בחלונית הצדדית של BigQuery. כפתרון עקיף, אפשר להעניק גישה ברמת מערך הנתונים.
- בתצוגה
INFORMATION_SCHEMA.OBJECT_PRIVILEGESלא מוצגים אמצעי בקרה לגישה לשגרה.
לפני שמתחילים
להקצות תפקידים של ניהול זהויות והרשאות גישה (IAM) שנותנים למשתמשים את ההרשאות הדרושות לביצוע כל משימה במסמך הזה.
התפקידים הנדרשים
כדי לקבל את ההרשאות שנדרשות לשינוי מדיניות IAM למשאבים, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM BigQuery Data Owner (הבעלים של נתוני BigQuery) (roles/bigquery.dataOwner) בפרויקט.
כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
זהו תפקיד שמוגדר מראש וכולל את ההרשאות שנדרשות לשינוי מדיניות IAM למשאבים. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:
ההרשאות הנדרשות
כדי לשנות את כללי מדיניות ה-IAM של משאבים, נדרשות ההרשאות הבאות:
-
כדי לקבל את מדיניות הגישה של מערך נתונים:
bigquery.datasets.get -
כדי להגדיר את מדיניות הגישה של מערך נתונים:
bigquery.datasets.update -
כדי לקבל את מדיניות הגישה של מערך נתונים (Google Cloud מסוף בלבד):
bigquery.datasets.getIamPolicy -
כדי להגדיר את מדיניות הגישה של מערך נתונים (במסוף בלבד):
bigquery.datasets.setIamPolicy -
כדי לקבל את המדיניות של טבלה או תצוגה:
bigquery.tables.getIamPolicy -
כדי להגדיר מדיניות לטבלה או לתצוגה:
bigquery.tables.setIamPolicy -
כדי לקבל את מדיניות הגישה של שגרה:
bigquery.routines.getIamPolicy -
כדי להגדיר מדיניות גישה לתרחיש:
bigquery.routines.setIamPolicy -
כדי ליצור כלי bq או משימות SQL BigQuery (אופציונלי):
bigquery.jobs.create
יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
עבודה עם אמצעי בקרה על גישה למערכי נתונים
כדי לתת גישה למערך נתונים, צריך להקצות חשבון משתמש ב-IAM לתפקיד מוגדר מראש או לתפקיד בהתאמה אישית, שמגדיר מה חשבון המשתמש יכול לעשות עם מערך הנתונים. הפעולה הזו נקראת גם צירוף מדיניות הרשאות למשאב. אחרי שנותנים גישה, אפשר לראות את אמצעי הבקרה של הגישה למערך הנתונים, ואפשר לבטל את הגישה למערך הנתונים.
איך מעניקים גישה למערך נתונים
אי אפשר להעניק גישה למערך נתונים כשיוצרים אותו באמצעות ממשק האינטרנט של BigQuery או כלי שורת הפקודה של BigQuery. קודם צריך ליצור את מערך הנתונים ואז להעניק לו גישה.
ממשק ה-API מאפשר להעניק גישה במהלך יצירת מערך נתונים על ידי הפעלת השיטה datasets.insert עם משאב מוגדר של מערך נתונים.
פרויקט הוא מקור האב של מערך נתונים, ומערך נתונים הוא מקור האב של טבלאות ותצוגות, שגרות ומודלים. כשמקצים תפקיד ברמת הפרויקט, התפקיד וההרשאות שלו עוברים בירושה למערך הנתונים ולמשאבים של מערך הנתונים. באופן דומה, כשמקצים תפקיד ברמת מערך הנתונים, התפקיד וההרשאות שלו עוברים בירושה למשאבים שבתוך מערך הנתונים.
אתם יכולים לתת גישה למערך נתונים על ידי הקצאת הרשאה לתפקיד ב-IAM לגשת למערך הנתונים, או על ידי מתן גישה מותנית באמצעות תנאי IAM. מידע נוסף על מתן גישה מותנית זמין במאמר שליטה בגישה באמצעות תנאי IAM.
כדי להעניק לתפקיד IAM גישה למערך נתונים בלי להשתמש בתנאים, בוחרים באחת מהאפשרויות הבאות:
המסוף
עוברים לדף BigQuery.
בחלונית הימנית, לוחצים על כלי הניתוחים:

אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.
בחלונית Explorer, מרחיבים את הפרויקט, לוחצים על Datasets ובוחרים מערך נתונים.
לוחצים על שיתוף > הרשאות.
לוחצים על Add principal.
בשדה New principals, מזינים חשבון משתמש.
ברשימה Select a role, בוחרים תפקיד מוגדר מראש או תפקיד בהתאמה אישית.
לוחצים על Save.
כדי לחזור לפרטי מערך הנתונים, לוחצים על סגירה.
SQL
כדי להעניק לישויות גישה למערכי נתונים, משתמשים בהצהרת DCL GRANT:
במסוף Google Cloud , עוברים לדף BigQuery.
מזינים את ההצהרה הבאה בעורך השאילתות:
GRANT `ROLE_LIST` ON SCHEMA RESOURCE_NAME TO "USER_LIST"
מחליפים את מה שכתוב בשדות הבאים:
-
ROLE_LIST: תפקיד או רשימה של תפקידים מופרדים בפסיקים שרוצים להקצות -
RESOURCE_NAME: השם של מערך הנתונים שרוצים להעניק לו גישה
USER_LIST: רשימה מופרדת בפסיקים של משתמשים שהתפקיד מוקצה להםרשימת הפורמטים התקינים זמינה במאמר
user_list.
-
לוחצים על הפעלה.
מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.
בדוגמה הבאה מוקצית ל-myDataset הרשאת צפייה בנתוני BigQuery:
GRANT `roles/bigquery.dataViewer`
ON SCHEMA `myProject`.myDataset
TO "user:user@example.com", "user:user2@example.com"
BQ
-
במסוף Google Cloud , מפעילים את Cloud Shell.
בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
כדי לכתוב את פרטי מערך הנתונים הקיים (כולל אמצעי בקרת הגישה) לקובץ JSON, משתמשים בפקודה
bq show:bq show \ --format=prettyjson \ PROJECT_ID:DATASET > PATH_TO_FILE
מחליפים את מה שכתוב בשדות הבאים:
- PROJECT_ID: מזהה הפרויקט
- DATASET: השם של מערך הנתונים
- PATH_TO_FILE: הנתיב לקובץ ה-JSON במחשב המקומי
מבצעים שינויים בקטע
accessבקובץ ה-JSON. אפשר להוסיף לכל אחת מהרשומות שלspecialGroupאת הערכים:projectOwners,projectWriters,projectReadersו-allAuthenticatedUsers. אפשר גם להוסיף את אחד מהערכים הבאים:userByEmail,groupByEmailו-domain.לדוגמה, הקטע
accessבקובץ JSON של מערך נתונים ייראה כך:{ "access": [ { "role": "READER", "specialGroup": "projectReaders" }, { "role": "WRITER", "specialGroup": "projectWriters" }, { "role": "OWNER", "specialGroup": "projectOwners" }, { "role": "READER", "specialGroup": "allAuthenticatedUsers" }, { "role": "READER", "domain": "domain_name" }, { "role": "WRITER", "userByEmail": "user_email" }, { "role": "READER", "groupByEmail": "group_email" } ], ... }
אחרי שמסיימים לערוך, משתמשים בפקודה
bq updateוכוללים את קובץ ה-JSON באמצעות הדגל--source. אם מערך הנתונים נמצא בפרויקט שאינו פרויקט ברירת המחדל שלכם, צריך להוסיף את מזהה הפרויקט לשם מערך הנתונים בפורמט הבא:PROJECT_ID:DATASET.bq update
--source PATH_TO_FILE
PROJECT_ID:DATASETכדי לאמת את השינויים בבקרת הגישה, משתמשים שוב בפקודה
bq showבלי לכתוב את המידע לקובץ:bq show --format=prettyjson PROJECT_ID:DATASET
Terraform
אפשר להשתמש במשאבי google_bigquery_dataset_iam כדי לעדכן את הגישה לקבוצת נתונים.
הגדרת מדיניות הגישה למערך נתונים
בדוגמה הבאה מוצג אופן השימוש במשאב google_bigquery_dataset_iam_policy כדי להגדיר את מדיניות IAM עבור מערך הנתונים mydataset. הפעולה הזו מחליפה כל מדיניות קיימת שכבר צורפה למערך הנתונים:
# This file sets the IAM policy for the dataset created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" dataset resource with a dataset_id of "mydataset". data "google_iam_policy" "iam_policy" { binding { role = "roles/bigquery.admin" members = [ "user:user@example.com", ] } binding { role = "roles/bigquery.dataOwner" members = [ "group:data.admin@example.com", ] } binding { role = "roles/bigquery.dataEditor" members = [ "serviceAccount:bqcx-1234567891011-12a3@gcp-sa-bigquery-condel.iam.gserviceaccount.com", ] } } resource "google_bigquery_dataset_iam_policy" "dataset_iam_policy" { dataset_id = google_bigquery_dataset.default.dataset_id policy_data = data.google_iam_policy.iam_policy.policy_data }
הגדרת חברות בתפקיד עבור מערך נתונים
בדוגמה הבאה אפשר לראות איך משתמשים במשאב google_bigquery_dataset_iam_binding כדי להגדיר חברות בתפקיד מסוים עבור מערך הנתונים mydataset. הפעולה הזו תחליף את החברות הקיימת בתפקיד הזה.
תפקידים אחרים במדיניות IAM של מערך הנתונים נשמרים:
# This file sets membership in an IAM role for the dataset created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" dataset resource with a dataset_id of "mydataset". resource "google_bigquery_dataset_iam_binding" "dataset_iam_binding" { dataset_id = google_bigquery_dataset.default.dataset_id role = "roles/bigquery.jobUser" members = [ "user:user@example.com", "group:group@example.com" ] }
הגדרת חברות בתפקיד עבור חשבון משתמש יחיד
בדוגמה הבאה מוצג אופן השימוש במשאב google_bigquery_dataset_iam_member כדי לעדכן את מדיניות IAM של מערך הנתונים mydataset ולהעניק תפקיד לחשבון משתמש אחד. עדכון מדיניות ה-IAM הזו לא משפיע על הגישה של גורמים אחרים שקיבלו את התפקיד הזה במערך הנתונים.
# This file adds a member to an IAM role for the dataset created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" dataset resource with a dataset_id of "mydataset". resource "google_bigquery_dataset_iam_member" "dataset_iam_member" { dataset_id = google_bigquery_dataset.default.dataset_id role = "roles/bigquery.user" member = "user:user@example.com" }
כדי להחיל את הגדרות Terraform בפרויקט ב- Google Cloud , מבצעים את השלבים בקטעים הבאים.
הכנת Cloud Shell
- מפעילים את Cloud Shell.
-
מגדירים את פרויקט ברירת המחדל שבו רוצים להחיל את ההגדרות של Terraform. Google Cloud
תצטרכו להריץ את הפקודה הזו רק פעם אחת לכל פרויקט, ותוכלו לעשות זאת בכל ספרייה.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
אם תגדירו ערכים ספציפיים בקובץ התצורה של Terraform, הם יבטלו את ערכי ברירת המחדל של משתני הסביבה.
הכנת הספרייה
לכל קובץ תצורה של Terraform צריכה להיות ספרייה משלו (שנקראת גם מודול ברמה הבסיסית).
-
יוצרים ספרייה חדשה ב-Cloud Shell ובה יוצרים קובץ חדש. שם הקובץ חייב לכלול את הסיומת
.tf, למשלmain.tf. במדריך הזה, הקובץ נקראmain.tf.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
אם אתם עוקבים אחרי המדריך, תוכלו להעתיק את הקוד לדוגמה בכל קטע או שלב.
מעתיקים את הקוד לדוגמה בקובץ
main.tfהחדש שיצרתם.לחלופין, אפשר גם להעתיק את הקוד מ-GitHub. כדאי לעשות את זה כשקטע הקוד של Terraform הוא חלק מפתרון מקצה לקצה.
- בודקים את הפרמטרים לדוגמה ומשנים אותם בהתאם לסביבה שלכם.
- שומרים את השינויים.
-
מפעילים את Terraform. צריך לעשות זאת רק פעם אחת לכל ספרייה.
terraform init
אופציונלי: תוכלו לכלול את האפשרות
-upgrade, כדי להשתמש בגרסה העדכנית ביותר של הספק של Google:terraform init -upgrade
החלה של השינויים
-
בודקים את ההגדרות ומוודאים שהמשאבים שמערכת Terraform תיצור או תעדכן תואמים לציפיות שלכם:
terraform plan
מתקנים את ההגדרות לפי הצורך.
-
מריצים את הפקודה הבאה ומזינים
yesבהודעה שמופיעה, כדי להחיל את הגדרות Terraform:terraform apply
ממתינים עד שב-Terraform תוצג ההודעה "Apply complete!".
- פותחים את Google Cloud הפרויקט כדי לראות את התוצאות. במסוף Google Cloud , נכנסים למשאבים בממשק המשתמש כדי לוודא שהם נוצרו או עודכנו ב-Terraform.
API
כדי להחיל אמצעי בקרה על הגישה כשיוצרים את מערך הנתונים, קוראים ל-method datasets.insert עם משאב מוגדר של מערך נתונים.
כדי לעדכן את אמצעי בקרת הגישה, צריך לבצע קריאה ל-method datasets.patch ולהשתמש במאפיין access במשאב Dataset.
השיטה המומלצת לעדכון הרשאות גישה היא datasets.patch, כי השיטה datasets.update מחליפה את כל משאב מערך הנתונים.
המשך
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
כדי להגדיר את רשימת הגישה החדשה, מוסיפים את הרשומה החדשה לרשימה הקיימת עםDatasetMetadataToUpdate type
. לאחר מכן קוראים לפונקציה dataset.Update() כדי לעדכן את הנכס.