將資料列層級的安全性與其他 BigQuery 功能搭配使用

本文說明如何將資料列層級存取權安全性與其他 BigQuery 功能搭配使用。

閱讀本文前,請先參閱「BigQuery 資料列層級安全防護機制簡介」和「使用資料列層級安全防護機制」,熟悉資料列層級安全防護機制。

TRUE 篩選器

資料列層級存取權政策可篩選執行查詢時顯示的結果資料。如要執行 DML 等非查詢作業,您必須擁有資料表中所有資料列的完整存取權。使用資料列存取政策,並將篩選運算式設為 TRUE,即可授予完整存取權。這個資料列層級存取權政策稱為 TRUE 篩選器

任何使用者 (包括服務帳戶) 都能獲得 TRUE 篩選器存取權。

非查詢作業的例子包括:

TRUE 篩選器範例

CREATE ROW ACCESS POLICY all_access ON project.dataset.table1
GRANT TO ("group:[email protected]")
FILTER USING (TRUE);

可搭配 TRUE 篩選器使用的功能

在受資料列存取政策保護的資料表上使用 DML 作業時,您必須使用 TRUE 篩選器,這表示您可以存取整個資料表。任何不會變更資料表結構定義的作業,都會保留資料表上的任何資料列存取政策。

舉例來說,ALTER TABLE RENAME TO 陳述式會將資料列存取政策從原始資料表複製到新資料表。舉另一個例子來說,TRUNCATE TABLE 陳述式會移除資料表中的所有資料列,但會保留資料表結構定義和任何資料列存取政策。

複製工作

如要複製資料表,並在其中套用一或多個資料列層級存取政策,您必須先取得來源資料表的 TRUE 篩選器存取權。來源資料表中的所有資料列層級存取政策也會複製到新的目的地資料表。如果您將沒有資料列層級存取權政策的來源資料表複製到有資料列層級存取權政策的目的地資料表,則系統會從目的地資料表移除資料列層級存取權政策,除非您使用 --append_table 標記或設定 "writeDisposition": "WRITE_APPEND"

允許跨區域複製,且會複製所有政策。如果查詢在子查詢政策中含有無效的資料表參照,後續查詢可能會在複製作業完成後中斷。

資料表中的資料列層級存取政策名稱不得重複。如果在複製期間資料列層級存取政策名稱發生衝突,就會導致輸入錯誤。

使用資料列層級存取權政策複製資料表時,所需的權限

如要複製具有一或多個資料列層級存取權政策的資料表,除了複製資料表和分區的角色之外,您還必須具備下列權限。

權限 資源
bigquery.rowAccessPolicies.list 來源資料表。
bigquery.rowAccessPolicies.getIamPolicy 來源資料表。
TRUE 篩選器 來源資料表。
bigquery.rowAccessPolicies.create 目標資料表。
bigquery.rowAccessPolicies.setIamPolicy 目標資料表。

BigQuery API 中的 Tabledata.list

您必須具備 TRUE 篩選器存取權,才能在具有列層級存取權政策的資料表中,使用 BigQuery API 中的 tabledata.list 方法。

DML

如要執行 DML 陳述式,以更新具有資料列層級存取政策的資料表,您需要擁有該資料表的 TRUE 篩選器存取權。

具體來說,MERGE 陳述式會與資料列層級存取權政策互動,如下所示:

  • 如果目標資料表包含資料列層級存取政策,您需要對目標資料表具備 TRUE 篩選器存取權。
  • 如果來源資料表包含資料列層級存取權政策,則 MERGE 陳述式只會對使用者可見的資料列執行。

資料表快照

資料表快照支援資料列層級安全性。如要瞭解基礎資料表 (來源資料表) 和資料表快照 (目的地資料表) 所需的權限,請參閱「使用資料表列級存取權政策複製資料表所需的權限」一文。

含有 JSON 欄的 BigQuery 資料表

資料列層級存取權政策無法套用至 JSON 欄。如要進一步瞭解資料列層級安全防護機制的限制,請參閱「限制」一節。

BigQuery BI Engine 和 Looker Studio

BigQuery BI Engine 不會加速在具有一或多個資料列層級存取政策的資料表上執行的查詢;這些查詢會在 BigQuery 中以標準查詢執行。

Looker Studio 資訊主頁中的資料會根據基礎來源資料表的資料列層級存取權政策進行篩選。

資料欄層級的安全防護機制

資料列層級安全性和資料欄層級安全性 (包括資料欄層級存取權控管動態資料遮罩) 完全相容。

