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

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

אפשר להעניק גישה למשאבים ב- Cloud de Confiance by S3NS באמצעות כללי מדיניות ההרשאה, שנקראים גם כללי מדיניות של IAM ומצורפים למשאבים. אפשר לצרף רק מדיניות הרשאה אחת לכל משאב. מדיניות ההרשאה שולטת בגישה למשאב עצמו, וגם לכל הצאצאים של המשאב שיורשים את מדיניות ההרשאה.

למידע נוסף על מדיניות ההרשאות, קראו את המאמר מבנה המדיניות במסמכי התיעוד של IAM.

המסמך הזה מבוסס על היכרות עם IAM ב- Cloud de Confiance.

מגבלות

  • רשימות של בקרת גישה (ACL) לשגרות לא נכללות בשגרות משוכפלות.
  • אי אפשר להגדיר בקרת גישה לשגרות בתוך מערכי נתונים חיצוניים או מקושרים.
  • בטבלאות בתוך מערכי נתונים חיצוניים או מקושרים אין תמיכה באמצעי בקרת גישה.
  • אי אפשר להגדיר אמצעי בקרת גישה לשגרות באמצעות Terraform.
  • אי אפשר להגדיר בקרות גישה לשגרות באמצעות Google Cloud SDK.
  • אי אפשר להגדיר בקרות גישה לשגרות באמצעות שפת בקרת הנתונים (DCL) ב-BigQuery.
  • בתצוגה INFORMATION_SCHEMA.OBJECT_PRIVILEGES לא מוצגים אמצעי בקרת גישה לשגרות.

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

להקצות תפקידים של ניהול זהויות והרשאות גישה (IAM) שנותנים למשתמשים את ההרשאות שנדרשות כדי לבצע כל משימה במסמך הזה.

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

כדי לקבל את ההרשאות שנדרשות לשינוי מדיניות ה-IAM של המשאבים, צריך לבקש מהאדמין להקצות לכם את התפקיד הבעלים של נתוני BigQuery (roles/bigquery.dataOwner) ב-IAM בפרויקט. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

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

כדי לשנות את מדיניות ה-IAM של המשאבים, נדרשות ההרשאות הבאות:

  • כדי לקבל את מדיניות הגישה של מערך נתונים: bigquery.datasets.get
  • כדי להגדיר את מדיניות הגישה של מערך נתונים: bigquery.datasets.update
  • כדי לקבל את מדיניות הגישה של מערך נתונים (Cloud de Confiance במסוף בלבד): 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 מאפשר להעניק גישה במהלך יצירת מערך הנתונים, על ידי קריאה ל-method‏ datasets.insert עם משאב מערך נתונים מוגדר.

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

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

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

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

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

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

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

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

  8. לוחצים על Save.

  9. כדי לחזור לפרטי מערך הנתונים, לוחצים על סגירה.

SQL

