データセットへのアクセスの制御

このドキュメントでは、BigQuery 内のデータセットへのアクセスを制御する方法を説明します。

さらに、次のことも実践できます。

概要

データセット レベルの権限により、特定のデータセット内のテーブル、ビュー、テーブルデータにアクセスできるユーザー、グループ、サービス アカウントが決まります。たとえば、あるユーザーに特定のデータセットに対する bigquery.dataOwner IAM ロールを付与した場合、そのユーザーはそのデータセット内のテーブルとビューを作成、更新、削除できます。

データセットの作成時にアクセス制御を適用するには、datasets.insert API メソッドを呼び出します。

Cloud Console、従来の BigQuery ウェブ UI、bq コマンドライン ツールでデータセットを作成している間は、アクセス制御を適用できません

データセットを作成したで、データセットにアクセス制御を適用できます。

  • Cloud Console または従来の BigQuery ウェブ UI を使用する
  • bq コマンドライン ツールで bq update コマンドを使用する
  • datasets.patch API メソッドを呼び出す
  • クライアント ライブラリを使用する

必要な権限

データセットのアクセス制御の割り当てまたは更新を行うには、少なくとも bigquery.datasets.update 権限と bigquery.datasets.get 権限が付与されている必要があります。次の事前定義済みの IAM ロールには bigquery.datasets.update 権限と bigquery.datasets.get 権限が含まれています。

  • bigquery.dataOwner
  • bigquery.admin

また、bigquery.datasets.create 権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner アクセス権がユーザーに付与されます。bigquery.dataOwner アクセス権により、ユーザーは自身が作成したデータセットを更新できます。

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

データセットへのアクセスの制御

データセットにアクセス制御を割り当てるには:

Console

  1. [リソース] からデータセットを選択し、ウィンドウ右側の [共有データセット] をクリックします。

    データセットに個人を追加

  2. [共有データセット] パネルの [データセットの権限] タブで、[メンバーを追加] テキスト ボックスに追加するエンティティを入力します。次のエンティティを追加できます。

    • Google アカウントのメールアドレス: 個々の Google アカウントにデータセットへのアクセスを許可します。
    • Google グループ: Google グループ内のすべてのメンバーにデータセットへのアクセスを許可します。
    • Google Apps ドメイン: Google ドメイン内のすべてのユーザーとグループにデータセットへのアクセスが許可されます。
    • サービス アカウント: サービス アカウントにデータセットへのアクセスが許可されます。
    • 全員: 一般ユーザーに公開されているデータへのアクセスを許可するには、「allUsers」と入力します。
    • すべての Google アカウント: Google アカウントにログインしたすべてのユーザーにアクセス権を付与するには、「allAuthenticatedUsers」と入力します。
  3. [ロールを選択] で、[BigQuery] を選択し、新しいメンバーに適切な定義済みの IAM ロールを選択します。事前定義された各 BigQuery ロールに割り当てられている権限の詳細については、アクセス制御ページのロールのセクションをご覧ください。

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

従来の UI

  1. データセットの右側にあるプルダウン矢印をクリックし、[Share Dataset] を選択します。

  2. [Share Dataset] ダイアログの [Add People] で、フィールドの左側にあるプルダウンをクリックして、適切なオプションを選択します。従来のウェブ UI を使用してデータセットにアクセス制御を適用する際は、以下のユーザーとグループにアクセス権を付与できます。

    • User by e-mail - 個々の Google アカウントにデータセットへのアクセスが許可されます。
    • Group by e-mail - Google グループのすべてのメンバーにデータセットへのアクセスが許可されます。
    • Domain - Google ドメイン内のすべてのユーザーとグループにデータセットへのアクセスが許可されます。
    • All Authenticated Users - すべての Google アカウント所有者にデータセットへのアクセスが許可されます(データセットが公開されます)。
    • Project Owners - すべてのプロジェクト オーナーにデータセットへのアクセスが許可されます。
    • Project Viewers - すべてのプロジェクト閲覧者にデータセットへのアクセスが許可されます。
    • Project Editors - すべてのプロジェクト編集者にデータセットへのアクセスが許可されます。
    • Authorized View - データセットに対する表示アクセスだけが許可されます。

  3. テキスト ボックスに値を入力します。たとえば、[User by e-mail] または [Group by e-mail] を選択した場合は、ユーザーまたはグループのメールアドレスを入力します。

  4. [Add People] フィールドの右側にある [Can view] をクリックし、リストから該当するロールを選択します。

    データセットに個人を追加

    • [Can view](READER)を選択すると、データセットに対する bigquery.dataViewer アクセス権が付与されます。
    • [Can edit](WRITER)を選択すると、データセットに対する bigquery.dataEditor アクセス権が付与されます。
    • [Is owner](OWNER)を選択すると、データセットに対する bigquery.dataOwner アクセス権が付与されます。

      これらのデータセットのロールについて詳しくは、データセットの基本ロールをご覧ください。

  5. [Add] をクリックして、[Save changes] をクリックします。

