使用資料列層級安全性

本文件說明如何在 BigQuery 中使用資料列層級安全防護機制,限制存取資料表資料列層級的資料。閱讀本文前,請先參閱「BigQuery 資料列層級安全防護機制簡介」,熟悉資料列層級安全防護機制的概略說明。

您可以使用資料列層級存取權政策執行下列工作:

限制

在 Google Cloud 控制台中選取資料表時,「Preview」分頁無法顯示具有資料列存取權政策的資料表預覽畫面。如要查看資料表的內容,請執行查詢。

事前準備

授予身分與存取權管理 (IAM) 角色,讓使用者取得執行本文件中各項工作的必要權限。執行工作所需的權限 (如有) 會列在工作內容的「必要權限」部分。

建立或更新資料列層級存取權政策

您可以使用資料定義語言 (DDL) 陳述式,在 BigQuery 中建立或更新資料表的資料列層級存取權政策。

所需權限

如要在 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 陳述式會更新指定資料表中名稱相同的現有資料列層級存取政策。

範例

建立新的資料列存取權政策。只有使用者 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');

請改為更新要套用至服務帳戶 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');

建立資料列存取權政策,並將 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');

如要進一步瞭解語法和可用選項,請參閱 CREATE ROW ACCESS POLICY DDL 陳述式參考資料。

結合資料列層級存取權政策

如果有兩個或更多資料列層級存取權政策授予使用者或群組存取相同資料表的權限,則使用者或群組可存取任何政策涵蓋的所有資料。舉例來說,下列政策會授予使用者 abc@example.commy_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 欄位設為 shoescolor 欄位設為 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 主控台、bq 指令列工具或 RowAccessPolicies.List API 方法,列出並查看資料表中的所有資料列層級存取權政策。

所需權限

如要在 BigQuery 資料表上列出資料列層級存取權政策,您必須具備 bigquery.rowAccessPolicies.list IAM 權限。

如要查看 BigQuery 資料表上的列層級存取權政策成員,您必須具備 bigquery.rowAccessPolicies.getIamPolicy IAM 權限。

以下每個預先定義的 IAM 角色都包含列出及查看資料列層級存取權政策所需的權限:

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

如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「預先定義的角色與權限」一文。

可列出資料表資料列層級存取權政策

如要列出資料列層級存取權政策,請按照下列步驟操作:

主控台

  1. 如要查看資料列層級存取權政策,請前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 按一下資料表名稱查看詳細資料,然後點選「View row access policies」(查看資料列存取權政策)

    查看資料列存取政策

  3. 當「資料列存取權政策」面板開啟時,您會看到資料表中所有資料列層級存取權政策的清單,並依名稱和每項政策的 filter_expression 排序。

    資料列存取政策詳細資料

  4. 如要查看資料列層級存取權政策影響的所有角色和使用者,請按一下政策旁的「查看」舉例來說,在下圖的「View permissions」面板中,您可以看到授權對象清單的成員具有「bigquery.filteredDataViewer」角色

    資料列存取政策詳細資料

bq

輸入 bq ls 指令並提供 --row_access_policies 旗標。必須提供資料集和資料表名稱。

    bq ls --row_access_policies dataset.table

舉例來說,下列指令會列出 ID 為 my_dataset 的資料集中名為 my_table 的資料表上的列層級存取權政策相關資訊:

    bq ls --row_access_policies my_dataset.my_table

API

請參閱 REST API 參考資料章節,使用 RowAccessPolicies.List 方法

刪除資料列層級存取權政策

如果您有權限,可以使用 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

如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「預先定義的角色與權限」一文。

刪除資料列層級存取權政策

如要從資料表刪除資料列存取權政策,請使用下列 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;

如要進一步瞭解如何刪除資料列層級存取政策,請參閱 DROP ROW ACCESS POLICY DDL 陳述式參考資料。

查詢含有資料列存取政策的資料表

使用者必須先有權存取 BigQuery 資料表,才能查詢該資料表,即使他們是該資料表的資料列存取政策 grantee_list 也一樣。如果沒有這項權限,查詢就會失敗,並顯示 access denied 錯誤。

所需權限

如要查詢設有資料列層級存取權政策的 BigQuery 資料表,您必須具備該資料表的 bigquery.tables.getData 權限。您也需要 bigquery.rowAccessPolicies.getFilteredData 權限。

如要透過預先定義的角色取得這些權限,您必須使用 IAM 授予資料表的 roles/bigquery.dataViewer 角色,並透過資料列層級存取權政策授予資料表的 roles/bigquery.filteredDataViewer IAM 角色。

您必須在所有相關的資料欄層級安全防護機制中,具備 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"
  },
  ...
}

後續步驟