שימוש באבטחה ברמת השורה

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

אפשר לבצע את המשימות הבאות באמצעות כללי מדיניות של גישה ברמת השורה:

מגבלות

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

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

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

יצירה או עדכון של מדיניות גישה ברמת השורה

אפשר ליצור או לעדכן מדיניות גישה ברמת השורה בטבלה ב-BigQuery באמצעות הצהרה של שפת הגדרת נתונים (DDL).

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

כדי ליצור מדיניות גישה ברמת השורה בטבלה ב-BigQuery, צריך את הרשאות ה-IAM הבאות:

  • bigquery.rowAccessPolicies.create
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.tables.getData (בטבלת היעד ובכל הטבלאות שהופנו אליהן במדיניות שהוענקה לגבי גישה ברמת השורה בשאילתת המשנה)
  • bigquery.jobs.create (להרצת משימת השאילתה של ה-DDL)

כדי לעדכן מדיניות גישה ברמת השורה בטבלה ב-BigQuery, צריך את הרשאות ה-IAM הבאות:

  • bigquery.rowAccessPolicies.update
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.tables.getData (בטבלת היעד ובכל הטבלאות שהופנו אליהן במדיניות שהוענקה לגבי גישה ברמת השורה בשאילתת המשנה)
  • bigquery.jobs.create (להרצת משימת השאילתה של ה-DDL)

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

  • roles/bigquery.admin
  • roles/bigquery.dataOwner

התפקיד bigquery.filteredDataViewer

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

יצירה או עדכון של מדיניות גישה ברמת השורה

כדי ליצור או לעדכן מדיניות גישה ברמת השורה, משתמשים באחת מהצהרות ה-DDL הבאות:

  • הפקודה CREATE ROW ACCESS POLICY יוצרת מדיניות חדשה של גישה ברמת השורה.

  • ההצהרה CREATE ROW ACCESS POLICY IF NOT EXISTS יוצרת מדיניות חדשה של גישה ברמת השורה, אם מדיניות כזו עם אותו שם לא קיימת כבר בטבלה שצוינה.

  • ההצהרה CREATE OR REPLACE ROW ACCESS POLICY מעדכנת מדיניות קיימת של גישה ברמת השורה עם אותו שם בטבלה שצוינה.

דוגמאות

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

יצירת מדיניות חדשה והענקת גישה לחשבון Google

יוצרים מדיניות חדשה של גישה לשורות. הגישה לטבלה מוגבלת למשתמש abc@example.com. רק השורות שבהן region = 'APAC' גלוי:

CREATE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (region = 'APAC');

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

יוצרים מדיניות חדשה של גישה לשורות. הגישה לטבלה מוגבלת לזהות יחידה במאגר זהויות של כוח עבודה באמצעות הפורמט הבא: principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/IDENTITY. רק השורות שבהן region = 'APAC' גלויות:

CREATE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('principal://iam.googleapis.com/locations/global/workforcePools/example-contractors/subject/abc@example.com')
FILTER USING (region = 'APAC');

עדכון מדיניות כדי להעניק גישה לחשבון שירות

מעדכנים את מדיניות הגישה של apac_filter כדי שתחול על חשבון השירות example@exampleproject.iam.gserviceaccount.com:

CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('serviceAccount:example@exampleproject.iam.gserviceaccount.com')
FILTER USING (region = 'APAC');

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

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

CREATE ROW ACCESS POLICY sales_us_filter
ON project.dataset.my_table
GRANT TO ('user:john@example.com',
          'group:sales-us@example.com',
          'group:sales-managers@example.com')
FILTER USING (region = 'US');

יצירת מדיניות ומתן גישה לזהויות של כוח העבודה בקבוצות

יוצרים מדיניות גישה לשורות שמעניקה גישה לכל הזהויות של כוח העבודה בקבוצות באמצעות הפורמט הזה principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/IDENTITY:

CREATE ROW ACCESS POLICY sales_us_filter
ON project.dataset.my_table
GRANT TO ('principal://iam.googleapis.com/locations/global/workforcePools/example-contractors/subject/sales-us@example.com',
          'principal://iam.googleapis.com/locations/global/workforcePools/example-contractors/subject/sales-managers@example.com')
FILTER USING (region = 'US');

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

יוצרים מדיניות גישה לשורות עם allAuthenticatedUsers כמשתמשים שקיבלו הרשאה:

CREATE ROW ACCESS POLICY us_filter
ON project.dataset.my_table
GRANT TO ('allAuthenticatedUsers')
FILTER USING (region = 'US');

יצירת מדיניות ומסנן על סמך המשתמש הנוכחי

