テーブルおよびビューへのアクセスの制御

このドキュメントでは、テーブル アクセス ポリシーを使用して、テーブルとビューへのアクセスを管理する方法について説明します。テーブル アクセス ポリシーの概要については、テーブル アクセス ポリシーの概要をご覧ください。

テーブルまたはビューを作成すると、次の方法でポリシーを設定できます。

  • Google Cloud コンソールを使用する
  • bq set-iam-policy コマンドを使用する
  • tables.setIamPolicy メソッドを呼び出す
  • GRANT または REVOKE データ制御言語(DCL)ステートメントを使用する

テーブル アクセス ポリシーは、ビューとデータセット レベル承認済みビューのアクセス権を設定するために使用できます。ビューでは、テーブル アクセス ポリシーを使用して共有した他のテーブルとビューを参照することもできます。

始める前に

テーブル アクセス ポリシーは、BigQuery リソース(テーブルやビューなど)に対して使用できます。テーブルやビューの作成方法については、テーブルの作成またはビューの作成をご覧ください。

アクセス ポリシーの作成に必要な権限

テーブル アクセス ポリシーを作成するには、bigquery.tables.setIamPolicy Identity and Access Management(IAM)権限を付与されている必要があります。

次の各 IAM 事前定義ロールには、テーブルまたはビューのアクセス ポリシーを作成するために必要な権限が含まれています。

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

BigQuery での IAM の詳細については、IAM によるアクセス制御をご覧ください。

テーブルとビューをクエリするために必要な権限

ユーザーには、クエリが参照するすべてのテーブルとビューに対する bigquery.tables.getData 権限が必要です。さらに、ビューをクエリする場合は、基盤となるすべてのテーブルとビューに対してこの権限が必要になります。ただし、承認済みビューまたは承認済みデータセットを使用する場合は、ユーザーに基盤となるソースデータへのアクセス権を付与する必要はありません。

次の各 IAM 事前定義ロールには、クエリで参照するすべてのテーブルとビューに対してユーザーが必要とする権限が含まれています。

  • roles/bigquery.admin
  • roles/bigquery.dataOwner
  • roles/bigquery.dataEditor
  • roles/bigquery.dataViewer

アクセス ポリシーを作成する

テーブルやビューのアクセス ポリシーを作成するには、次の操作を行います。

Console

  1. BigQuery ページに移動します。

    BigQuery に移動

  2. [エクスプローラ] パネルでプロジェクトを開いて、データセットを選択します。

  3. データセットを開いて、テーブルまたはビューを選択します。

  4. [共有] をクリックします。

  5. [共有] ページでユーザー(またはプリンシパル)を追加するには、[ プリンシパルを追加] をクリックします。

  6. [プリンシパルの追加] ページで、次の操作を行います。

    • [新しいプリンシパル] にユーザー名を入力します。個別のユーザー、グループ、サービス アカウント、ワークスペース ドメインを追加できます。
    • [ロールを選択] プルダウン リストから、ユーザーに付与するロールを選択します。
    • [条件を追加] をクリックして、ユーザーに対する条件付きアクセスを追加します。
  7. [保存] をクリックして、新しいユーザーの変更を保存します。

  8. [閉じる] をクリックして [共有] ページを閉じます。

SQL

ユーザーにロールを付与するには、GRANT DCL ステートメントを使用します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    BigQuery に移動

  2. クエリエディタで次のステートメントを入力します。

    GRANT `ROLE_LIST`
    ON TABLE DATASET.TABLE_OR_VIEW
    TO 'USER_LIST';
    

    次のように置き換えます。

    • ROLE_LIST: ロール、または付与する権限を含むカンマ区切りのリスト(例: roles/bigquery.dataViewer
    • DATASET: リソースが存在するデータセットの名前
    • TABLE_OR_VIEW: アクセス権を取り消すテーブルまたはビュー
    • USER_LIST: ロールが付与されるユーザーのカンマ区切りのリスト(例: user:joe@example.com

  3. [ 実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリの実行をご覧ください。

bq

  1. 既存のポリシーをローカル ファイルに取得します。

    bq get-iam-policy \
     project-id:dataset.table_or_view \
     > policy.json
    

    ここで

    • project-id は、プロジェクト ID です。
    • dataset は、更新するリソース(テーブルまたはビュー)を含むデータセットの名前です。
    • table_or_view は、更新するリソースの名前です。

    テーブルまたはビューを特定し、ポリシーの出力をファイルにリダイレクトする例:

    • bq get-iam-policy dataset1.table1 > policy.json
    • bq get-iam-policy --project_id=project1 -t dataset1.table1 > policy.json
    • bq get-iam-policy project1:dataset1.table1 > policy.json
  2. ポリシーにメンバーをまだ追加していない場合、policy.json ファイルに etag 値が含まれますが、その他のフィールドは含まれません。policy.json ファイルのフォーマットの詳細については、ポリシーについてをご覧ください。

  3. 初めてメンバーを追加する場合は、bindings フィールドをポリシーに追加します。たとえば、joe@example.com に BigQuery データ閲覧者(roles/bigquery.dataViewer)ロールを追加するには、次のようにします。

    "bindings": [
     {
       "members": [
         "user:joe@example.com"
       ],
       "role": "roles/bigquery.dataViewer"
     }
    ]
    

    既存のバインディングにメンバーを追加する場合は、既存メンバーの後ろにそのメンバーを追加します。この例では、既存のバインディングで jane@example.com に BigQuery データ閲覧者(roles/bigquery.dataViewer)ロールを付与する方法を示しています。

    "members": [
           "user:joe@example.com",
           "user:jane@example.com"
         ],
         "role": "roles/bigquery.dataViewer"
    
  4. ポリシーを更新します。

    bq set-iam-policy \
     project-id:dataset.table_or_view \
     policy.json
    

    IAM ポリシー スキーマのバージョンについては、ポリシー バージョンをご覧ください。

API

  1. tables.getIamPolicy を呼び出して、現在のポリシーを取得します。

  2. ポリシーを編集してメンバーやバインディングを追加します。ポリシーの形式については、bq の例をご覧ください。

  3. tables.setIamPolicy を呼び出して、新しいポリシーを書き込みます。

IAM ポリシー スキーマのバージョンについては、ポリシー バージョンをご覧ください。

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートJava の手順に沿って設定を行ってください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

// Sample to create iam policy for table
public class CreateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    createIamPolicy(datasetName, tableName);
  }

  public static void createIamPolicy(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      policy
          .toBuilder()
          .addIdentity(Role.of("roles/bigquery.dataViewer"), Identity.allUsers())
          .build();
      bigquery.setIamPolicy(tableId, policy);
      System.out.println("Iam policy created successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not created. \n" + e.toString());
    }
  }
}