bq

  1. show コマンドを使用して、既存のデータセット情報(アクセス制御も含む)を JSON ファイルに書き込みます。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq show \
    --format=prettyjson \
    project_id:dataset > path_to_file
    

    ここで

    • project_id はプロジェクト ID です。
    • dataset はデータセットの名前です。
    • path_to_file は、ローカルマシン上の JSON ファイルへのパスです。

    例:

    次のコマンドを入力すると、mydataset のアクセス制御が JSON ファイルに書き込まれます。mydataset はデフォルト プロジェクトにあります。

      bq show --format=prettyjson mydataset > /tmp/mydataset.json
    

    次のコマンドを入力すると、mydataset のアクセス制御が JSON ファイルに書き込まれます。mydatasetmyotherproject にあります。

      bq show --format=prettyjson \
      myotherproject:mydataset > /tmp/mydataset.json
    
  2. JSON ファイルの "access" セクションに変更を加えます。specialGroup のエントリ(projectOwnersprojectWritersprojectReadersallAuthenticatedUsers)を追加または削除できます。さらに、userByEmailgroupByEmaildomain を追加、削除、変更することもできます。

    たとえば、データセットの JSON ファイルの access セクションは次のようになります。

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
    

  3. 編集が完了したら、update コマンドを実行します。その際、--source フラグを使用して JSON ファイルを指定します。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq update \
    --source path_to_file \
    project_id:dataset
    

    ここで

    • path_to_file は、ローカルマシン上の JSON ファイルへのパスです。
    • project_id はプロジェクト ID です。
    • dataset はデータセットの名前です。

    例:

    次のコマンドを入力すると、mydataset のアクセス制御が更新されます。mydataset はデフォルト プロジェクトにあります。

        bq update --source /tmp/mydataset.json mydataset
    

    次のコマンドを入力すると、mydataset のアクセス制御が更新されます。mydatasetmyotherproject にあります。

        bq update --source /tmp/mydataset.json myotherproject:mydataset
    
  4. アクセス制御の変更を確認するには、show コマンドをもう一度入力します。ただし、今回は情報をファイルに書き込む指定を省略します。

    bq show --format=prettyjson dataset
    

    または

    bq show --format=prettyjson project_id:dataset
    

API

データセットの作成時にアクセス制御を適用するには、定義済みのデータセット リソースを使用して datasets.insert を呼び出します。アクセス制御を更新するには、データセット リソースで datasets.patch を呼び出して access プロパティを使用します。

datasets.update メソッドはデータセット リソース全体を置き換えるので、アクセス制御の更新には datasets.patch メソッドの方が適切です。

Go

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

dataset.access_entries プロパティを使用してデータセットのアクセス制御を設定します。次に、client.update_dataset() 関数を呼び出してプロパティを更新します。

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateDatasetAccessControl demonstrates how the access control policy of a dataset
// can be amended by adding an additional entry corresponding to a specific user identity.
func updateDatasetAccessControl(projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}
	// Append a new access control entry to the existing access list.
	update := bigquery.DatasetMetadataToUpdate{
		Access: append(meta.Access, &bigquery.AccessEntry{
			Role:       bigquery.ReaderRole,
			EntityType: bigquery.UserEmailEntity,
			Entity:     "sample.bigquery.dev@gmail.com"},
		),
	}

	// Leverage the ETag for the update to assert there's been no modifications to the
	// dataset since the metadata was originally read.
	if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Python

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

dataset.access_entries プロパティを使用してデータセットのアクセス制御を設定します。次に、client.update_dataset() 関数を呼び出してプロパティを更新します。
from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
# dataset_id = 'your-project.your_dataset'

dataset = client.get_dataset(dataset_id)  # Make an API request.

entry = bigquery.AccessEntry(
    role="READER",
    entity_type="userByEmail",
    entity_id="sample.bigquery.dev@gmail.com",
)

entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ["access_entries"])  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
print(
    "Updated dataset '{}' with modified user permissions.".format(full_dataset_id)
)

次のステップ