יצירת מדיניות גישה לשורות עם מסנן שמבוסס על המשתמש הנוכחי:

CREATE ROW ACCESS POLICY my_row_filter
ON dataset.my_table
GRANT TO ('domain:example.com')
FILTER USING (email = SESSION_USER());

יצירת מדיניות וסינון לפי עמודה

יוצרים מדיניות גישה לשורות עם מסנן בעמודה עם סוג ARRAY:

CREATE ROW ACCESS POLICY my_reports_filter
ON project.dataset.my_table
GRANT TO ('domain:example.com')
FILTER USING (SESSION_USER() IN UNNEST(reporting_chain));

יצירת מדיניות ושימוש בהשוואה בין אזורים

יוצרים מדיניות גישה לשורות עם שאילתת משנה כדי להחליף כמה כללי מדיניות בהשוואה בין אזורים שהוגדרה לכל משתמש:

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

+-----------------+--------------+
|      email      |    region    |
+-----------------+--------------+
| xyz@example.com | europe-west1 |
| abc@example.com | us-west1     |
| abc@example.com | us-west2     |
+-----------------+--------------+
CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('domain:example.com')
FILTER USING (region IN (
    SELECT
      region
    FROM
      lookup_table
    WHERE
      email = SESSION_USER()));

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

CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (region IN ('us-west1', 'us-west2'));

CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:xyz@example.com')
FILTER USING (region = 'europe-west1');

לקבלת מידע נוסף על התחביר והאפשרויות הזמינות, אפשר לעיין במאמר בנושא הצהרת DDL של CREATE ROW ACCESS POLICY.

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

אם שתי מדיניות גישה ברמת השורה או יותר מעניקות למשתמש או לקבוצה גישה לאותה טבלה, אז למשתמש או לקבוצה יש גישה לכל הנתונים שכל אחת מהמדיניות מכסה. לדוגמה, כללי המדיניות הבאים מעניקים למשתמש abc@example.com גישה לשורות שצוינו בטבלה my_table:

CREATE ROW ACCESS POLICY shoes
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (product_category = 'shoes');
CREATE OR REPLACE ROW ACCESS POLICY blue_products
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (color = 'blue');

בדוגמה שלמעלה, למשתמש abc@example.com יש גישה לשורות בטבלה my_table שבהן השדה product_category מוגדר ל-shoes, ולמשתמש abc@example.com יש גישה גם לשורות שבהן השדה color מוגדר ל-blue. לדוגמה, abc@example.com יוכל לגשת לשורות עם מידע על נעליים אדומות ומכוניות כחולות.

הגישה הזו שוות ערך לגישה שניתנת על ידי מדיניות גישה ברמת השורה הבאה:

CREATE ROW ACCESS POLICY shoes_and_blue_products
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (product_category = 'shoes' OR color = 'blue');

לעומת זאת, כדי לציין גישה שתלויה בכך שיותר מתנאי אחד יהיה True, צריך להשתמש במסנן עם אופרטור AND. לדוגמה, מדיניות הגישה הבאה ברמת השורה מעניקה ל-abc@example.com גישה רק לשורות שבהן השדה product_category מוגדר ל-shoes והשדה color מוגדר ל-blue:

CREATE ROW ACCESS POLICY blue_shoes
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (product_category = 'shoes' AND color = 'blue');

בהתאם למדיניות הגישה ברמת השורה שצוינה למעלה, ל-abc@example.com תהיה גישה למידע על נעליים כחולות, אבל לא למידע על נעליים אדומות או על מכוניות כחולות.

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

אפשר להשתמש בשיטה RowAccessPolicies.List API, בכלי שורת הפקודה של BigQuery או במסוף Google Cloud כדי להציג את כל כללי מדיניות הגישה ברמת השורה בטבלה.

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

כדי להציג רשימה של מדיניות גישה ברמת השורה בטבלה ב-BigQuery, אתם צריכים את הרשאת IAM‏ bigquery.rowAccessPolicies.list.

כדי לראות את המשתמשים במדיניות גישה ברמת השורה בטבלת BigQuery, צריך הרשאת IAM‏ bigquery.rowAccessPolicies.getIamPolicy.

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

  • roles/bigquery.admin
  • roles/bigquery.dataOwner

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

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

כדי להציג את מדיניות הגישה ברמת השורה:

