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

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

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

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

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

始める前に

  1. BigQuery テーブル ACL で使用するテーブルまたはビューを作成します。

  2. このトピックの手順を実行するユーザーに、BigQuery データオーナー(roles/bigquery.dataOwner)ロールまたは BigQuery 管理者(roles/bigquery.admin)ロールを付与します。

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

アクセス ポリシーの作成

テーブルまたはビューのアクセス ポリシーを作成するには:

Console

  1. Cloud Console で、[BigQuery] ページを開きます。

    BigQuery に移動

  2. [エクスプローラ] パネルでプロジェクトを選択します。

  3. テーブルまたはビューを含むデータセットを選択します。

  4. テーブルまたはビューを選択します。

  5. テーブルへのアクセス権を変更する場合は、[テーブルを共有] をクリックします。ビューへのアクセス権を変更する場合は、[表示を共有] をクリックします。

  6. [テーブルの権限] または [権限の表示] ページが開きます。[メンバーを追加] に、テーブルまたはビューへのアクセスを許可するユーザーのメールアドレスを入力します。

  7. [ロールを選択] プルダウンで、ユーザーに付与するロールを選択します。下の図に、joe@example.com に BigQuery データ閲覧者(roles/bigquery.dataViewer)ロールを付与する例を示します。

    テーブルの権限

  8. [完了] をクリックします。

SQL

次の GRANT ステートメントを使用して、データセット内のテーブルのユーザー joe@example.com にデータ閲覧者(roles/bigquery.dataViewer)のロールを付与します。

  GRANT `roles/bigquery.dataViewer`
  ON TABLE DATASET.TABLE_OR_VIEW
  TO "user:joe@example.com"
 

DATASET は、リソースが含まれるデータセットの名前に置き換えます。

TABLE_OR_VIEW は、アクセス権を付与するテーブルまたはビューに置き換えます。

GRANT DCL ステートメントの詳細については、標準 SQL のデータ制御言語ステートメントをご覧ください。

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. Cloud Console で、[BigQuery] ページを開きます。

    BigQuery に移動

  2. [エクスプローラ] パネルでプロジェクトを選択します。

  3. テーブルまたはビューを含むデータセットを選択します。

  4. テーブルまたはビューを選択します。

  5. テーブルへのアクセス権を変更する場合は、[テーブルを共有] をクリックします。ビューへのアクセス権を変更する場合は、[表示を共有] をクリックします。

  6. [テーブルの権限] または [権限の表示] ページが開きます。

    • 新しいメンバーを追加したい場合は、アクセス ポリシーの作成と同じ方法を使用します。

    • ユーザーのアクセス権を削除するには、[メンバー検索] フィールドを使用してユーザーを検索します。ユーザーを削除するグループごとに、グループを展開し、そのユーザーの編集 ボタン をクリックします。

    • ユーザーのグループ メンバーシップを変更する場合は、上記の 2 つの手順で追加や削除を行います。

  7. 必要に応じて、アクセス権の追加、変更または削除を行うユーザーに同じ手順を繰り返します。完了したら、[完了] をクリックします。

SQL

次の REVOKE ステートメントを使用して、データセット内のテーブルでユーザー joe@example.com からデータ閲覧者(roles/bigquery.dataViewer)のロールを削除します。

  REVOKE `roles/bigquery.dataViewer`
  ON TABLE DATASET.TABLE_OR_VIEW
  FROM "user:joe@example.com"
 

DATASET は、リソースが含まれるデータセットの名前に置き換えます。

TABLE_OR_VIEW は、アクセス権を取り消すテーブルまたはビューに置き換えます。

REVOKE DCL ステートメントの詳細については、標準 SQL のデータ制御言語ステートメントをご覧ください。

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

次のステップ