行レベルのセキュリティの操作

このドキュメントでは、BigQuery で行レベルのセキュリティを使用して、テーブルの行レベルでデータへのアクセスを制限する方法について説明します。このドキュメントを読む前に、BigQuery の行レベルのセキュリティの概要で行レベルのセキュリティの概要を理解しておいてください。

概要

行レベルのアクセス ポリシーを使用すると、次のタスクを行うことができます。

行レベルのアクセス ポリシーを作成または更新する

データ定義言語(DDL)ステートメントを使用して、BigQuery テーブルの行レベルのアクセス ポリシーを作成または更新できます。

必要な権限

BigQuery テーブルに行レベルのアクセス ポリシーを作成するには、次の権限が必要です。

  • bigquery.rowAccessPolicies.create
  • bigquery.rowAccessPolicies.setIamPolicy
  • ターゲット テーブルに対する bigquery.tables.getData
  • DDL クエリジョブを実行するための bigquery.jobs.create

BigQuery テーブルに行レベルのアクセス ポリシーを更新するには、次の権限が必要です。

  • bigquery.rowAccessPolicies.update
  • bigquery.rowAccessPolicies.setIamPolicy
  • ターゲット テーブルに対する bigquery.tables.getData
  • DDL クエリジョブを実行するための bigquery.jobs.create

以下の Identity and Access Management(IAM)事前定義ロールには、行レベルのアクセス ポリシーの作成と更新を含めて、管理と作成に必要なすべての権限が含まれています。

  • bigquery.admin
  • bigquery.dataOwner

bigquery.filteredDataViewer ロール

行レベルのアクセス ポリシーが正常に作成されると、権限の対象者リストのメンバーに bigquery.filteredDataViewer ロールが自動的に付与されます。bigquery.filteredDataViewer ロールを使用すると、ポリシーのフィルタ式で定義された行を表示できます。Google Cloud Console でテーブルの行レベルのアクセス ポリシーを一覧表示すると、このロールはポリシーの付与リストのメンバーと一緒に表示されます。

bigquery.filteredDataViewer ロールを IAM とともに使用する場合は、行レベルのセキュリティに関するベスト プラクティスをご覧ください。

BigQuery での IAM のロールと権限について詳しくは、事前定義ロールと権限をご覧ください。

行レベルのアクセス ポリシーを作成または更新する

DDL ステートメントで次のコマンドを使用して、行アクセス ポリシーを作成または置換します。

  • CREATE ROW ACCESS POLICY は、新しい行レベルのアクセス ポリシーを作成します。

  • CREATE ROW ACCESS POLICY IF NOT EXISTS は、指定されたテーブルに同じ名前の行レベルのアクセス ポリシーが存在しない場合に新しい行レベルのアクセス ポリシーを作成します。

  • CREATE OR REPLACE ROW ACCESS POLICY は、指定されたテーブルにある同じ名前の行レベルのアクセス ポリシーを更新します。

行レベルのアクセス ポリシーを作成する方法については、完全な構文とオプションの DDL リファレンスをご覧ください。

SQL

これらの DDL ステートメントは Cloud Console ページで実行できます。

BigQuery ページで、クエリエディタにステートメントを入力します。

BigQuery に移動

行アクセス ポリシーを作成し、後で付与対象を変更する

CREATE ROW ACCESS POLICY My_apac_filter
ON project.dataset.My_table
GRANT TO ("user:abc@example.com")
FILTER USING (region = "apac");
CREATE OR REPLACE ROW ACCESS POLICY My_apac_filter
ON project.dataset.My_table
GRANT TO ("user:xyz@example.com")
FILTER USING (region = "apac");

複数の付与対象を使用して行アクセス ポリシーを作成する

CREATE ROW ACCESS POLICY My_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 My_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));

テーブルの行レベルのアクセス ポリシーを一覧表示する

適切な権限があれば、Cloud Console または bq コマンドライン ツールでテーブルのすべての行レベルのアクセス ポリシーを一覧表示できます。

必要な権限

BigQuery テーブルの行レベルのアクセス ポリシーを一覧表示するには、次の権限が必要です。

  • bigquery.rowAccessPolicies.list