כדי לתת לחשבונות משתמשים גישה למערכי נתונים, משתמשים בהצהרת DCL של GRANT:

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מזינים את ההצהרה הבאה:

    GRANT `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    TO "USER_LIST"

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

    • ‫ROLE_LIST: תפקיד או רשימה של תפקידים שרוצים לתת, מופרדים בפסיקים
    • ‫RESOURCE_NAME: שם מערך הנתונים שאתם נותנים גישה אליו
    • ‫USER_LIST: רשימה מופרדת בפסיקים של משתמשים שהתפקיד מוקצה להם

      לרשימה של פורמטים תקינים, ראו user_list.

  3. ‫לוחצים על Run.

מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.

בדוגמה הבאה, התפקיד "צפייה בנתוני BigQuery" מוקצה ל-myDataset:

GRANT `roles/bigquery.dataViewer`
ON SCHEMA `myProject`.myDataset
TO "user:user@example.com", "user:user2@example.com"

BQ

  1. מפעילים את Cloud Shell במסוף Cloud de Confiance .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Cloud de Confiance יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. כדי לכתוב את המידע הקיים של קבוצת הנתונים (כולל בקרת גישה) לקובץ JSON, משתמשים בפקודה bq show:

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

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

    • ‫PROJECT_ID: מזהה הפרויקט
    • ‫DATASET: השם של מערך הנתונים
    • ‫PATH_TO_FILE: הנתיב לקובץ ה-JSON במחשב המקומי
  3. מבצעים שינויים בקטע 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"
      }
     ],
     ...
    }
  4. כשמסיימים לערוך, משתמשים בפקודה bq update וכוללים את קובץ ה-JSON באמצעות הדגל --source. אם מערך הנתונים נמצא בפרויקט אחר מפרויקט ברירת המחדל, מוסיפים את מזהה הפרויקט לשם של מערך הנתונים בפורמט הבא: PROJECT_ID:DATASET.

      bq update 
    --source PATH_TO_FILE
    PROJECT_ID:DATASET

  5. כדי לאמת את השינויים בבקרת הגישה, משתמשים שוב בפקודה 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.s3ns-system.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 בפרויקט ב- Cloud de Confiance :

הכנת Cloud Shell

  1. מפעילים את Cloud Shell.
  2. מגדירים את פרויקט ברירת המחדל ב- Cloud de Confiance שבו רוצים להחיל את ההגדרות של Terraform.

    תצטרכו להריץ את הפקודה הזו רק פעם אחת לכל פרויקט, ותוכלו לעשות זאת בכל ספרייה.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

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

הכנת הספרייה

לכל קובץ תצורה של Terraform צריכה להיות ספרייה משלו (שנקראת גם מודול ברמה הבסיסית).

  1. יוצרים ספרייה חדשה ב-Cloud Shell ובה יוצרים קובץ חדש. שם הקובץ חייב לכלול את הסיומת .tf, למשל main.tf. במדריך הזה, הקובץ נקרא main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. אם אתם עוקבים אחרי המדריך, תוכלו להעתיק את הקוד לדוגמה בכל קטע או שלב.

    מעתיקים את הקוד לדוגמה בקובץ main.tf החדש שיצרתם.

    לחלופין, אפשר גם להעתיק את הקוד מ-GitHub. כדאי לעשות את זה כשקטע הקוד של Terraform הוא חלק מפתרון מקצה לקצה.

  3. בודקים את הפרמטרים לדוגמה ומשנים אותם בהתאם לסביבה שלכם.
  4. שומרים את השינויים.
  5. מפעילים את Terraform. צריך לעשות זאת רק פעם אחת לכל ספרייה.
    terraform init

    אופציונלי: תוכלו לכלול את האפשרות -upgrade, כדי להשתמש בגרסה העדכנית ביותר של הספק של Google:

    terraform init -upgrade

החלה של השינויים

  1. בודקים את ההגדרות ומוודאים שהמשאבים שמערכת Terraform תיצור או תעדכן תואמים לציפיות שלכם:
    terraform plan

    מתקנים את ההגדרות לפי הצורך.

  2. מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה, כדי להחיל את הגדרות Terraform:
    terraform apply

    ממתינים עד שב-Terraform תוצג ההודעה "Apply complete!‎".

  3. פותחים את הפרויקט ב- Cloud de Confiance כדי להציג את התוצאות. במסוף Cloud de Confiance , נכנסים למשאבים בממשק המשתמש כדי לוודא שהם נוצרו או עודכנו ב-Terraform.

API

כדי להחיל אמצעי בקרת גישה כשיוצרים את מערך הנתונים, מפעילים את ה-method‏ datasets.insert עם משאב מערך נתונים מוגדר. כדי לעדכן את אמצעי בקרת הגישה, צריך להפעיל את ה-method‏ datasets.patch ולהשתמש במאפיין access במשאב Dataset.

ה-method‏ datasets.update מחליפה את כל המשאב של מערך הנתונים, ולכן datasets.patch היא ה-method המועדפת לעדכון אמצעי בקרת הגישה.

המשך

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מגדירים את רשימת הגישה החדשה על ידי הוספת הרשומה החדשה לרשימה הקיימת עם סוג DatasetMetadataToUpdate . ואז קוראים לפונקציה dataset.Update() כדי לעדכן את הנכס.
import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
)

// grantAccessToDataset creates a new ACL conceding the READER role to the group "example-analyst-group@google.com"
// For more information on the types of ACLs available see:
// https://cloud.google.com/storage/docs/access-control/lists
func grantAccessToDataset(w io.Writer, projectID, datasetID string) error {
	// TODO(developer): uncomment and update the following lines:
	// projectID := "my-project-id"
	// datasetID := "mydataset"

	ctx := context.Background()

	// Create BigQuery handler.
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %w", err)
	}
	defer client.Close()

	// Create dataset handler
	dataset := client.Dataset(datasetID)

	// Get metadata
	meta, err := dataset.Metadata(ctx)
	if err != nil {
		return fmt.Errorf("bigquery.Dataset.Metadata: %w", err)
	}

	// Find more details about BigQuery Entity Types here:
	// https://pkg.go.dev/cloud.google.com/go/bigquery#EntityType
	//
	// Find more details about BigQuery Access Roles here:
	// https://pkg.go.dev/cloud.google.com/go/bigquery#AccessRole

	entityType := bigquery.GroupEmailEntity
	entityID := "example-analyst-group@google.com"
	roleType := bigquery.ReaderRole

	// Append a new access control entry to the existing access list.
	update := bigquery.DatasetMetadataToUpdate{
		Access: append(meta.Access, &bigquery.AccessEntry{
			Role:       roleType,
			EntityType: entityType,
			Entity:     entityID,
		}),
	}

	// Leverage the ETag for the update to assert there's been no modifications to the
	// dataset since the metadata was originally read.
	meta, err = dataset.Update(ctx, update, meta.ETag)
	if err != nil {
		return err
	}

	fmt.Fprintf(w, "Details for Access entries in dataset %v.\n", datasetID)
	for _, access := range meta.Access {
		fmt.Fprintln(w)
		fmt.Fprintf(w, "Role: %s\n", access.Role)
		fmt.Fprintf(w, "Entities: %v\n", access.Entity)
	}

	return nil
}

Java

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

import com.google.cloud.bigquery.Acl;
import com.google.cloud.bigquery.Acl.Entity;
import com.google.cloud.bigquery.Acl.Group;
import com.google.cloud.bigquery.Acl.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import com.google.cloud.bigquery.DatasetId;
import java.util.ArrayList;
import java.util.List;

public class GrantAccessToDataset {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    // Project and dataset from which to get the access policy
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    // Group to add to the ACL
    String entityEmail = "group-to-add@example.com";

    grantAccessToDataset(projectId, datasetName, entityEmail);
  }

  public static void grantAccessToDataset(
      String projectId, String datasetName, String entityEmail) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      // Create datasetId with the projectId and the datasetName.
      DatasetId datasetId = DatasetId.of(projectId, datasetName);
      Dataset dataset = bigquery.getDataset(datasetId);

      // Create a new Entity with the corresponding type and email
      // "user-or-group-to-add@example.com"
      // For more information on the types of Entities available see:
      // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity
      // and
      // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity.Type
      Entity entity = new Group(entityEmail);

      // Create a new ACL granting the READER role to the group with the entity email
      // "user-or-group-to-add@example.com"
      // For more information on the types of ACLs available see:
      // https://cloud.google.com/storage/docs/access-control/lists
      Acl newEntry = Acl.of(entity, Role.READER);

      // Get a copy of the ACLs list from the dataset and append the new entry.
      List<Acl> acls = new ArrayList<>(dataset.getAcl());
      acls.add(newEntry);

      // Update the ACLs by setting the new list.
      Dataset updatedDataset = bigquery.update(dataset.toBuilder().setAcl(acls).build());
      System.out.println(
          "ACLs of dataset \""
              + updatedDataset.getDatasetId().getDataset()
              + "\" updated successfully");
    } catch (BigQueryException e) {
      System.out.println("ACLs were not updated \n" + e.toString());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Node.js API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מגדירים את רשימת הגישה החדשה על ידי הוספת הרשומה החדשה לרשימה הקיימת באמצעות השיטה Dataset#metadata. ואז קוראים לפונקציה Dataset#setMetadata()‎ כדי לעדכן את הנכס.

/**
 * TODO(developer): Update and un-comment below lines.
 */

// const datasetId = "my_project_id.my_dataset_name";

// ID of the user or group from whom you are adding access.
// const entityId = "user-or-group-to-add@example.com";

// One of the "Basic roles for datasets" described here:
// https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
// const role = "READER";

const {BigQuery} = require('@google-cloud/bigquery');

// Instantiate a client.
const client = new BigQuery();

// Type of entity you are granting access to.
// Find allowed allowed entity type names here:
// https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#resource:-dataset
const entityType = 'groupByEmail';

async function grantAccessToDataset() {
  const [dataset] = await client.dataset(datasetId).get();

  // The 'access entries' array is immutable. Create a copy for modifications.
  const entries = [...dataset.metadata.access];

  // Append an AccessEntry to grant the role to a dataset.
  // Find more details about the AccessEntry object in the BigQuery documentation:
  // https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
  entries.push({
    role,
    [entityType]: entityId,
  });

  // Assign the array of AccessEntries back to the dataset.
  const metadata = {
    access: entries,
  };

  // Update will only succeed if the dataset
  // has not been modified externally since retrieval.
  //
  // See the BigQuery client library documentation for more details on metadata updates:
  // https://cloud.google.com/nodejs/docs/reference/bigquery/latest

  // Update just the 'access entries' property of the dataset.
  await client.dataset(datasetId).setMetadata(metadata);

  console.log(
    `Role '${role}' granted for entity '${entityId}' in '${datasetId}'.`
  );
}

Python

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מגדירים את המאפיין dataset.access_entries באמצעות אמצעי בקרת הגישה של קבוצת הנתונים. ואז קוראים לפונקציה client.update_dataset() כדי לעדכן את הנכס.
from google.api_core.exceptions import PreconditionFailed
from google.cloud import bigquery
from google.cloud.bigquery.enums import EntityTypes

# TODO(developer): Update and uncomment the lines below.

# ID of the dataset to grant access to.
# dataset_id = "my_project_id.my_dataset"

# ID of the user or group receiving access to the dataset.
# Alternatively, the JSON REST API representation of the entity,
# such as the view's table reference.
# entity_id = "user-or-group-to-add@example.com"

# One of the "Basic roles for datasets" described here:
# https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
# role = "READER"

# Type of entity you are granting access to.
# Find allowed allowed entity type names here:
# https://cloud.google.com/python/docs/reference/bigquery/latest/enums#class-googlecloudbigqueryenumsentitytypesvalue
entity_type = EntityTypes.GROUP_BY_EMAIL

# Instantiate a client.
client = bigquery.Client()

# Get a reference to the dataset.
dataset = client.get_dataset(dataset_id)

# The `access_entries` list is immutable. Create a copy for modifications.
entries = list(dataset.access_entries)

# Append an AccessEntry to grant the role to a dataset.
# Find more details about the AccessEntry object here:
# https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
entries.append(
    bigquery.AccessEntry(
        role=role,
        entity_type=entity_type,
        entity_id=entity_id,
    )
)

# Assign the list of AccessEntries back to the dataset.
dataset.access_entries = entries

# Update will only succeed if the dataset
# has not been modified externally since retrieval.
#
# See the BigQuery client library documentation for more details on `update_dataset`:
# https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.client.Client#google_cloud_bigquery_client_Client_update_dataset
try:
    # Update just the `access_entries` property of the dataset.
    dataset = client.update_dataset(
        dataset,
        ["access_entries"],
    )

    # Show a success message.
    full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
    print(
        f"Role '{role}' granted for entity '{entity_id}'"
        f" in dataset '{full_dataset_id}'."
    )
except PreconditionFailed:  # A read-modify-write error
    print(
        f"Dataset '{dataset.dataset_id}' was modified remotely before this update. "
        "Fetch the latest version and retry."
    )

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

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

תפקיד תיאור
BigQuery Data Owner (roles/bigquery.dataOwner) כשמקצים את התפקיד הזה למערך נתונים, הוא מעניק את ההרשאות הבאות:
  • כל ההרשאות למערך הנתונים ולכל המשאבים שבמערך הנתונים: טבלאות ותצוגות, מודלים ושגרות.
BigQuery Data Editor (roles/bigquery.dataEditor) כשמקצים את התפקיד הזה למערך נתונים, הוא מעניק את ההרשאות הבאות:
  • מקבלים את המטא-נתונים וההרשאות של מערך הנתונים.
  • לטבלאות ולתצוגות:
    • ליצור, לעדכן, לקבל, להציג ברשימה ולמחוק את הטבלאות והתצוגות של מערך הנתונים.
    • לקרוא (לשלוח שאילתות), לייצא, לשכפל ולעדכן נתונים בטבלאות.
    • ליצור, לעדכן ולמחוק אינדקסים.
    • ליצור ולשחזר קובצי snapshot.
  • כל ההרשאות לשגרות ולמודלים של מערך הנתונים.
BigQuery Data Viewer (roles/bigquery.dataViewer) כשמקצים את התפקיד הזה למערך נתונים, הוא מעניק את ההרשאות הבאות:
  • מקבלים את המטא-נתונים וההרשאות של מערך הנתונים.
  • להציג רשימה של הטבלאות, התצוגות והמודלים של מערך נתונים.
  • קבלת מטא-נתונים ובקרות גישה לטבלאות ולתצוגות של מערך הנתונים.
  • לקרוא (לשלוח שאילתות), לשכפל ולייצא נתונים מטבלאות וליצור תמונות מצב.
  • להציג רשימה של השגרות של מערך הנתונים ולהפעיל אותן.
BigQuery Metadata Viewer (roles/bigquery.metadataViewer) כשמקצים את התפקיד הזה למערך נתונים, הוא מעניק את ההרשאות הבאות:
  • מקבלים מטא-נתונים ובקרות גישה לקבוצת הנתונים.
  • לקבל מטא-נתונים ובקרות גישה לטבלאות ולתצוגות.
  • קבלת מטא-נתונים מהמודלים ומהשגרות של מערך הנתונים.
  • להציג רשימה של טבלאות, תצוגות, מודלים ושגרות במערך הנתונים.

הרשאות למערך הנתונים

רוב ההרשאות שמתחילות ב-bigquery.datasets חלות ברמת מערך הנתונים. bigquery.datasets.create לא. כדי ליצור מערכי נתונים, צריך להקצות את ההרשאה bigquery.datasets.create לתפקיד בקונטיינר ההורה – הפרויקט.

בטבלה הבאה מפורטות כל ההרשאות למערכי נתונים, והמשאב ברמה הנמוכה ביותר שאפשר להחיל עליו את ההרשאה.

הרשאה משאב פעולה
bigquery.datasets.create פרויקט יצירת קבוצות נתונים חדשות בפרויקט.
bigquery.datasets.get קבוצת הנתונים מקבלים מטא-נתונים ובקרות גישה לקבוצת הנתונים. כדי לראות את ההרשאות במסוף, צריך גם את ההרשאה bigquery.datasets.getIamPolicy.
bigquery.datasets.getIamPolicy קבוצת הנתונים נדרשת על ידי המסוף כדי להעניק למשתמש הרשאת משתמש לקבל את אמצעי בקרת הגישה של קבוצת נתונים. הוא נפתח במקרה של כשל. כדי להציג את מערך הנתונים במסוף, נדרשת גם ההרשאה bigquery.datasets.get.
bigquery.datasets.update קבוצת הנתונים מעדכנים את המטא-נתונים ואת אמצעי בקרת הגישה של מערך הנתונים. כדי לעדכן את אמצעי בקרת הגישה במסוף, נדרשת גם ההרשאה bigquery.datasets.setIamPolicy.
bigquery.datasets.setIamPolicy קבוצת הנתונים נדרשת על ידי המסוף כדי לתת למשתמש הרשאה להגדיר את אמצעי בקרת הגישה של מערך הנתונים. הוא נפתח במקרה של כשל. בנוסף, כדי לעדכן את מערך הנתונים, צריך את ההרשאה bigquery.datasets.update במסוף.
bigquery.datasets.delete קבוצת הנתונים למחוק קבוצת נתונים.
bigquery.datasets.createTagBinding קבוצת הנתונים מצרפים תגים למערך הנתונים.
bigquery.datasets.deleteTagBinding קבוצת הנתונים ניתוק התגים ממערך הנתונים.
bigquery.datasets.listTagBindings קבוצת הנתונים רשימת התגים של מערך הנתונים.
bigquery.datasets.listEffectiveTags קבוצת הנתונים הצגת התגים בפועל (שהוחלו ושהתקבלו בירושה) של מערך הנתונים.
bigquery.datasets.link קבוצת הנתונים יוצרים מערך נתונים מקושר.
bigquery.datasets.listSharedDatasetUsage פרויקט הצגת נתוני השימוש של מערכי נתונים משותפים שיש לכם גישה אליהם בפרויקט. ההרשאה הזו נדרשת כדי לשלוח שאילתות לתצוגה INFORMATION_SCHEMA.SHARED_DATASET_USAGE.

הצגת אמצעי בקרת הגישה של מערך נתונים

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

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

    אמצעי בקרת הגישה של מערך הנתונים מופיעים בחלונית Dataset Permissions.

BQ

  1. מפעילים את Cloud Shell במסוף Cloud de Confiance .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Cloud de Confiance יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

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

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

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

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

SQL

שולחים שאילתה לתצוגה INFORMATION_SCHEMA.OBJECT_PRIVILEGES. בשאילתות לאחזור אמצעי בקרת הגישה של מערך נתונים, צריך לציין את object_name.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מזינים את ההצהרה הבאה:

    SELECT
    COLUMN_LIST
    FROM
      PROJECT_ID.`region-REGION`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
    WHERE
    object_name = "DATASET";

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

  3. ‫לוחצים על Run.

מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.

דוגמה:

השאילתה הזו מקבלת אמצעי בקרת גישה עבור mydataset.

SELECT
object_name, privilege_type, grantee
FROM
my_project.`region-us`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
WHERE
object_name = "mydataset";

הפלט אמור להיראות כך:

+------------------+-----------------------------+-------------------------+
|   object_name    |  privilege_type             | grantee                 |
+------------------+-----------------------------+-------------------------+
| mydataset        | roles/bigquery.dataOwner    | projectOwner:myproject  |
| mydataset        | roles/bigquery.dataViwer    | user:user@example.com   |
+------------------+-----------------------------+-------------------------+

API

כדי לראות את בקרת הגישה של קבוצת נתונים, מפעילים את ה-method‏ datasets.get עם משאב dataset מוגדר.

אמצעי בקרת הגישה מופיעים במאפיין access של המשאב dataset.

המשך

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מפעילים את הפונקציה client.Dataset().Metadata(). מדיניות הגישה זמינה במאפיין Access.
import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
)

// viewDatasetAccessPolicies retrieves the ACL for the given dataset
// For more information on the types of ACLs available see:
// https://cloud.google.com/storage/docs/access-control/lists
func viewDatasetAccessPolicies(w io.Writer, projectID, datasetID string) error {
	// TODO(developer): uncomment and update the following lines:
	// projectID := "my-project-id"
	// datasetID := "mydataset"

	ctx := context.Background()

	// Create new client.
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %w", err)
	}
	defer client.Close()

	// Get dataset's metadata.
	meta, err := client.Dataset(datasetID).Metadata(ctx)
	if err != nil {
		return fmt.Errorf("bigquery.Client.Dataset.Metadata: %w", err)
	}

	fmt.Fprintf(w, "Details for Access entries in dataset %v.\n", datasetID)

	// Iterate over access permissions.
	for _, access := range meta.Access {
		fmt.Fprintln(w)
		fmt.Fprintf(w, "Role: %s\n", access.Role)
		fmt.Fprintf(w, "Entity: %v\n", access.Entity)
	}

	return nil
}

Java

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.


import com.google.cloud.bigquery.Acl;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import com.google.cloud.bigquery.DatasetId;
import java.util.List;

public class GetDatasetAccessPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    // Project and dataset from which to get the access policy.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    getDatasetAccessPolicy(projectId, datasetName);
  }

  public static void getDatasetAccessPolicy(String projectId, String datasetName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      // Create datasetId with the projectId and the datasetName.
      DatasetId datasetId = DatasetId.of(projectId, datasetName);
      Dataset dataset = bigquery.getDataset(datasetId);

      // Show ACL details.
      // Find more information about ACL and the Acl Class here:
      // https://cloud.google.com/storage/docs/access-control/lists
      // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl
      List<Acl> acls = dataset.getAcl();
      System.out.println("ACLs in dataset \"" + dataset.getDatasetId().getDataset() + "\":");
      System.out.println(acls.toString());
      for (Acl acl : acls) {
        System.out.println();
        System.out.println("Role: " + acl.getRole());
        System.out.println("Entity: " + acl.getEntity());
      }
    } catch (BigQueryException e) {
      System.out.println("ACLs info not retrieved. \n" + e.toString());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Node.js API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

אחזור המטא-נתונים של קבוצת הנתונים באמצעות הפונקציה Dataset#getMetadata(). מדיניות הגישה זמינה במאפיין הגישה של אובייקט המטא-נתונים שנוצר.

/**
 * TODO(developer): Update and un-comment below lines
 */
// const datasetId = "my_project_id.my_dataset";

const {BigQuery} = require('@google-cloud/bigquery');

// Instantiate a client.
const bigquery = new BigQuery();

async function viewDatasetAccessPolicy() {
  const dataset = bigquery.dataset(datasetId);

  const [metadata] = await dataset.getMetadata();
  const accessEntries = metadata.access || [];

  // Show the list of AccessEntry objects.
  // More details about the AccessEntry object in the BigQuery documentation:
  // https://cloud.google.com/nodejs/docs/reference/bigquery/latest
  console.log(
    `${accessEntries.length} Access entries in dataset '${datasetId}':`
  );
  for (const accessEntry of accessEntries) {
    console.log(`Role: ${accessEntry.role || 'null'}`);
    console.log(`Special group: ${accessEntry.specialGroup || 'null'}`);
    console.log(`User by Email: ${accessEntry.userByEmail || 'null'}`);
  }
}

Python

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מפעילים את הפונקציה client.get_dataset(). מדיניות הגישה זמינה במאפיין dataset.access_entries.
from google.cloud import bigquery

# Instantiate a client.
client = bigquery.Client()

# TODO(developer): Update and uncomment the lines below.

# Dataset from which to get the access policy.
# dataset_id = "my_dataset"

# Get a reference to the dataset.
dataset = client.get_dataset(dataset_id)

# Show the list of AccessEntry objects.
# More details about the AccessEntry object here:
# https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
print(
    f"{len(dataset.access_entries)} Access entries found "
    f"in dataset '{dataset_id}':"
)

for access_entry in dataset.access_entries:
    print()
    print(f"Role: {access_entry.role}")
    print(f"Special group: {access_entry.special_group}")
    print(f"User by Email: {access_entry.user_by_email}")

ביטול הגישה למערך נתונים

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

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

  5. בתיבת הדו-שיח Dataset Permissions, מרחיבים את חשבון המשתמש שרוצים לבטל את הגישה שלו.

  6. לוחצים על Remove principal.

  7. בתיבת הדו-שיח Remove role from principal?‎, לוחצים על Remove.

  8. כדי לחזור לפרטי מערך הנתונים, לוחצים על סגירה.

SQL

כדי להסיר את הגישה של חשבון משתמש לקבוצת נתונים, משתמשים בהצהרת DCL‏ REVOKE:

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מזינים את ההצהרה הבאה:

    REVOKE `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    FROM "USER_LIST"

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

    • ‫ROLE_LIST: תפקיד או רשימה של תפקידים שרוצים לבטל, מופרדים בפסיקים
    • ‫RESOURCE_NAME: שם המשאב שרוצים לבטל את ההרשאה שלו
    • ‫USER_LIST: רשימה מופרדת בפסיקים של משתמשים שהתפקידים שלהם יבוטלו

      לרשימה של פורמטים תקינים, ראו user_list.

  3. ‫לוחצים על Run.

מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.

בדוגמה הבאה, התפקיד "בעלים של נתוני BigQuery" מבוטל אצל myDataset:

REVOKE `roles/bigquery.dataOwner`
ON SCHEMA `myProject`.myDataset
FROM "group:group@example.com", "serviceAccount:user@test-project.s3ns.iam.gserviceaccount.com"

BQ

  1. מפעילים את Cloud Shell במסוף Cloud de Confiance .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Cloud de Confiance יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. כדי לכתוב את המידע הקיים של קבוצת הנתונים (כולל בקרת גישה) לקובץ JSON, משתמשים בפקודה bq show:

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

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

    • ‫PROJECT_ID: מזהה הפרויקט
    • ‫DATASET: השם של מערך הנתונים
    • ‫PATH_TO_FILE: הנתיב לקובץ ה-JSON במחשב המקומי
  3. מבצעים שינויים בקטע 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"
      }
     ],
     ...
    }
  4. כשמסיימים לערוך, משתמשים בפקודה bq update וכוללים את קובץ ה-JSON באמצעות הדגל --source. אם מערך הנתונים נמצא בפרויקט אחר מפרויקט ברירת המחדל, מוסיפים את מזהה הפרויקט לשם של מערך הנתונים בפורמט הבא: PROJECT_ID:DATASET.

      bq update 
    --source PATH_TO_FILE
    PROJECT_ID:DATASET

  5. כדי לאמת את השינויים בבקרת הגישה, משתמשים בפקודה show בלי לכתוב את המידע לקובץ:

    bq show --format=prettyjson PROJECT_ID:DATASET

API

מפעילים את ה-method‏ datasets.patch ומשתמשים במאפיין access במשאב Dataset כדי לעדכן את אמצעי בקרת הגישה.

ה-method‏ datasets.update מחליפה את כל המשאב של מערך הנתונים, ולכן datasets.patch היא ה-method המועדפת לעדכון אמצעי בקרת הגישה.

המשך

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מגדירים את רשימת הגישה החדשה על ידי הסרת הרשומה מהרשימה הקיימת עם סוג DatasetMetadataToUpdate . ואז קוראים לפונקציה dataset.Update() כדי לעדכן את הנכס.
import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
)

// revokeAccessToDataset creates a new ACL removing the dataset access to "example-analyst-group@google.com" entity
// For more information on the types of ACLs available see:
// https://cloud.google.com/storage/docs/access-control/lists
func revokeAccessToDataset(w io.Writer, projectID, datasetID, entity string) error {
	// TODO(developer): uncomment and update the following lines:
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// entity := "user@mydomain.com"

	ctx := context.Background()

	// Create BigQuery client.
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %w", err)
	}
	defer client.Close()

	// Get dataset handler
	dataset := client.Dataset(datasetID)

	// Get dataset metadata
	meta, err := dataset.Metadata(ctx)
	if err != nil {
		return err
	}

	// Create new access entry list by copying the existing and omiting the access entry entity value
	var newAccessList []*bigquery.AccessEntry
	for _, entry := range meta.Access {
		if entry.Entity != entity {
			newAccessList = append(newAccessList, entry)
		}
	}

	// Only proceed with update if something in the access list was removed.
	// Additionally, we use the ETag from the initial metadata to ensure no
	// other changes were made to the access list in the interim.
	if len(newAccessList) < len(meta.Access) {
		update := bigquery.DatasetMetadataToUpdate{
			Access: newAccessList,
		}
		meta, err = dataset.Update(ctx, update, meta.ETag)
		if err != nil {
			return err
		}
	} else {
		return fmt.Errorf("any access entry was revoked")
	}

	fmt.Fprintf(w, "Details for Access entries in dataset %v.\n", datasetID)

	for _, access := range meta.Access {
		fmt.Fprintln(w)
		fmt.Fprintf(w, "Role: %s\n", access.Role)
		fmt.Fprintf(w, "Entity: %v\n", access.Entity)
	}

	return nil
}

