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

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

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

מגבלות

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

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

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

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

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

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

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

CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('serviceAccount:example@exampleproject.')
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 us_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 eu_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');

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

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

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

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

כדי להציג רשימה של כללי מדיניות גישה ברמת השורה בטבלה ב-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. לוחצים על שם הטבלה כדי לפתוח את חלונית הפרטים שלה, ואז לוחצים על More > View row access policies.

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

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

  4. כדי לראות את כל התפקידים והמשתמשים שמושפעים ממדיניות גישה ברמת השורה, לוחצים על VIEW לצד המדיניות. לדוגמה, בתמונה הבאה, בחלונית 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, ואת התפקיד 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"
  },
  ...
}

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