BigQuery テーブルで行レベルのアクセス ポリシーのメンバーを表示するには、次の権限が必要です。

  • bigquery.rowAccessPolicies.getIamPolicy

以下の Identity and Access Management(IAM)事前定義ロールには、行レベルのアクセス ポリシーの一覧表示と表示を含めて、管理と作成に必要なすべての権限が含まれています。

  • bigquery.admin
  • bigquery.dataOwner

BigQuery での IAM のロールと権限について詳しくは、事前定義ロールと権限をご覧ください。

テーブルの行レベルのアクセス ポリシーの一覧表示

Console

  1. 行レベルのアクセス ポリシーを表示するには、Cloud Console の [BigQuery] ページに移動します。

    BigQuery に移動

  2. テーブル名をクリックして詳細を表示し、[行アクセス ポリシーを表示] ボタンをクリックします。

    行アクセス ポリシーを表示

  3. [行アクセス ポリシー] パネルを開くと、テーブルのすべての行レベルのアクセス ポリシーのリストが名前順に表示されます。また、各ポリシーの filter_expression も表示されます。

    行アクセス ポリシーの詳細

  4. ポリシーの横にある [表示] をクリックすると、[権限の表示] パネルが開き、行レベルのアクセス ポリシーの影響を受けるすべてのロールとユーザーのリストが表示されます。付与対象リストのメンバーには 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 つまたはすべての行レベルのアクセス ポリシーを削除できます。

必要な権限

行アクセス ポリシーを削除するには、次の権限が付与されている必要があります。

  • bigquery.rowAccessPolicies.delete
  • DDL クエリジョブを実行するための bigquery.jobs.create

テーブルのすべての行アクセス ポリシーを同時に削除するには、次の権限が付与されている必要があります。

  • bigquery.rowAccessPolicies.update
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.rowAccessPolicies.list
  • DDL クエリジョブを実行するための bigquery.jobs.create

以下の Identity and Access Management(IAM)事前定義ロールには、削除を含めて、行レベルのアクセス ポリシーの管理に必要なすべての権限が含まれています。

  • bigquery.admin
  • bigquery.dataOwner

BigQuery での IAM のロールと権限について詳しくは、事前定義ロールと権限をご覧ください。

行レベルのアクセス ポリシーの削除

DDL ステートメントで次のコマンドを使用して、テーブルから行アクセス ポリシーを削除します。

  • DROP ROW ACCESS POLICY では、指定したテーブルの行レベルのアクセス ポリシーを削除します。

  • DROP ROW ACCESS POLICY IF EXISTS では、行レベルのアクセス ポリシーを削除します。ただし、指定したテーブルに行アクセス ポリシーが存在する場合に限ります。

  • DROP ALL ROW ACCESS POLICIES では、指定されたテーブルのすべての行レベルのアクセス ポリシーを削除します。

行レベルのアクセス ポリシーを削除する方法については、完全な構文とオプションの DDL リファレンスをご覧ください。

SQL

これらの DDL ステートメントは Cloud Console ページで実行できます。

BigQuery ページで、クエリエディタにステートメントを入力します。

BigQuery に移動

テーブルからの行レベルのアクセス ポリシーの削除

DROP ROW ACCESS POLICY My_row_filter ON project.dataset.My_table;

テーブルからのすべての行レベルのアクセス ポリシーの削除

DROP ALL ROW ACCESS POLICIES ON project.dataset.My_table;

行アクセス ポリシーを使用したテーブルのクエリ

BigQuery テーブルに対する行アクセス ポリシーの grantee_list に含まれている場合でも、そのテーブルにクエリを実行するには、テーブルに対するアクセス権が必要です。権限がない状態でクエリを実行すると、access denied エラーが発生します。

必要な権限

1 つ以上の行レベルのアクセス ポリシーがある BigQuery テーブルに対してクエリを実行するには、次の権限が必要です。

クエリ結果の表示

Console

Cloud Console で行レベルのアクセス ポリシーが適用されたテーブルに対してクエリを実行すると、行レベルのアクセス ポリシーによって結果がフィルタリングされた可能性があることを示すバナー通知が 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"
  },
  ...
}

次のステップ