行レベルのセキュリティを使用する
このドキュメントでは、BigQuery で行レベルのセキュリティを使用して、テーブルの行レベルでデータへのアクセスを制限する方法について説明します。このドキュメントを読む前に、BigQuery の行レベルのセキュリティの概要で行レベルのセキュリティの概要を理解しておいてください。
行レベルのアクセス ポリシーを使用すると、次のタスクを行うことができます。
- テーブルの行レベルのアクセス ポリシーを作成または更新する。
- テーブルの行レベルのアクセス ポリシーを組み合わせる
- テーブルの行レベルのアクセス ポリシーを一覧表示する
- テーブルから行レベルのアクセス ポリシーを削除する
- 行レベルのアクセス ポリシーを使用してテーブルにクエリを実行する。
始める前に
このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(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 コンソールでテーブルの行レベルのアクセス ポリシーを一覧表示すると、このロールはポリシーの付与リストのメンバーと一緒に表示されます。
IAM で bigquery.filteredDataViewer
を手動で付与しないでください。詳細については、行レベルのセキュリティのベスト プラクティスをご覧ください。
行レベルのアクセス ポリシーを作成または更新する
行レベルのアクセス ポリシーを作成または更新するには、次のいずれかの DDL ステートメントを使用します。
CREATE ROW ACCESS POLICY
は、新しい行レベルのアクセス ポリシーを作成します。CREATE ROW ACCESS POLICY IF NOT EXISTS
は、指定されたテーブルに同じ名前の行レベルのアクセス ポリシーが存在しない場合に新しい行レベルのアクセス ポリシーを作成します。CREATE OR REPLACE ROW ACCESS POLICY
ステートメントは、指定されたテーブルにある同じ名前の既存の行レベルのアクセス ポリシーを更新します。
Examples
新しい行アクセス ポリシーを作成します。このテーブルへのアクセスはユーザー 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');
ユーザーと 2 つのグループにアクセス権を付与する行アクセス ポリシーを作成します。
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));
サブクエリを使用して行アクセス ポリシーを作成し、複数のポリシーをユーザーごとに構成されたリージョン比較に置き換えます。
この機能に関するフィードバックやサポートのリクエストは、bigquery-row-level-security-support@google.com 宛てにメールでお送りください。以下のテーブル 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 = 'us-west1'); 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 ステートメントリファレンスをご覧ください。
行レベルのアクセス ポリシーを組み合わせる
2 つ以上の行レベルのアクセス ポリシーが、ユーザーまたはグループに同じテーブルへのアクセス権を付与する場合、そのユーザーまたはグループは、いずれかのポリシーの対象となるすべてのデータにアクセスできます。たとえば、次のポリシーは、ユーザーに my_table
テーブル内の指定された行への abc@example.com
アクセス権を付与します。
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
演算子を含むフィルタを使用します。たとえば、次のような行レベルのアクセス ポリシーでは、product_category
フィールドが shoes
に設定され、color
フィールドが blue
に設定された行にのみ abc@example.com
アクセス権を付与します。
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 のロールと権限について詳しくは、事前定義ロールと権限をご覧ください。
テーブルの行レベルのアクセス ポリシーを一覧表示する
行レベルのアクセス ポリシーを一覧表示するには、次のようにします。
コンソール
行レベルのアクセス ポリシーを表示するには、Google Cloud コンソールの [BigQuery] ページに移動します。
テーブル名をクリックして詳細を表示し、[行アクセス ポリシーを表示] をクリックします。
[行アクセス ポリシー] パネルを開くと、テーブルのすべての行レベルのアクセス ポリシーのリストが名前順に表示されます。また、各ポリシーの
filter_expression
も表示されます。行レベルのアクセス ポリシーの影響を受けるすべてのロールとユーザーを表示するには、ポリシーの横にある [表示] をクリックします。たとえば、次の図では、[権限の表示] パネルで、譲受人リストのメンバーに
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 ステートメントを使用して、テーブルの 1 つまたはすべての行レベルのアクセス ポリシーを削除できます。
必要な権限
行レベルのアクセス ポリシーを削除するには、次の IAM 権限が必要です。
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
- DDL クエリジョブを実行するための
bigquery.jobs.create
テーブルのすべての行レベルのアクセス ポリシーを同時に削除するには、次の IAM 権限が必要です。
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.rowAccessPolicies.list
- DDL クエリジョブを実行するための
bigquery.jobs.create
事前定義された次の 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
ステートメントは、指定されたテーブルのすべての行レベルのアクセス ポリシーを削除します。
Examples
テーブルから行レベルのアクセス ポリシーを削除する:
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
IAM 権限と bigquery.rowAccessPolicies.getFilteredData
IAM 権限が必要です。関連するすべてのテーブルに対して bigquery.tables.getData
IAM 権限が必要です。
これらのロールを事前定義ロールで取得するには、roles/bigquery.dataViewer
と roles/bigquery.filteredDataViewer
の IAM ロールが付与されている必要があります。
列レベルのセキュリティを使用するには、関連するすべての列に対して datacatalog.categories.fineGrainedGet
権限が必要です。この権限を事前定義ロールで取得するには、datacatalog.categoryFineGrainedReader
ロールが必要です。
クエリ結果を表示する
Google Cloud コンソールで、行レベルのアクセス ポリシーを使用してテーブルにクエリを実行すると、結果が行レベルのアクセス ポリシーでフィルタリングされた可能性があることを示すバナー通知が表示されます。この通知は、ポリシーの付与対象リストのメンバーにも表示されます。
ジョブの統計情報
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"
},
...
}
次のステップ
行レベルのセキュリティが他の BigQuery の機能やサービスとどのように連携するかについては、他の BigQuery の機能とともに行レベルのセキュリティを使用するをご覧ください。
行レベルのセキュリティのベスト プラクティスについては、BigQuery での行レベルのセキュリティに関するベスト プラクティスをご覧ください。