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

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

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

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

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

始める前に

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

必要な権限

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

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

  • bigquery.dataOwner
  • 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. コンソールで、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. コンソールで、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 ポリシーの詳細については、ポリシーについてポリシーのリファレンス トピックをご覧ください。

次のステップ