他の BigQuery 機能での行レベルのセキュリティの使用
このドキュメントでは、他の BigQuery 機能で行レベルのアクセス セキュリティを使用する方法について説明します。
このドキュメントを読む前に、BigQuery の行レベルのセキュリティの概要および行レベルのセキュリティの操作をお読みになり、行レベルのセキュリティを理解してください。
TRUE
フィルタ
行レベルのアクセス ポリシーを使用すると、クエリの実行時にユーザーに表示される結果データをフィルタできます。DML などのクエリ以外のオペレーションを実行するには、テーブル内のすべての行に対する完全アクセス権が必要です。完全アクセス権は、フィルタ式を TRUE
に設定した行アクセス ポリシーを使用することで付与されます。この行レベルのアクセス ポリシーは TRUE
フィルタと呼ばれます。
TRUE
フィルタのアクセス権は、どのユーザー(サービス アカウントを含む)にも付与できます。
クエリ以外のオペレーションの例を次に示します。
- その他の BigQuery API(BigQuery Storage Read API など)。
bq head
コマンドなど、一部のbq
コマンドライン ツールコマンド。- テーブルのコピー
TRUE
フィルタの例
CREATE ROW ACCESS POLICY all_access ON project.dataset.table1
GRANT TO ("group:all-rows-access@example.com")
FILTER USING (TRUE);
TRUE
フィルタと連携する機能
行アクセス ポリシーで保護されたテーブルに対して DML オペレーションを使用する場合は、テーブル全体へのアクセスを意味する TRUE
フィルタを使用する必要があります。テーブル スキーマを変更しないオペレーションでは、テーブルの行アクセス ポリシーが維持されます。
たとえば、ALTER TABLE RENAME
TO
ステートメントでは、元のテーブルから新しいテーブルに行アクセス ポリシーがコピーされます。別の例として、TRUNCATE
TABLE
ステートメントではテーブルからすべての行が削除されますが、テーブル スキーマと行アクセス ポリシーは維持されます。
コピージョブ
1 つ以上の行レベルのアクセス ポリシーを使用してテーブルをコピーするには、まず、ソーステーブルに対する TRUE
フィルタへのアクセス権が付与されている必要があります。ソーステーブルに対するすべての行レベルのアクセス ポリシーも、新しい宛先テーブルにコピーされます。行レベルのアクセス ポリシーのないソーステーブルを、行レベルのアクセス ポリシーがある宛先テーブルにコピーすると、行レベルのアクセス ポリシーは宛先テーブルから削除されます(--append_table
フラグが使用されている場合や、"writeDisposition": "WRITE_APPEND"
が設定されている場合を除く)。
リージョン間のコピーは許可され、すべてのポリシーがコピーされます。サブクエリ ポリシーで無効なテーブル参照がクエリに含まれている場合、コピーが完了した後に後続のクエリが機能しない可能性があります。
テーブルの行レベルのアクセス ポリシーには一意の名前を付ける必要があります。コピー中に行レベルのアクセス ポリシー名が競合すると入力エラーが発生します。
行レベルのアクセス ポリシーが適用されたテーブルをコピーするために必要な権限
1 つ以上の行レベルのアクセス ポリシーが適用されたテーブルをコピーするには、テーブルとパーティションをコピーするロールに加えて、次の権限が必要です。
権限 | リソース |
---|---|
bigquery.rowAccessPolicies.list
|
ソーステーブル。 |
bigquery.rowAccessPolicies.getIamPolicy
|
ソーステーブル。 |
TRUE フィルタ |
ソーステーブル。 |
bigquery.rowAccessPolicies.create
|
宛先テーブル。 |
bigquery.rowAccessPolicies.setIamPolicy
|
宛先テーブル。 |
BigQuery API の tabledata.list
行レベルのアクセス ポリシーが適用されたテーブルに対して BigQuery API の tabledata.list
メソッドを使用するには、TRUE
フィルタのアクセス権が必要です。
DML
行レベルのアクセス ポリシーを持つテーブルを更新する DML ステートメントを実行するには、テーブルに対する TRUE
フィルタのアクセス権が必要です。
特に、MERGE
ステートメントは、行レベルのアクセス ポリシーと次のように相互作用します。
- ターゲット テーブルに行レベルのアクセス ポリシーが含まれている場合は、ターゲット テーブルに対する
TRUE
フィルタのアクセス権が必要です。 - ソーステーブルに行レベルのアクセス ポリシーが含まれている場合、
MERGE
ステートメントはユーザーに表示される行でのみ機能します。
テーブル スナップショット
テーブル スナップショットは、行レベルのセキュリティをサポートします。ベーステーブル(ソーステーブル)とテーブル スナップショット(宛先テーブル)に必要な権限については、行レベルのアクセス ポリシーが適用されたテーブルをコピーするために必要な権限で説明しています。
JSON 列を含む BigQuery テーブル
行レベルのアクセス ポリシーを JSON 列に適用することはできません。行レベルのセキュリティに関する制限事項の詳細については、制限事項をご覧ください。
実行グラフ
行レベルのアクセス ポリシーが適用されたジョブには、クエリ実行グラフを使用できません。
ジョブを抽出する
テーブルに行レベルのアクセス ポリシーがある場合、抽出ジョブを実行すると、表示できるデータのみが Cloud Storage にエクスポートされます。
パーティション分割テーブルとクラスタ化テーブル
行レベルのセキュリティは、パーティション分割テーブルの機能であるクエリのプルーニングには関与しません。
行レベルのセキュリティはパーティション分割テーブルやクラスタ化されたテーブルと互換性がありますが、行データをフィルタする行レベルのアクセス ポリシーは、パーティションのプルーニング中は適用されません。パーティション列で実行される WHERE
句を指定することで、行レベルのセキュリティを使用するテーブルでもパーティションのプルーニングを使用できます。同様に、行レベルのアクセス ポリシー自体は、クラスタ化テーブルに対するクエリのパフォーマンス上のメリットをもたらしませんが、適用する他のフィルタの妨げになることはありません。
クエリのプルーニングは、ポリシーでフィルタを使用して行レベルのアクセス ポリシーを実行する際に行われます。
テーブルの名前を変更する
複数の行アクセス ポリシーを含むテーブルの名前を変更する場合、TRUE
フィルタのアクセス権は必要ありません。テーブル名は DDL ステートメントで変更できます。
また、テーブルをコピーして宛先テーブルに別の名前を付けることもできます。ソーステーブルに行レベルのアクセス ポリシーが存在する場合の詳細については、このページのテーブルコピー ジョブをご覧ください。
ストリーミング更新
変更データ キャプチャを使用してストリーミング テーブルの UPDATE
または DELETE
オペレーションを実行するには、TRUE
フィルタのアクセス権が必要です。
タイムトラベル
行レベルのアクセス ポリシーがある、または以前に存在していたテーブルの過去のデータにアクセスできるのは、テーブル管理者のみです。他のユーザーが行レベルのアクセス ポリシーがあるテーブルでタイムトラベル デコレータを使用すると、access
denied
エラーが発生します。詳細については、タイムトラベルと行レベルのアクセスをご覧ください。
論理ビュー、マテリアライズド ビュー、承認済みビュー
このセクションでは、さまざまなタイプの BigQuery ビューと、それらのビューが行レベルのセキュリティとどのように連携するかについて説明します。
論理ビューまたはマテリアライズド ビュー
論理ビューまたはマテリアライズド ビューは、テーブルに対するクエリから構築されます。クエリ結果は通常、テーブルデータのサブセットになります。
どちらのタイプのビューでも、表示されるデータは基になるソーステーブルの行レベルのアクセス ポリシーに従ってフィルタされます。ただし、行レベルのアクセス ポリシーでビューまたはマテリアライズド ビューを参照することはできません。
マテリアライズド ビューのパフォーマンス
さらに、マテリアライズド ビューが、行レベルのアクセス ポリシーを持つ基になるテーブルから派生している場合、クエリのパフォーマンスはソーステーブルを直接クエリする場合と同じです。つまり、ソーステーブルに行レベルのセキュリティが適用された場合、ソーステーブルに対するクエリと比較して、マテリアライズド ビューに対するクエリとソーステーブルのクエリの一般的なパフォーマンス上のメリットはありません。
承認済みビュー
論理ビューまたはマテリアライズド ビューを承認することもできます。つまり、特定のユーザーまたはグループ(プリンシパル)とビューを共有できます。プリンシパルはビューに対してクエリを実行できますが、基になるテーブルにアクセスすることはできません。詳細については、承認済みビューをご覧ください。
ワイルドカード クエリ
行レベルのアクセス ポリシーが適用されたテーブルに対するワイルドカード クエリは、INVALID_INPUT
エラーで失敗します。
次のステップ
- BigQuery での行レベルのセキュリティに関するベスト プラクティスで、行レベルのアクセス ポリシーのベスト プラクティスを確認する。