Java

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.


import com.google.cloud.bigquery.Acl;
import com.google.cloud.bigquery.Acl.Entity;
import com.google.cloud.bigquery.Acl.Group;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import com.google.cloud.bigquery.DatasetId;
import java.util.List;

public class RevokeDatasetAccess {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    // Project and dataset from which to get the access policy.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    // Group to remove from the ACL
    String entityEmail = "group-to-remove@example.com";

    revokeDatasetAccess(projectId, datasetName, entityEmail);
  }

  public static void revokeDatasetAccess(String projectId, String datasetName, String entityEmail) {
    try {
      // Initialize client that will be used to send requests. This client only needs
      // to be created once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      // Create datasetId with the projectId and the datasetName.
      DatasetId datasetId = DatasetId.of(projectId, datasetName);
      Dataset dataset = bigquery.getDataset(datasetId);

      // Create a new Entity with the corresponding type and email
      // "user-or-group-to-remove@example.com"
      // For more information on the types of Entities available see:
      // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity
      // and
      // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity.Type
      Entity entity = new Group(entityEmail);

      // To revoke access to a dataset, remove elements from the Acl list.
      // Find more information about ACL and the Acl Class here:
      // https://cloud.google.com/storage/docs/access-control/lists
      // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl
      // Remove the entity from the ACLs list.
      List<Acl> acls =
          dataset.getAcl().stream().filter(acl -> !acl.getEntity().equals(entity)).toList();

      // Update the ACLs by setting the new list.
      bigquery.update(dataset.toBuilder().setAcl(acls).build());
      System.out.println("ACLs of \"" + datasetName + "\" updated successfully");
    } catch (BigQueryException e) {
      System.out.println("ACLs were not updated \n" + e.toString());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Node.js API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מעדכנים את רשימת הגישה של מערך הנתונים על ידי הסרת הרשומה שצוינה מהרשימה הקיימת באמצעות השיטה Dataset#get() כדי לאחזר את המטא-נתונים הנוכחיים. משנים את מאפיין הגישה כדי להחריג את הישות הרצויה, ואז מפעילים את הפונקציה Dataset#setMetadata() כדי להחיל את רשימת הגישה המעודכנת.

/**
 * TODO(developer): Update and un-comment below lines
 */

// const datasetId = "my_project_id.my_dataset"

// ID of the user or group from whom you are revoking access.
// const entityId = "user-or-group-to-remove@example.com"

const {BigQuery} = require('@google-cloud/bigquery');

// Instantiate a client.
const bigquery = new BigQuery();

async function revokeDatasetAccess() {
  const [dataset] = await bigquery.dataset(datasetId).get();

  // To revoke access to a dataset, remove elements from the access list.
  //
  // See the BigQuery client library documentation for more details on access entries:
  // https://cloud.google.com/nodejs/docs/reference/bigquery/latest

  // Filter access entries to exclude entries matching the specified entity_id
  // and assign a new list back to the access list.
  dataset.metadata.access = dataset.metadata.access.filter(entry => {
    return !(
      entry.entity_id === entityId ||
      entry.userByEmail === entityId ||
      entry.groupByEmail === entityId
    );
  });

  // Update will only succeed if the dataset
  // has not been modified externally since retrieval.
  //
  // See the BigQuery client library documentation for more details on metadata updates:
  // https://cloud.google.com/bigquery/docs/updating-datasets

  // Update just the 'access entries' property of the dataset.
  await dataset.setMetadata(dataset.metadata);

  console.log(`Revoked access to '${entityId}' from '${datasetId}'.`);
}

Python

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מגדירים את המאפיין dataset.access_entries עם אמצעי בקרת הגישה של מערך הנתונים. ואז קוראים לפונקציה client.update_dataset() כדי לעדכן את הנכס.
from google.cloud import bigquery
from google.api_core.exceptions import PreconditionFailed

# TODO(developer): Update and uncomment the lines below.

# ID of the dataset to revoke access to.
# dataset_id = "my-project.my_dataset"

# ID of the user or group from whom you are revoking access.
# Alternatively, the JSON REST API representation of the entity,
# such as a view's table reference.
# entity_id = "user-or-group-to-remove@example.com"

# Instantiate a client.
client = bigquery.Client()

# Get a reference to the dataset.
dataset = client.get_dataset(dataset_id)

# To revoke access to a dataset, remove elements from the AccessEntry list.
#
# See the BigQuery client library documentation for more details on `access_entries`:
# https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.Dataset#google_cloud_bigquery_dataset_Dataset_access_entries

# Filter `access_entries` to exclude entries matching the specified entity_id
# and assign a new list back to the AccessEntry list.
dataset.access_entries = [
    entry for entry in dataset.access_entries
    if entry.entity_id != entity_id
]

# Update will only succeed if the dataset
# has not been modified externally since retrieval.
#
# See the BigQuery client library documentation for more details on `update_dataset`:
# https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.client.Client#google_cloud_bigquery_client_Client_update_dataset
try:
    # Update just the `access_entries` property of the dataset.
    dataset = client.update_dataset(
        dataset,
        ["access_entries"],
    )

    # Notify user that the API call was successful.
    full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
    print(f"Revoked dataset access for '{entity_id}' to ' dataset '{full_dataset_id}.'")
except PreconditionFailed:  # A read-modify-write error.
    print(
        f"Dataset '{dataset.dataset_id}' was modified remotely before this update. "
        "Fetch the latest version and retry."
    )

עבודה עם בקרות גישה לטבלאות ולתצוגות

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

מתן גישה לטבלה או לתצוגה

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

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

  4. לוחצים על Overview > Tables, ואז לוחצים על טבלה או על תצוגה.

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

  6. לוחצים על Add principal.

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

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

  9. לוחצים על Save.

  10. כדי לחזור לטבלה או לראות פרטים, לוחצים על סגירה.

SQL

כדי לתת לחשבונות משתמשים גישה לטבלאות או לתצוגות, משתמשים בהצהרת DCL של GRANT:

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מזינים את ההצהרה הבאה:

    GRANT `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"

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

    • ‫ROLE_LIST: תפקיד או רשימה של תפקידים שרוצים להקצות, מופרדים בפסיקים
    • ‫RESOURCE_TYPE: סוג המשאב שהתפקיד חל עליו

      הערכים הנתמכים כוללים את TABLE,‏ VIEW,‏ MATERIALIZED VIEW ו-EXTERNAL TABLE.

    • ‫RESOURCE_NAME: שם המשאב שרוצים לתת לו את ההרשאה
    • ‫USER_LIST: רשימה מופרדת בפסיקים של משתמשים שהתפקיד מוקצה להם

      לרשימה של פורמטים תקינים, ראו user_list.

  3. ‫לוחצים על Run.

מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.

בדוגמה הבאה, התפקיד "צפייה בנתוני BigQuery" מוקצה ב-myTable:

GRANT `roles/bigquery.dataViewer`
ON TABLE `myProject`.myDataset.myTable
TO "user:user@example.com", "user:user2@example.com"

BQ

  1. מפעילים את Cloud Shell במסוף Cloud de Confiance .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Cloud de Confiance יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. כדי לתת גישה לטבלה או לתצוגה, משתמשים בפקודה bq add-iam-policy-binding:

    bq add-iam-policy-binding --member=MEMBER_TYPE:MEMBER --role=ROLE
      --table=true RESOURCE

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

    • ‫MEMBER_TYPE: סוג החבר, למשל user,‏ group,‏ serviceAccount או domain.
    • ‫MEMBER: כתובת האימייל או שם הדומיין של החבר.
    • ‫ROLE: התפקיד שרוצים לתת לחבר.
    • ‫RESOURCE: שם הטבלה או התצוגה שאת המדיניות שלה רוצים לעדכן.

Terraform

כדי לעדכן את הגישה לטבלה, משתמשים במשאבים של google_bigquery_table_iam.

הגדרת מדיניות הגישה לטבלה

בדוגמה הבאה מוסבר איך להשתמש במשאב google_bigquery_table_iam_policy כדי להגדיר את מדיניות ה-IAM לטבלה mytable. הפעולה הזו מחליפה את כל כללי המדיניות הקיימים שכבר מצורפים לטבלה:

# This file sets the IAM policy for the table created by
# https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/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" table resource with a table_id of "mytable".

data "google_iam_policy" "iam_policy" {
  binding {
    role = "roles/bigquery.dataOwner"
    members = [
      "user:user@example.com",
    ]
  }
}

resource "google_bigquery_table_iam_policy" "table_iam_policy" {
  dataset_id  = google_bigquery_table.default.dataset_id
  table_id    = google_bigquery_table.default.table_id
  policy_data = data.google_iam_policy.iam_policy.policy_data
}

הגדרת חברות בתפקיד בטבלה

בדוגמה הבאה מוסבר איך משתמשים במשאב google_bigquery_table_iam_binding כדי להגדיר חברות בתפקיד מסוים בטבלה mytable. הפעולה הזו מחליפה את כל החברויות הקיימות בתפקיד הזה. תפקידים אחרים במדיניות ה-IAM של הטבלה נשמרים.

# This file sets membership in an IAM role for the table created by
# https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/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" table resource with a table_id of "mytable".

resource "google_bigquery_table_iam_binding" "table_iam_binding" {
  dataset_id = google_bigquery_table.default.dataset_id
  table_id   = google_bigquery_table.default.table_id
  role       = "roles/bigquery.dataOwner"

  members = [
    "group:group@example.com",
  ]
}

הגדרת חברות בתפקיד לחשבון משתמש אחד

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

# This file adds a member to an IAM role for the table created by
# https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/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" table resource with a table_id of "mytable".

resource "google_bigquery_table_iam_member" "table_iam_member" {
  dataset_id = google_bigquery_table.default.dataset_id
  table_id   = google_bigquery_table.default.table_id
  role       = "roles/bigquery.dataEditor"
  member     = "serviceAccount:bqcx-1234567891011-12a3@gcp-sa-bigquery-condel.s3ns-system.iam.gserviceaccount.com"
}

כך מחילים את ההגדרות של Terraform בפרויקט ב- Cloud de Confiance :

הכנת Cloud Shell

  1. מפעילים את Cloud Shell.
  2. מגדירים את פרויקט ברירת המחדל ב- Cloud de Confiance שבו רוצים להחיל את ההגדרות של Terraform.

    תצטרכו להריץ את הפקודה הזו רק פעם אחת לכל פרויקט, ותוכלו לעשות זאת בכל ספרייה.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

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

הכנת הספרייה

לכל קובץ תצורה של Terraform צריכה להיות ספרייה משלו (שנקראת גם מודול ברמה הבסיסית).

  1. יוצרים ספרייה חדשה ב-Cloud Shell ובה יוצרים קובץ חדש. שם הקובץ חייב לכלול את הסיומת .tf, למשל main.tf. במדריך הזה, הקובץ נקרא main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. אם אתם עוקבים אחרי המדריך, תוכלו להעתיק את הקוד לדוגמה בכל קטע או שלב.

    מעתיקים את הקוד לדוגמה בקובץ main.tf החדש שיצרתם.

    לחלופין, אפשר גם להעתיק את הקוד מ-GitHub. כדאי לעשות את זה כשקטע הקוד של Terraform הוא חלק מפתרון מקצה לקצה.

  3. בודקים את הפרמטרים לדוגמה ומשנים אותם בהתאם לסביבה שלכם.
  4. שומרים את השינויים.
  5. מפעילים את Terraform. צריך לעשות זאת רק פעם אחת לכל ספרייה.
    terraform init

    אופציונלי: תוכלו לכלול את האפשרות -upgrade, כדי להשתמש בגרסה העדכנית ביותר של הספק של Google:

    terraform init -upgrade

החלה של השינויים

  1. בודקים את ההגדרות ומוודאים שהמשאבים שמערכת Terraform תיצור או תעדכן תואמים לציפיות שלכם:
    terraform plan

    מתקנים את ההגדרות לפי הצורך.

  2. מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה, כדי להחיל את הגדרות Terraform:
    terraform apply

    ממתינים עד שב-Terraform תוצג ההודעה "Apply complete!‎".

  3. פותחים את הפרויקט ב- Cloud de Confiance כדי להציג את התוצאות. במסוף Cloud de Confiance , נכנסים למשאבים בממשק המשתמש כדי לוודא שהם נוצרו או עודכנו ב-Terraform.

API

  1. כדי לאחזר את המדיניות הנוכחית, צריך להפעיל את ה-method‏ tables.getIamPolicy.

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

  3. מפעילים את tables.setIamPolicy כדי לכתוב את המדיניות המעודכנת.

המשך

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מפעילים את הפונקציה IAM().SetPolicy() של המשאב כדי לשמור את השינויים במדיניות הגישה של טבלה או תצוגה.
import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"cloud.google.com/go/iam"
)

// grantAccessToResource creates a new ACL conceding the VIEWER role to the group "example-analyst-group@google.com"
// For more information on the types of ACLs available see:
// https://cloud.google.com/storage/docs/access-control/lists
func grantAccessToResource(w io.Writer, projectID, datasetID, resourceID string) error {
	// Resource can be a table or a view
	//
	// TODO(developer): uncomment and update the following lines:
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// resourceID := "myresource"

	ctx := context.Background()

	// Create new client
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %w", err)
	}
	defer client.Close()

	// Get resource policy.
	policy, err := client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
	if err != nil {
		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
	}

	// Find more details about IAM Roles here:
	// https://pkg.go.dev/cloud.google.com/go/iam#RoleName
	entityID := "example-analyst-group@google.com"
	roleType := iam.Viewer

	// Add new policy.
	policy.Add(fmt.Sprintf("group:%s", entityID), roleType)

	// Update resource's policy.
	err = client.Dataset(datasetID).Table(resourceID).IAM().SetPolicy(ctx, policy)
	if err != nil {
		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
	}

	// Get resource policy again expecting the update.
	policy, err = client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
	if err != nil {
		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
	}

	fmt.Fprintf(w, "Details for Access entries in table or view %v.\n", resourceID)

	for _, role := range policy.Roles() {
		fmt.Fprintln(w)
		fmt.Fprintf(w, "Role: %s\n", role)
		fmt.Fprintf(w, "Entities: %v\n", policy.Members(role))
	}

	return nil
}

Java

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

public class GrantAccessToTableOrView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    // Project, dataset and resource (table or view) from which to get the access policy.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String resourceName = "MY_TABLE_NAME";
    // Role to add to the policy access
    Role role = Role.of("roles/bigquery.dataViewer");
    // Identity to add to the policy access
    Identity identity = Identity.user("user-add@example.com");
    grantAccessToTableOrView(projectId, datasetName, resourceName, role, identity);
  }

  public static void grantAccessToTableOrView(
      String projectId, String datasetName, String resourceName, Role role, Identity identity) {
    try {
      // Initialize client that will be used to send requests. This client only needs
      // to be created once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      // Create table identity given the projectId, the datasetName and the resourceName.
      TableId tableId = TableId.of(projectId, datasetName, resourceName);

      // Add new user identity to current IAM policy.
      Policy policy = bigquery.getIamPolicy(tableId);
      policy = policy.toBuilder().addIdentity(role, identity).build();

      // Update the IAM policy by setting the new one.
      bigquery.setIamPolicy(tableId, policy);

      System.out.println("IAM policy of resource \"" + resourceName + "\" updated successfully");
    } catch (BigQueryException e) {
      System.out.println("IAM policy was not updated. \n" + e.toString());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Node.js API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מפעילים את הפונקציה Table#getIamPolicy() כדי לאחזר את מדיניות ה-IAM הנוכחית של טבלה או תצוגה, משנים את המדיניות על ידי הוספת קישורים חדשים, ואז משתמשים בפונקציה Table#setIamPolicy() כדי לשמור את השינויים במדיניות הגישה.

/**
 * TODO(developer): Update and un-comment below lines
 */
// const projectId = "YOUR_PROJECT_ID";
// const datasetId = "YOUR_DATASET_ID";
// const tableId = "YOUR_TABLE_ID";
// const principalId = "YOUR_PRINCIPAL_ID";
// const role = "YOUR_ROLE";

const {BigQuery} = require('@google-cloud/bigquery');

// Instantiate a client.
const client = new BigQuery();

async function grantAccessToTableOrView() {
  const dataset = client.dataset(datasetId);
  const table = dataset.table(tableId);

  // Get the IAM access policy for the table or view.
  const [policy] = await table.getIamPolicy();

  // Initialize bindings array.
  if (!policy.bindings) {
    policy.bindings = [];
  }

  // To grant access to a table or view
  // add bindings to the Table or View policy.
  //
  // Find more details about Policy and Binding objects here:
  // https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Policy
  // https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Binding
  const binding = {
    role,
    members: [principalId],
  };
  policy.bindings.push(binding);

  // Set the IAM access policy with updated bindings.
  await table.setIamPolicy(policy);

  // Show a success message.
  console.log(
    `Role '${role}' granted for principal '${principalId}' on resource '${datasetId}.${tableId}'.`
  );
}

await grantAccessToTableOrView();

Python

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מפעילים את הפונקציה client.set_iam_policy() כדי לשמור את השינויים במדיניות הגישה של טבלה או תצוגה.
from google.cloud import bigquery

# TODO(developer): Update and uncomment the lines below.

# Google Cloud Platform project.
# project_id = "my_project_id"

# Dataset where the table or view is.
# dataset_id = "my_dataset"

# Table or view name to get the access policy.
# resource_name = "my_table"

# Principal to grant access to a table or view.
# For more information about principal identifiers see:
# https://cloud.google.com/iam/docs/principal-identifiers
# principal_id = "user:bob@example.com"

# Role to grant to the principal.
# For more information about BigQuery roles see:
# https://cloud.google.com/bigquery/docs/access-control
# role = "roles/bigquery.dataViewer"

# Instantiate a client.
client = bigquery.Client()

# Get the full table or view name.
full_resource_name = f"{project_id}.{dataset_id}.{resource_name}"

# Get the IAM access policy for the table or view.
policy = client.get_iam_policy(full_resource_name)

# To grant access to a table or view, add bindings to the IAM policy.
#
# Find more details about Policy and Binding objects here:
# https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Policy
# https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Binding
binding = {
    "role": role,
    "members": [principal_id, ],
}
policy.bindings.append(binding)

# Set the IAM access policy with updated bindings.
updated_policy = client.set_iam_policy(full_resource_name, policy)

# Show a success message.
print(
    f"Role '{role}' granted for principal '{principal_id}'"
    f" on resource '{full_resource_name}'."
)

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

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

לתפקידים המוגדרים מראש הבאים ב-IAM יש הרשאות בטבלאות או בתצוגות.

תפקיד תיאור
BigQuery Data Owner (roles/bigquery.dataOwner) כשמקצים את התפקיד הזה בטבלה או בתצוגה, הוא נותן את ההרשאות הבאות:
  • כל ההרשאות לטבלה או לתצוגה.
  • כל ההרשאות למדיניות גישה ברמת השורה, חוץ מההרשאה לשנות את ההגבלות של Time Travel.
  • להגדיר קטגוריות ומדיניות נתונים ברמת העמודה.
BigQuery Data Editor (roles/bigquery.dataEditor) כשמקצים את התפקיד הזה בטבלה או בתצוגה, הוא נותן את ההרשאות הבאות:
  • קבלת מטא-נתונים, עדכון מטא-נתונים, קבלת אמצעי בקרת גישה ומחיקת הטבלה או התצוגה.
  • אחזור (שאילתה), ייצוא, שכפול ועדכון של נתוני טבלה.
  • ליצור, לעדכן ולמחוק אינדקסים.
  • ליצור ולשחזר קובצי snapshot.
BigQuery Data Viewer (roles/bigquery.dataViewer) כשמקצים את התפקיד הזה בטבלה או בתצוגה, הוא נותן את ההרשאות הבאות:
  • מקבלים מטא-נתונים ובקרות גישה לטבלה או לתצוגה.
  • לקבל (לשאול), לייצא ולשכפל נתוני טבלה.
  • ליצור תמונות מצב.
BigQuery Metadata Viewer (roles/bigquery.metadataViewer) כשמקצים את התפקיד הזה בטבלה או בתצוגה, הוא נותן את ההרשאות הבאות:
  • מקבלים מטא-נתונים ובקרות גישה לטבלה או לתצוגה.

הרשאות לטבלאות ולתצוגות

תצוגות מפורטות נחשבות למשאבי טבלה ב-BigQuery. כל ההרשאות ברמת הטבלה חלות על תצוגות.

רוב ההרשאות שמתחילות ב-bigquery.tables חלות ברמת הטבלה. bigquery.tables.create ו-bigquery.tables.list לא. כדי ליצור טבלאות או תצוגות ולהציג אותן, צריך להעניק את ההרשאות bigquery.tables.create ו-bigquery.tables.list לתפקיד בקונטיינר ההורה – מערך הנתונים או הפרויקט.

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

הרשאה משאב פעולה
bigquery.tables.create קבוצת הנתונים ליצור טבלאות חדשות במערך הנתונים.
bigquery.tables.createIndex טבלה יוצרים אינדקס חיפוש בטבלה.
bigquery.tables.deleteIndex טבלה מחיקת אינדקס חיפוש בטבלה.
bigquery.tables.createSnapshot טבלה יוצרים קובץ snapshot של הטבלה. כדי ליצור קובץ snapshot, צריך כמה הרשאות נוספות ברמת הטבלה וברמת מערך הנתונים. למידע נוסף, קראו את המאמר הרשאות ותפקידים ליצירת קובצי snapshot של טבלאות.
bigquery.tables.deleteSnapshot טבלה מחיקת תמונת מצב של הטבלה.
bigquery.tables.delete טבלה למחוק טבלה.
bigquery.tables.createTagBinding טבלה ליצור קישורי תגי משאבים בטבלה.
bigquery.tables.deleteTagBinding טבלה למחוק קישורים של תגי משאבים בטבלה.
bigquery.tables.listTagBindings טבלה הצגת רשימה של קישורי תגי משאבים בטבלה.
bigquery.tables.listEffectiveTags טבלה הצגת רשימת התגים האפקטיביים (שהוחלו ועברו בירושה) של הטבלה.
bigquery.tables.export טבלה לייצא את נתוני הטבלה. כדי להריץ משימת חילוץ, צריך גם את ההרשאות bigquery.jobs.create.
bigquery.tables.get טבלה אחזור מטא-נתונים של טבלה.
bigquery.tables.getData טבלה מריצים שאילתה על הנתונים בטבלה. כדי להריץ משימת שאילתה, צריך גם את ההרשאות של bigquery.jobs.create.
bigquery.tables.getIamPolicy טבלה מקבלים את אמצעי בקרת הגישה לטבלה.
bigquery.tables.list קבוצת הנתונים הצגת רשימה של כל הטבלאות והמטא-נתונים של הטבלאות במערך הנתונים.
bigquery.tables.replicateData טבלה שכפול נתוני טבלה. ההרשאה הזו נדרשת כדי ליצור תצוגות מהותיות של רפליקות.
bigquery.tables.restoreSnapshot טבלה לשחזר תמונת מצב של טבלה.
bigquery.tables.setCategory טבלה מגדירים תגי מדיניות בסכימה של הטבלה.
bigquery.tables.setColumnDataPolicy טבלה הגדרת מדיניות גישה ברמת העמודה בטבלה.
bigquery.tables.setIamPolicy טבלה להגדיר אמצעי בקרת גישה בטבלה.
bigquery.tables.update טבלה עדכון טבלה. ההרשאה metadata. bigquery.tables.get נדרשת גם כדי לעדכן את המטא-נתונים של הטבלה במסוף.
bigquery.tables.updateData טבלה עדכון נתוני הטבלה.
bigquery.tables.updateIndex טבלה מעדכנים את אינדקס החיפוש בטבלה.

הצגת אמצעי בקרת הגישה לטבלה או לתצוגה

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

  4. לוחצים על Overview > Tables, ואז לוחצים על טבלה או על תצוגה.

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

    אמצעי הבקרה על הגישה לטבלה או לתצוגה מופיעים בחלונית Share.

BQ

  1. מפעילים את Cloud Shell במסוף Cloud de Confiance .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Cloud de Confiance יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. כדי לקבל מדיניות גישה קיימת ולהפיק אותה לקובץ מקומי ב-JSON, משתמשים בפקודה bq get-iam-policy ב-Cloud Shell:

    bq get-iam-policy \
        --table=true \
        PROJECT_ID:DATASET.RESOURCE > PATH_TO_FILE

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

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

SQL

שולחים שאילתה לתצוגה INFORMATION_SCHEMA.OBJECT_PRIVILEGES. בשאילתות לאחזור של אמצעי בקרת גישה לטבלה או לתצוגה, צריך לציין את object_schema ו-object_name.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מזינים את ההצהרה הבאה:

    SELECT
    COLUMN_LIST
    FROM
      PROJECT_ID.`region-REGION`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
    WHERE
    object_schema = "DATASET" AND object_name = "TABLE";

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

    • ‫COLUMN_LIST: רשימה מופרדת בפסיקים של עמודות מהתצוגה INFORMATION_SCHEMA.OBJECT_PRIVILEGES
    • ‫PROJECT_ID: מזהה הפרויקט
    • ‫REGION: מזהה אזור
    • ‫DATASET: השם של מערך הנתונים שמכיל את הטבלה או התצוגה
    • ‫TABLE: שם הטבלה או התצוגה

  3. ‫לוחצים על Run.

מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.

דוגמה:

SELECT
object_name, privilege_type, grantee
FROM
my_project.`region-us`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
WHERE
object_schema = "mydataset" AND object_name = "mytable";
+------------------+-----------------------------+--------------------------+
|   object_name    |  privilege_type             | grantee                  |
+------------------+-----------------------------+--------------------------+
| mytable          | roles/bigquery.dataEditor   | group:group@example.com|
| mytable          | roles/bigquery.dataOwner    | user:user@example.com|
+------------------+-----------------------------+--------------------------+

API

כדי לאחזר את המדיניות הנוכחית, צריך להפעיל את ה-method‏ tables.getIamPolicy.

המשך

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מפעילים את הפונקציה IAM().Policy() של המשאב. לאחר מכן, קוראים לפונקציה Roles() כדי לקבל את מדיניות הגישה לטבלה או לתצוגה.
import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
)

// viewTableOrViewAccessPolicies retrieves the ACL for the given resource
// For more information on the types of ACLs available see:
// https://cloud.google.com/storage/docs/access-control/lists
func viewTableOrViewAccessPolicies(w io.Writer, projectID, datasetID, resourceID string) error {
	// Resource can be a table or a view
	//
	// TODO(developer): uncomment and update the following lines:
	// projectID := "my-project-id"
	// datasetID := "my-dataset-id"
	// resourceID := "my-resource-id"

	ctx := context.Background()

	// Create new client.
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %w", err)
	}
	defer client.Close()

	// Get resource's policy access.
	policy, err := client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
	if err != nil {
		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
	}

	fmt.Fprintf(w, "Details for Access entries in table or view %v.\n", resourceID)

	for _, role := range policy.Roles() {
		fmt.Fprintln(w)
		fmt.Fprintf(w, "Role: %s\n", role)
		fmt.Fprintf(w, "Entities: %v\n", policy.Members(role))
	}

	return nil
}

Java

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.


import com.google.cloud.Policy;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

public class GetTableOrViewAccessPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    // Project, dataset and resource (table or view) from which to get the access policy.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String resourceName = "MY_RESOURCE_NAME";
    getTableOrViewAccessPolicy(projectId, datasetName, resourceName);
  }

  public static void getTableOrViewAccessPolicy(
      String projectId, String datasetName, String resourceName) {
    try {
      // Initialize client that will be used to send requests. This client only needs
      // to be created once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      // Create table identity given the projectId, the datasetName and the resourceName.
      TableId tableId = TableId.of(projectId, datasetName, resourceName);

      // Get the table IAM policy.
      Policy policy = bigquery.getIamPolicy(tableId);

      // Show policy details.
      // Find more information about the Policy Class here:
      // https://cloud.google.com/java/docs/reference/google-cloud-core/latest/com.google.cloud.Policy
      System.out.println(
          "IAM policy info of resource \"" + resourceName + "\" retrieved succesfully");
      System.out.println();
      System.out.println("IAM policy info: " + policy.toString());
    } catch (BigQueryException e) {
      System.out.println("IAM policy info not retrieved. \n" + e.toString());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Node.js API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

אחזור של מדיניות ה-IAM של טבלה או תצוגה באמצעות הפונקציה Table#getIamPolicy(). פרטי מדיניות הגישה זמינים באובייקט המדיניות שמוחזר.

/**
 * TODO(developer): Update and un-comment below lines
 */
// const projectId = "YOUR_PROJECT_ID"
// const datasetId = "YOUR_DATASET_ID"
// const resourceName = "YOUR_RESOURCE_NAME";

const {BigQuery} = require('@google-cloud/bigquery');

// Instantiate a client.
const client = new BigQuery();

async function viewTableOrViewAccessPolicy() {
  const dataset = client.dataset(datasetId);
  const table = dataset.table(resourceName);

  // Get the IAM access policy for the table or view.
  const [policy] = await table.getIamPolicy();

  // Initialize bindings if they don't exist
  if (!policy.bindings) {
    policy.bindings = [];
  }

  // Show policy details.
  // Find more details for the Policy object here:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/Policy
  console.log(`Access Policy details for table or view '${resourceName}'.`);
  console.log(`Bindings: ${JSON.stringify(policy.bindings, null, 2)}`);
  console.log(`etag: ${policy.etag}`);
  console.log(`Version: ${policy.version}`);
}

ביטול הגישה לטבלה או לתצוגה

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

  4. לוחצים על Overview > Tables, ואז לוחצים על טבלה או על תצוגה.

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

  6. בתיבת הדו-שיח Share, מרחיבים את חשבון המשתמש שרוצים לבטל את הגישה שלו.

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

  8. בתיבת הדו-שיח Remove role from principal?‎, לוחצים על Remove.

  9. כדי לחזור לטבלה או לראות פרטים, לוחצים על סגירה.

SQL

כדי להסיר את הגישה של חשבונות משתמשים לטבלאות או לתצוגות, משתמשים בהצהרת DCL של REVOKE:

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מזינים את ההצהרה הבאה:

    REVOKE `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    FROM "USER_LIST"

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

    • ‫ROLE_LIST: תפקיד או רשימה של תפקידים שרוצים לבטל, מופרדים בפסיקים
    • ‫RESOURCE_TYPE: סוג המשאב שהתפקיד בוטל בו

      הערכים הנתמכים כוללים את TABLE,‏ VIEW,‏ MATERIALIZED VIEW ו-EXTERNAL TABLE.

    • ‫RESOURCE_NAME: שם המשאב שרוצים לבטל את ההרשאה שלו
    • ‫USER_LIST: רשימה מופרדת בפסיקים של משתמשים שהתפקידים שלהם יבוטלו

      לרשימה של פורמטים תקינים, ראו user_list.

  3. ‫לוחצים על Run.

מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.

בדוגמה הבאה, התפקיד "בעלי נתונים ב-BigQuery" מבוטל ב-myTable:

REVOKE `roles/bigquery.dataOwner`
ON TABLE `myProject`.myDataset.myTable
FROM "group:group@example.com", "serviceAccount:user@myproject.s3ns.iam.gserviceaccount.com"

BQ

  1. מפעילים את Cloud Shell במסוף Cloud de Confiance .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Cloud de Confiance יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. כדי לבטל את הגישה לטבלה או לתצוגה, משתמשים בפקודה bq remove-iam-policy-binding:

    bq remove-iam-policy-binding --member=MEMBER_TYPE:MEMBER --role=ROLE
    --table=true RESOURCE

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

    • ‫MEMBER_TYPE: סוג החבר, כמו user,‏ group,‏ serviceAccount או domain
    • ‫MEMBER: כתובת האימייל או שם הדומיין של החבר/ה
    • ‫ROLE: התפקיד שרוצים לבטל לחבר
    • ‫RESOURCE: השם של הטבלה או התצוגה שאת המדיניות שלה רוצים לעדכן

API

  1. כדי לאחזר את המדיניות הנוכחית, צריך להפעיל את ה-method‏ tables.getIamPolicy.

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

  3. מפעילים את tables.setIamPolicy כדי לכתוב את המדיניות המעודכנת.

המשך

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

מפעילים את הפונקציה policy.Remove() כדי להסיר את הגישה. לאחר מכן, קוראים לפונקציה IAM().SetPolicy() כדי לשמור את השינויים במדיניות הגישה לטבלה או לתצוגה.
import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"cloud.google.com/go/iam"
)

// revokeTableOrViewAccessPolicies creates a new ACL removing the VIEWER role to group "example-analyst-group@google.com"
// For more information on the types of ACLs available see:
// https://cloud.google.com/storage/docs/access-control/lists
func revokeTableOrViewAccessPolicies(w io.Writer, projectID, datasetID, resourceID string) error {
	// Resource can be a table or a view
	//
	// TODO(developer): uncomment and update the following lines:
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// resourceID := "myresource"

	ctx := context.Background()

	// Create new client
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %w", err)
	}
	defer client.Close()

	// Get resource policy.
	policy, err := client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
	if err != nil {
		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
	}

	// Find more details about IAM Roles here:
	// https://pkg.go.dev/cloud.google.com/go/iam#RoleName
	entityID := "example-analyst-group@google.com"
	roleType := iam.Viewer

	// Revoke policy access.
	policy.Remove(fmt.Sprintf("group:%s", entityID), roleType)

	// Update resource's policy.
	err = client.Dataset(datasetID).Table(resourceID).IAM().SetPolicy(ctx, policy)
	if err != nil {
		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
	}

	// Get resource policy again expecting the update.
	policy, err = client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
	if err != nil {
		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
	}

	fmt.Fprintf(w, "Details for Access entries in table or view %v.\n", resourceID)

	for _, role := range policy.Roles() {
		fmt.Fprintln(w)
		fmt.Fprintf(w, "Role: %s\n", role)
		fmt.Fprintf(w, "Entities: %v\n", policy.Members(role))
	}

	return nil
}