アクセス ポリシーを更新する

テーブルやビューのアクセス ポリシーを更新するには、次の操作を行います。

Console

  1. BigQuery ページに移動します。

    BigQuery に移動

  2. [エクスプローラ] パネルでプロジェクトを開いて、データセットを選択します。

  3. データセットを開いて、テーブルまたはビューを選択します。

  4. [共有] をクリックします。

  5. [共有] ページで、次の操作を行います。

    • 新しいユーザーを追加するには、アクセス ポリシーの作成の手順を行います。

    • ユーザーのアクセス権を削除するには、[検索] フィールドを使用してユーザーを検索するか、ユーザーが属するロールを開きます。削除するユーザーの削除アイコン をクリックします。

    • ユーザーのアクセス権を変更するには、編集アイコン をクリックします。

  6. 変更を加えたら [保存] をクリックします。

  7. [閉じる] をクリックして [共有] ページを閉じます。

SQL

データセット内のテーブルまたはビューからユーザーのロールを削除するには、REVOKE DCL ステートメントを使用します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    BigQuery に移動

  2. クエリエディタで次のステートメントを入力します。

    REVOKE `ROLE_LIST`
    ON TABLE DATASET.TABLE_OR_VIEW
    FROM 'USER_LIST';
    

    次のように置き換えます。

    • ROLE_LIST: ロール、または付与する権限を含むカンマ区切りのリスト(例: roles/bigquery.dataViewer
    • DATASET: リソースが存在するデータセットの名前
    • TABLE_OR_VIEW: アクセス権を取り消すテーブルまたはビュー
    • USER_LIST: ロールが付与されるユーザーのカンマ区切りのリスト(例: user:joe@example.com

  3. [ 実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリの実行をご覧ください。

bq

  1. 既存のポリシーをローカル ファイルに取得します。

    bq get-iam-policy --format=prettyjson \
     project-id:dataset.table_or_view \
     > policy.json
    

    ここで

    • project-id は、プロジェクト ID です。
    • dataset は、更新するテーブルが含まれているデータセットの名前です。
    • table_or_view は、更新するテーブルまたはビューの名前です。

    テーブルまたはビューを特定し、ポリシーの出力をファイルにリダイレクトする例:

    • bq get-iam-policy dataset1.table1 > policy.json
    • bq get-iam-policy --project_id=project1 -t dataset1.table1 > policy.json
    • bq get-iam-policy project1:dataset1.table1 > policy.json
  2. 必要に応じて policy.json を変更します。

    policy.json ファイルのフォーマットの詳細については、ポリシーについてをご覧ください。

    IAM ポリシー スキーマのバージョンについては、ポリシー バージョンをご覧ください。

  3. ポリシーを更新します。

    bq set-iam-policy \
     project-id:dataset.table_or_view \
     policy.json
    

API

  1. tables.getIamPolicy を呼び出して、現在のポリシーを取得します。

  2. ポリシーを編集してメンバーやバインディングを追加します。

    ポリシーに必要な形式については、ポリシー リファレンスのトピックをご覧ください。

  3. tables.setIamPolicy を呼び出して、更新されたポリシーを書き込みます。

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートJava の手順に沿って設定を行ってください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

// Sample to update iam policy in table
public class UpdateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    updateIamPolicy(datasetName, tableName);
  }

  public static void updateIamPolicy(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      Map<Role, Set<Identity>> binding = new HashMap<>(policy.getBindings());
      binding.remove(Role.of("roles/bigquery.dataViewer"));

      policy.toBuilder().setBindings(binding).build();
      bigquery.setIamPolicy(tableId, policy);

      System.out.println("Iam policy updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not updated. \n" + e.toString());
    }
  }
}

Identity and Access Management ポリシーの詳細については、ポリシーについてポリシーのリファレンス トピックをご覧ください。

次のステップ

監査ロギングで、テーブル アクセス ポリシー管理アクティビティの監査ロギングについて確認する。