המסוף

  1. כדי לראות את מדיניות הגישה ברמת השורה, עוברים לדף BigQuery במסוף Google Cloud .

    כניסה ל-BigQuery

  2. לוחצים על שם הטבלה כדי לראות את הפרטים שלה, ואז לוחצים על View row access policies (הצגת מדיניות הגישה לשורות).

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

  3. כשפותחים את החלונית Row access policies (מדיניות גישה ברמת השורה), רואים רשימה של כל מדיניות הגישה ברמת השורה בטבלה, לפי שם, ואת filter_expression לכל מדיניות.

    פרטים על מדיניות הגישה לשורות

  4. כדי לראות את כל התפקידים והמשתמשים שמושפעים ממדיניות גישה ברמת השורה, לוחצים על הצגה ליד המדיניות. לדוגמה, בתמונה הבאה אפשר לראות בחלונית View permissions שלחברים ברשימת מקבלי ההרשאות יש את התפקיד bigquery.filteredDataViewer.

    פרטים על מדיניות הגישה לשורות

BQ

מזינים את הפקודה bq ls ומספקים את הדגל --row_access_policies. חובה לציין את השמות של מערך הנתונים והטבלה.

    bq ls --row_access_policies dataset.table

לדוגמה, הפקודה הבאה מציגה מידע על מדיניות הגישה ברמת השורה בטבלה בשם my_table במערך נתונים עם המזהה my_dataset:

    bq ls --row_access_policies my_dataset.my_table

API

משתמשים ב-method ‏RowAccessPolicies.List בקטע 'הפניה ל-API בארכיטקטורת REST'.

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

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

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

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

  • bigquery.rowAccessPolicies.delete
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.jobs.create (להרצת משימת השאילתה של ה-DDL)

כדי להסיר את כל כללי מדיניות הגישה ברמת השורה בטבלה בו-זמנית, אתם צריכים את ההרשאות הבאות ב-IAM:

  • bigquery.rowAccessPolicies.delete
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.rowAccessPolicies.list
  • bigquery.jobs.create (להרצת משימת השאילתה של ה-DDL)

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

  • roles/bigquery.admin
  • roles/bigquery.dataOwner

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

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

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

  • ההצהרה DROP ROW ACCESS POLICY מוחקת מדיניות גישה ברמת השורה בטבלה שצוינה.

  • ההצהרה DROP ROW ACCESS POLICY IF EXISTS מוחקת מדיניות גישה ברמת השורה אם מדיניות הגישה ברמת השורה קיימת בטבלה שצוינה.

  • ההצהרה DROP ALL ROW ACCESS POLICIES מוחקת את כל כללי המדיניות של גישה ברמת השורה בטבלה שצוינה.

דוגמאות

כדי למחוק מדיניות גישה ברמת השורה מטבלה:

DROP ROW ACCESS POLICY my_row_filter ON project.dataset.my_table;

מחיקה של כל מדיניות הגישה ברמת השורה מטבלה:

DROP ALL ROW ACCESS POLICIES ON project.dataset.my_table;

מידע נוסף על מחיקת מדיניות גישה ברמת השורה זמין במאמר בנושא הצהרת DDL של DROP ROW ACCESS POLICY.

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

משתמש צריך קודם לקבל גישה לטבלה ב-BigQuery כדי להריץ עליה שאילתה, גם אם הוא נמצא בgrantee_list של מדיניות גישה לשורה בטבלה הזו. אם אין לכם את ההרשאה הזו, השאילתה תיכשל ותוצג השגיאה access denied.

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

כדי לשלוח שאילתה לטבלה ב-BigQuery עם מדיניות גישה ברמת השורה, צריכה להיות לכם הרשאה bigquery.tables.getData בטבלה. נדרשת גם ההרשאה bigquery.rowAccessPolicies.getFilteredData.

כדי לקבל את ההרשאות האלה באמצעות תפקידים מוגדרים מראש, צריך לקבל את התפקיד roles/bigquery.dataViewer בטבלה באמצעות IAM, ואת תפקיד ה-IAM‏ roles/bigquery.filteredDataViewer בטבלה באמצעות מדיניות הגישה ברמת השורה.

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

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

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

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

נתונים סטטיסטיים של משימות

כששולחים שאילתה לטבלה עם מדיניות גישה ברמת השורה באמצעות Job API,‏ BigQuery מציין אם השאילתה קוראת טבלאות עם מדיניות גישה ברמת השורה באובייקט התגובה Job:

דוגמה

התגובה של אובייקט Job הזו קוצרה כדי לפשט אותה:

{
  "configuration": {
    "jobType": "QUERY",
    "query": {
      "priority": "INTERACTIVE",
      "query": "SELECT * FROM dataset.table",
      "useLegacySql": false
    }
  },
  ...
  "statistics": {
    ...
    rowLevelSecurityStatistics: {
      rowLevelSecurityApplied: true
    },
    ...
  },
  "status": {
    "state": "DONE"
  },
  ...
}

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