Java

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class RevokeAccessToTableOrView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    // Project, dataset and resource (table or view) from which to get the access policy
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String resourceName = "MY_RESOURCE_NAME";
    // Role to remove from the access policy
    Role role = Role.of("roles/bigquery.dataViewer");
    // Identity to remove from the access policy
    Identity user = Identity.user("user-add@example.com");
    revokeAccessToTableOrView(projectId, datasetName, resourceName, role, user);
  }

  public static void revokeAccessToTableOrView(
      String projectId, String datasetName, String resourceName, Role role, Identity identity) {
    try {
      // Initialize client that will be used to send requests. This client only needs
      // to be created once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      // Create table identity given the projectId, the datasetName and the resourceName.
      TableId tableId = TableId.of(projectId, datasetName, resourceName);

      // Remove either identities or roles, or both from bindings and replace it in
      // the current IAM policy.
      Policy policy = bigquery.getIamPolicy(tableId);
      // Create a copy of an immutable map.
      Map<Role, Set<Identity>> bindings = new HashMap<>(policy.getBindings());

      // Remove all identities with a specific role.
      bindings.remove(role);
      // Update bindings.
      policy = policy.toBuilder().setBindings(bindings).build();

      // Remove one identity in all the existing roles.
      for (Role roleKey : bindings.keySet()) {
        if (bindings.get(roleKey).contains(identity)) {
          // Create a copy of an immutable set if the identity is present in the role.
          Set<Identity> identities = new HashSet<>(bindings.get(roleKey));
          // Remove identity.
          identities.remove(identity);
          bindings.put(roleKey, identities);
          if (bindings.get(roleKey).isEmpty()) {
            // Remove the role if it has no identities.
            bindings.remove(roleKey);
          }
        }
      }
      // Update bindings.
      policy = policy.toBuilder().setBindings(bindings).build();

      // Update the IAM policy by setting the new one.
      bigquery.setIamPolicy(tableId, policy);

      System.out.println("IAM policy of resource \"" + resourceName + "\" updated successfully");
    } catch (BigQueryException e) {
      System.out.println("IAM policy was not updated. \n" + e.toString());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Node.js API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

אחזור של מדיניות ה-IAM הנוכחית של טבלה או תצוגה באמצעות השיטה Table#getIamPolicy(). משנים את המדיניות כדי להסיר את התפקיד או החשבון הראשי הרצויים, ואז מחילים את המדיניות המעודכנת באמצעות השיטה Table#setIamPolicy().

/**
 * TODO(developer): Update and un-comment below lines
 */
// const projectId = "YOUR_PROJECT_ID"
// const datasetId = "YOUR_DATASET_ID"
// const tableId = "YOUR_TABLE_ID"
// const roleToRemove = "YOUR_ROLE"
// const principalToRemove = "YOUR_PRINCIPAL_ID"

const {BigQuery} = require('@google-cloud/bigquery');

// Instantiate a client.
const client = new BigQuery();

async function revokeAccessToTableOrView() {
  const dataset = client.dataset(datasetId);
  const table = dataset.table(tableId);

  // Get the IAM access policy for the table or view.
  const [policy] = await table.getIamPolicy();

  // Initialize bindings array.
  if (!policy.bindings) {
    policy.bindings = [];
  }

  // To revoke access to a table or view,
  // remove bindings from the Table or View policy.
  //
  // Find more details about Policy objects here:
  // https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Policy

  if (principalToRemove) {
    // Create a copy of bindings for modifications.
    const bindings = [...policy.bindings];

    // Filter out the principal from each binding.
    for (const binding of bindings) {
      if (binding.members) {
        binding.members = binding.members.filter(
          m => m !== principalToRemove
        );
      }
    }

    // Filter out bindings with empty members.
    policy.bindings = bindings.filter(
      binding => binding.members && binding.members.length > 0
    );
  }

  if (roleToRemove) {
    // Filter out all bindings with the roleToRemove
    // and assign a new list back to the policy bindings.
    policy.bindings = policy.bindings.filter(b => b.role !== roleToRemove);
  }

  // Set the IAM access policy with updated bindings.
  await table.setIamPolicy(policy);

  // Both role and principal are removed
  if (roleToRemove !== null && principalToRemove !== null) {
    console.log(
      `Role '${roleToRemove}' revoked for principal '${principalToRemove}' on resource '${datasetId}.${tableId}'.`
    );
  }

  // Only role is removed
  if (roleToRemove !== null && principalToRemove === null) {
    console.log(
      `Role '${roleToRemove}' revoked for all principals on resource '${datasetId}.${tableId}'.`
    );
  }

  // Only principal is removed
  if (roleToRemove === null && principalToRemove !== null) {
    console.log(
      `Access revoked for principal '${principalToRemove}' on resource '${datasetId}.${tableId}'.`
    );
  }

  // No changes were made
  if (roleToRemove === null && principalToRemove === null) {
    console.log(
      `No changes made to access policy for '${datasetId}.${tableId}'.`
    );
  }
}

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

כדי לשלוח משוב או לבקש תמיכה בתכונה הזו, אפשר לשלוח אימייל לכתובת bigquery-security@google.com.

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

מתן גישה לתרחיש

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

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

  4. עוברים לכרטיסייה תרחישים ולוחצים על תרחיש.

  5. לוחצים על שיתוף.

  6. לוחצים על הוספת חברים.

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

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

  9. לוחצים על Save.

  10. כדי לחזור לפרטי התרחיש, לוחצים על סיום.

BQ

  1. מפעילים את Cloud Shell במסוף Cloud de Confiance .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Cloud de Confiance יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. כדי לכתוב את פרטי השגרה הקיימים (כולל אמצעי בקרת הגישה) לקובץ JSON, משתמשים בפקודה bq get-iam-policy:

    bq get-iam-policy \
        PROJECT_ID:DATASET.ROUTINE \
        > PATH_TO_FILE

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

    • ‫PROJECT_ID: מזהה הפרויקט
    • ‫DATASET: שם קבוצת הנתונים שמכילה את השגרה שרוצים לעדכן
    • ‫ROUTINE: שם המשאב שרוצים לעדכן
    • ‫PATH_TO_FILE: הנתיב לקובץ ה-JSON במחשב המקומי
  3. מבצעים שינויים בקטע bindings של קובץ ה-JSON. קישור מחבר בין חשבון משתמש אחד או יותר ל-role יחיד. חשבונות משתמשים יכולים להיות חשבונות משתמשים, חשבונות שירות, קבוצות Google ודומיינים. לדוגמה, הקטע bindings בקובץ ה-JSON של תרחיש יכול להיראות כך:

    {
      "bindings": [
        {
          "role": "roles/bigquery.dataViewer",
          "members": [
            "user:user@example.com",
            "group:group@example.com",
            "domain:example.com",
          ]
        },
      ],
      "etag": "BwWWja0YfJA=",
      "version": 1
    }
  4. כדי לעדכן את מדיניות הגישה, משתמשים בפקודה bq set-iam-policy:

    bq set-iam-policy PROJECT_ID:DATASET.ROUTINE PATH_TO_FILE
  5. כדי לאמת את השינויים בבקרת הגישה, משתמשים שוב בפקודה bq get-iam-policy בלי לכתוב את המידע לקובץ:

    bq get-iam-policy --format=prettyjson \\
        PROJECT_ID:DATASET.ROUTINE

API

  1. כדי לאחזר את המדיניות הנוכחית, צריך להפעיל את ה-method‏ routines.getIamPolicy.

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

  3. מפעילים את routines.setIamPolicy כדי לכתוב את המדיניות המעודכנת.

תפקידים מוגדרים מראש שנותנים גישה לשגרות

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

לתפקידים הבאים שמוגדרים מראש ב-IAM יש הרשאות לגבי שגרות.

תפקיד תיאור
BigQuery Data Owner (roles/bigquery.dataOwner) כשמקצים את התפקיד הזה לשגרת אירועים, הוא נותן את ההרשאות הבאות:
  • כל ההרשאות לתרחיש.

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

BigQuery Data Editor (roles/bigquery.dataEditor) כשמקצים את התפקיד הזה לשגרת אירועים, הוא נותן את ההרשאות הבאות:
  • כל ההרשאות לתרחיש.
BigQuery Data Viewer (roles/bigquery.dataViewer) כשמקצים את התפקיד הזה לשגרת אירועים, הוא נותן את ההרשאות הבאות:
  • בשאילתה, מפנים לשגרה שנוצרה על ידי מישהו אחר.
BigQuery Metadata Viewer (roles/bigquery.metadataViewer) כשמקצים את התפקיד הזה לשגרת אירועים, הוא נותן את ההרשאות הבאות:
  • בשאילתה, מפנים לשגרה שנוצרה על ידי מישהו אחר.

הרשאות לתרחישים

רוב ההרשאות שמתחילות ב-bigquery.routines חלות ברמת התרחיש. bigquery.routines.create ו-bigquery.routines.list לא. כדי ליצור שגרות ולהציג אותן, צריך להעניק את ההרשאות bigquery.routines.create ו-bigquery.routines.list לתפקיד במאגר ההורה – מערך הנתונים.

בטבלה הבאה מפורטות כל ההרשאות לשגרות, והמשאב ברמה הנמוכה ביותר שאפשר להקצות לו את ההרשאות האלה.

הרשאה משאב תיאור
bigquery.routines.create קבוצת הנתונים יוצרים שגרה במערך הנתונים. כדי להריץ משימת שאילתה שמכילה הצהרת CREATE FUNCTION, נדרשת גם ההרשאה bigquery.jobs.create.
bigquery.routines.delete תרחיש למחוק תרחיש.
bigquery.routines.get תרחיש להפנות לתרחיש שמישהו אחר יצר. כדי להריץ משימת שאילתה שמפנה לשגרה, נדרשת גם ההרשאה bigquery.jobs.create. בנוסף, נדרשת הרשאת גישה לכל המשאבים שהשגרה מפנה אליהם, כמו טבלאות או תצוגות.
bigquery.routines.list קבוצת הנתונים הצגת רשימה של שגרות במערך הנתונים והצגת מטא-נתונים של שגרות.
bigquery.routines.update תרחיש עדכון ההגדרות והמטא-נתונים של השגרה.
bigquery.routines.getIamPolicy תרחיש מקבלים אמצעי בקרת גישה לתרחיש.
bigquery.routines.setIamPolicy תרחיש מגדירים את אמצעי בקרת הגישה לתרחיש.

איך רואים את אמצעי בקרת הגישה של תרחיש מסוים

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

  4. עוברים לכרטיסייה תרחישים ולוחצים על תרחיש.

  5. לוחצים על שיתוף.

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

BQ

הפקודה bq get-iam-policy לא תומכת בהצגת אמצעי בקרת הגישה של שגרה.

SQL

בתצוגה INFORMATION_SCHEMA.OBJECT_PRIVILEGES לא מוצגים אמצעי בקרת גישה לשגרות.

API

כדי לאחזר את המדיניות הנוכחית, צריך להפעיל את ה-method‏ routines.getIamPolicy.

ביטול הגישה לתרחיש

כדי לבטל את הגישה לתרחיש, בוחרים באחת מהאפשרויות הבאות:

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

  4. עוברים לכרטיסייה תרחישים ולוחצים על תרחיש.

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

  6. בתיבת הדו-שיח Routine Permissions, מרחיבים את חשבון המשתמש שרוצים לבטל את הגישה שלו.

  7. לוחצים על Remove principal.

  8. בתיבת הדו-שיח Remove role from principal?‎, לוחצים על Remove.

  9. לוחצים על Close.

BQ

  1. מפעילים את Cloud Shell במסוף Cloud de Confiance .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Cloud de Confiance יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. כדי לכתוב את פרטי השגרה הקיימים (כולל אמצעי בקרת הגישה) לקובץ JSON, משתמשים בפקודה bq get-iam-policy:

    bq get-iam-policy --routine PROJECT_ID:DATASET.ROUTINE > PATH_TO_FILE

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

    • ‫PROJECT_ID: מזהה הפרויקט
    • ‫DATASET: שם קבוצת הנתונים שמכילה את השגרה שרוצים לעדכן
    • ‫ROUTINE: שם המשאב שרוצים לעדכן
    • ‫PATH_TO_FILE: הנתיב לקובץ ה-JSON במחשב המקומי

    בקובץ המדיניות, הערך של version נשאר 1. המספר הזה מתייחס לגרסת הסכימה של מדיניות ה-IAM, ולא לגרסת המדיניות. הערך של etag הוא מספר הגרסה של המדיניות.

  3. מבצעים שינויים בקטע access של קובץ ה-JSON. אפשר להסיר כל אחד מהרשומות של specialGroup: projectOwners, projectWriters, projectReaders ו-allAuthenticatedUsers. אפשר גם להסיר את: userByEmail, groupByEmail ו-domain.

    לדוגמה, הקטע access בקובץ ה-JSON של השגרה ייראה כך:

    {
     "bindings": [
       {
         "role": "roles/bigquery.dataViewer",
         "members": [
           "user:user@example.com",
           "group:group@example.com",
           "domain:google.com",
         ]
       },
     ],
     "etag": "BwWWja0YfJA=",
     "version": 1
    }
  4. כדי לעדכן את מדיניות הגישה, משתמשים בפקודה bq set-iam-policy:

    bq set-iam-policy --routine PROJECT_ID:DATASET.ROUTINE PATH_TO_FILE
  5. כדי לאמת את השינויים בבקרת הגישה, משתמשים שוב בפקודה get-iam-policy בלי לכתוב את המידע לקובץ:

    bq get-iam-policy --routine --format=prettyjson PROJECT_ID:DATASET.ROUTINE

API

  1. כדי לאחזר את המדיניות הנוכחית, צריך להפעיל את ה-method‏ routines.getIamPolicy.

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

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

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

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

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

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

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

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

  5. מוודאים שהאפשרות Show inherited roles in table מופעלת.

    האפשרות &quot;הצגת תפקידים שעברו בירושה בטבלה&quot; במסוף

  6. מרחיבים תפקיד בטבלה.

  7. בעמודה Inheritance, הסמל המשושה מציין אם התפקיד עבר בירושה ממשאב הורה.

    הסמל &quot;עובר בירושה ממשאב הורה&quot;

דחיית הגישה למשאב

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

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

מקרים מיוחדים

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

  • גישה למשאבים מורשים (תצוגות, פונקציות, מערכי נתונים או פרוצדורות מאוחסנות) מאפשרת ליצור, למחוק או לשנות טבלה, וגם לקרוא ולשנות נתונים בטבלה, גם אם אין לכם הרשאה ישירה לבצע את הפעולות האלה. הוא יכול גם לקבל נתונים או מטא-נתונים של מודלים ולהפעיל פרוצדורות מאוחסנות אחרות בטבלה הבסיסית. היכולת הזו אומרת שלמשאבים האלה יש את ההרשאות הבאות:

    • bigquery.tables.get
    • bigquery.tables.list
    • bigquery.tables.getData
    • bigquery.tables.updateData
    • bigquery.tables.create
    • bigquery.tables.delete
    • bigquery.routines.get
    • bigquery.routines.list
    • bigquery.datasets.get
    • bigquery.models.getData
    • bigquery.models.getMetadata

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

    ערך תרחיש לדוגמה
    principalSet://goog/public:all חסימה של כל החשבונות הראשיים, כולל משאבים מורשים של BigQuery.
    principalSet://bigquery.googleapis.com/projects/PROJECT_NUMBER/* חסימה של כל המשאבים המורשים של BigQuery בפרויקט שצוין. ‫PROJECT_NUMBER הוא מזהה ייחודי שנוצר באופן אוטומטי לפרויקט מסוג INT64.

    מכיוון שכללי מדיניות הדחייה ב-IAM מבטלים את כללי מדיניות ההרשאה ואת הגישה למשאבים מורשים, כלל דחייה שמשתמש ב-principalSet://goog/public:all חוסם גם את הגישה מתצוגות מורשות, ממערכי נתונים מורשים ומשגרות מורשות. כדי להחריג משאבים מורשים של BigQuery ממדיניות דחייה, צריך לציין את הפרויקט שמכיל את המשאבים המורשים בשדה exceptionPrincipals של מדיניות הדחייה. רק הגדרת היקף ברמת הפרויקט עם מספר פרויקט נתמכת במשאבים מורשים של BigQuery בשדות deniedPrincipals ו-exceptionPrincipals. אין תמיכה במזהים ברמת התיקייה, הארגון, מערך הנתונים או המשאב הבודד.

    רשימת חשבונות המשתמשים המורשים מופיעה במאמר מזהים של חשבונות משתמשים בכללי מדיניות הדחייה.

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

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

    פורמט תיאור
    principalSet://bigquery.googleapis.com/projects/PROJECT_NUMBER/* החרגה של כל המשאבים המורשים של BigQuery בפרויקט שצוין.

    מחליפים את PROJECT_NUMBER במספר הפרויקט שמכיל את המשאבים המורשים.

  • ב-BigQuery, תוצאות השאילתות נשמרות במטמון של בעלי המשימה למשך 24 שעות. בעלי המשימה יכולים לגשת לתוצאות האלה בלי ההרשאה bigquery.tables.getData בטבלה שמכילה את הנתונים. לכן, הוספה של מדיניות דחייה ב-IAM להרשאה bigquery.tables.getData לא חוסמת את הגישה לתוצאות שנשמרו במטמון לבעלי המשימה, עד שהתוקף של המטמון פג. כדי לחסום את הגישה של בעלי המשימה לתוצאות שנשמרו במטמון, צריך ליצור מדיניות דחייה נפרדת להרשאה bigquery.jobs.create.

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

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

    • bigquery.datasets.get
    • bigquery.datasets.getIamPolicy
  • כדי ליצור מדיניות דחייה ב-IAM לעדכון בקרת הגישה של קבוצת הנתונים, צריך לדחות את ההרשאות הבאות:

    • bigquery.datasets.update
    • bigquery.datasets.setIamPolicy

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

איך משתמשים ב-projects.testIamPermissions כדי לבדוק את הגישה של המשתמשים למשאב