重點如下:

  • 您可以套用資料列層級存取政策,篩選任何欄中的資料,即使您無法存取該欄中的資料也一樣。
    • 如果嘗試使用子查詢資料列層級存取政策存取這些資料欄,系統會傳回錯誤,指出存取權遭到拒絕。這些資料欄不屬於系統參照欄。
    • 嘗試使用非子查詢的資料列層級存取權政策存取這些資料欄,以便略過資料欄層級安全性。
  • 如果資料欄因資料欄層級安全性而受到限制,且資料欄是在查詢的 SELECT 陳述式或子查詢資料列層級存取權政策中命名,就會收到錯誤訊息。
  • 資料欄層級安全防護機制也適用於 SELECT * 查詢陳述式。SELECT * 會與明確命名受限制資料欄的查詢相同。

資料列層級安全性和資料欄層級安全性互動示例

本例會逐步說明如何保護資料表,然後查詢資料表。

資料

假設您擁有名為 my_dataset 的資料集資料擁有者角色,該資料集包含名為 my_table 的資料表,其中包含三個資料欄。表格包含下表所示的資料。

在這個範例中,一位使用者是 Alice,電子郵件地址為 [email protected]。第二位使用者是小莉的同事Bob

rank fruit color
1 apple 紅色
2 orange orange
3 萊姆綠 綠色
4 檸檬 黃色

安全性

您希望 Alice 能夠查看 rank 資料欄中所有奇數值的資料列,但不顯示偶數值的資料列。您不希望 Bob 看到任何資料列,無論是偶數還是奇數。您不希望任何人看到 fruit 欄中的任何資料。

  • 如要限制 Alice 查看偶數資料列,您可以建立資料列層級存取政策,其中包含根據 rank 欄中顯示的資料建立的篩選運算式。為避免 Bob 看到偶數或奇數行,請勿將他納入授權對象清單。

    CREATE ROW ACCESS POLICY only_odd ON my_dataset.my_table GRANT
    TO ('user:[email protected]') FILTER USING (MOD(rank, 2) = 1);
    
  • 如要限制所有使用者無法查看名為 fruit 的資料欄中的資料,您可以建立資料欄層級安全政策標記,禁止所有使用者存取任何資料。

最後,您也可以透過兩種方式限制對 color 資料欄的存取權:資料欄受資料欄層級安全政策標記管制,禁止任何人存取資料欄,並受資料列層級存取政策影響,這項政策會篩除 color 資料欄中的部分資料列。

  • 這個第二個資料列層級存取權政策只會顯示 color 欄中值為 green 的資料列。

    CREATE ROW ACCESS POLICY only_green ON my_dataset.my_table
    GRANT TO ('user:[email protected]') FILTER USING (color="green");
    

Bob 的查詢

如果 Alice 的同事 Bob 嘗試查詢 my_dataset.my_table 中的資料,他不會看到任何資料列,因為 Bob 不在該資料表的任何資料列層級存取權政策的授權對象清單中。

查詢 my_dataset.my_table 註解
rank

(部分資料受到資料列存取政策 only_odd 的影響)
fruit

(所有資料都受到 CLS 政策標記保護)
color

(所有資料都受到 CLS 政策標記保護,部分資料受到資料列存取政策 only_green的影響)
SELECT rank FROM my_dataset.my_table
已傳回 (0) 列。
Bob 不在列層級存取權政策的授權對象清單中,因此這項查詢會成功,但不會傳回任何資料列資料。

系統會向 Bob 顯示訊息,指出結果可能會因資料列存取政策而遭到篩除。

Alice 的查詢

當 Alice 執行查詢來存取 my_dataset.my_table 的資料時,結果取決於她執行的查詢和安全性,如下表所示。

查詢 my_dataset.my_table 註解
rank

(部分資料受到資料列存取政策 only_odd 的影響)
fruit

(所有資料都受到 CLS 政策標記保護)
color

(所有資料都受到 CLS 政策標記保護,部分資料受到資料列存取政策 only_green的影響)

SELECT rank FROM my_dataset.my_table


(1) 列會傳回。
Alice 是 only_oddonly_green 資料列層級存取權政策的授權對象。因此,Alice 只會看到奇數的排名和綠色。因此,Alice 會看到下列資料列:

rank: 3, color: green

Alice 無法看到「fruit」欄,因為該欄受到資料欄層級安全性政策的限制。

系統會向 Alice 顯示訊息,指出她的結果可能會遭到資料列存取政策篩除。

SELECT fruit FROM my_dataset.my_table


access denied

查詢中明確指定了 fruit 欄的名稱。

資料欄層級安全性已套用。

存取遭拒。

SELECT color FROM my_dataset.my_table


(1) 列會傳回。
Alice 是 only_oddonly_green 資料列層級存取權政策的授權對象。因此,Alice 只會看到奇數的排名和綠色。因此,Alice 會看到下列資料列:

rank: 3, color: green

Alice 無法看到「fruit」欄,因為該欄受到資料欄層級安全性政策的限制。

系統會向 Alice 顯示訊息,指出她的結果可能會遭到資料列存取政策篩除。

SELECT rank, fruit FROM my_dataset.my_table


access denied

查詢中明確指定了 fruit 欄的名稱。

rank 資料欄的資料上套用資料列層級存取政策之前,會先套用資料欄層級安全性。

存取遭拒。

SELECT rank, color FROM my_dataset.my_table


(1) 列會傳回。
Alice 是 only_oddonly_green 資料列層級存取權政策的授權對象。因此,Alice 只會看到奇數的排名和綠色。因此,Alice 會看到下列資料列:

rank: 3, color: green

Alice 無法看到「fruit」欄,因為該欄受到資料欄層級安全性政策的限制。

系統會向 Alice 顯示訊息,指出她的結果可能會遭到資料列存取政策篩除。

SELECT fruit, color FROM my_dataset.my_table


access denied

查詢中明確指定了 fruit 欄的名稱。

color 資料欄的資料列級存取權政策生效前,會先套用 fruit 資料欄的資料欄層級安全性。

存取遭拒。

SELECT * FROM my_dataset.my_table


(1) 列會傳回。
Alice 是 only_oddonly_green 資料列層級存取權政策的授權對象。因此,Alice 只會看到奇數的排名和綠色。因此,Alice 會看到下列資料列:

rank: 3, color: green

Alice 無法看到「fruit」欄,因為該欄受到資料欄層級安全性政策的限制。

系統會向 Alice 顯示訊息,指出她的結果可能會遭到資料列存取政策篩除。

TRUE 篩選器存取權

最後,如TRUE 篩選器存取權」一節所述,如果 Alice 或 Bob 有 TRUE 篩選器存取權,他們就能查看資料表中的所有資料列,並在非查詢工作中使用這些資料列。不過,如果資料表有資料欄層級的安全防護機制,則仍會套用該機制,並可能影響結果。

執行圖

您無法針對具有資料列層級存取權政策的工作使用查詢執行圖

擷取工作

如果資料表設有列層級存取權政策,執行擷取工作時,系統只會將您可查看的資料匯出至 Cloud Storage。

舊版 SQL

列層級存取權政策與舊版 SQL 不相容。針對設有資料列層級存取權政策的資料表進行查詢時,必須使用 GoogleSQL。系統會拒絕舊版 SQL 查詢。

分區和分群資料表

資料列層級安全防護機制不會參與查詢修剪作業,這是分區資料表的功能。

雖然資料列層級安全性與分區和叢集資料表相容,但在分區裁剪期間,篩選資料列資料的資料列層級存取權政策不會套用。您仍可在使用資料列層級安全性的資料表上使用分區修剪功能,方法是指定在分區欄上運作的 WHERE 子句。同樣地,資料列層級存取權政策本身不會為針對叢集資料表的查詢帶來任何效能優勢,但不會干擾您套用的其他篩選條件。

執行資料列層級存取政策時,系統會使用政策中的篩選器執行查詢裁剪作業。

重新命名資料表

您不需要 TRUE 篩選器存取權,即可重新命名含有一或多個資料列存取政策的資料表。您可以使用 DDL 陳述式重新命名資料表

您也可以複製資料表,並為目標資料表指定不同的名稱。如果來源資料表設有資料列層級存取權政策,請參閱本頁的資料表複製工作相關說明。

串流更新

如要使用「變更資料擷取」執行串流資料表 UPDATEDELETE 作業,您必須具備 TRUE 篩選器存取權。

時光旅行

只有資料表管理員可以存取具有或先前曾設有資料表層級存取權政策的資料表歷來資料。如果其他使用者在具有資料列層級存取權的資料表上使用時間旅行修飾符,就會收到 access denied 錯誤。詳情請參閱「時間旅行和資料列層級存取」一文。

邏輯、具體化和授權檢視表

本節將說明不同類型的 BigQuery 檢視表,以及這些檢視表與資料列層級安全防護機制的互動方式。

邏輯或具體化檢視表

邏輯檢視表或具體化檢視表是根據對資料表的查詢建立。查詢結果通常是資料表資料的子集。

無論是哪一種檢視畫面,其中顯示的資料都會根據底層來源資料表的資料列層級存取政策進行篩選。不過,您無法在資料列層級存取政策中參照檢視表或具體化檢視表。

具體化檢視表的效能

此外,如果具體化檢視表是從具有列層級存取政策的基礎資料表衍生而來,則查詢效能會與直接查詢來源資料表時相同。換句話說,如果來源資料表設有資料列層級安全防護機制,您就不會在查詢實際資料檢視時,看到與查詢來源資料表時相同的效能優勢。

授權檢視表

您也可以授權邏輯或具象化檢視畫面,也就是與特定使用者或群組 (主要使用者) 共用檢視畫面。這樣一來,管理員就能查詢檢視畫面,但無法存取基礎資料表。詳情請參閱「授權檢視表」。

萬用字元查詢

針對設有資料列層級存取權政策的資料表執行萬用字元查詢時,會發生 INVALID_INPUT 錯誤。

後續步驟