IAM Conditions によるアクセス制御

このドキュメントでは、IAM Conditions を使用して BigQuery リソースへのアクセスを制御する方法について説明します。

IAM Conditions では、指定された条件が満たされた場合にのみ BigQuery リソースへのアクセスを許可できます。たとえば、リソースへのアクセス権を一定期間または 1 日の中の特定の時間帯に定期的に付与できます。IAM Conditions は、リソースの組織レベル、フォルダレベル、プロジェクト レベル、データセット レベルで追加できます。条件付きの許可ポリシーは、子リソースに継承されます。リソースレベルの詳細については、リソース階層をご覧ください。

IAM Conditions は、Identity and Access Management(IAM)権限を、まだ存在しないリソースを含む多くの関連リソースに同時に付与する場合に役立ちます。BigQuery リソースの無関係なグループに権限を付与するには、IAM タグの使用を検討してください。

始める前に

  1. このドキュメントの各タスクを実行するために必要な権限を含む IAM ロールをユーザーに付与します。
  2. IAM API を有効にします

必要なロール

BigQuery リソースに IAM Conditions を適用するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

これらの事前定義ロールには、IAM Conditions を BigQuery リソースに適用するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

IAM Conditions を BigQuery リソースに適用するには、次の権限が必要です。

  • プロジェクト レベルで条件付き IAM アクセス権を設定します。 resourcemanager.projects.setIamPolicy
  • データセットに条件付き IAM アクセス権を設定します。
    • bigquery.datasets.setIamPolicy
    • bigquery.datasets.update

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

組織全体で IAM Conditions を使用する場合は、組織のポリシーを管理する権限も必要です。

BigQuery における IAM ロールと権限の詳細については、IAM の概要をご覧ください。

IAM API を有効にする

IAM API を有効にするには、次のいずれかのオプションを選択します。

コンソール

[Identity and Access Management(IAM)API] ページに移動し、API を有効にします。

API の有効化

gcloud

gcloud services enable コマンドを実行します。

gcloud services enable iam.googleapis.com

データセットの条件付きアクセス ポリシーを表示する

次のオプションのいずれかを選択します。

コンソール

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

    [BigQuery] に移動

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

  3. [共有] > [権限] の順にクリックします。

  4. 関連付けられたロールの横にある condition:TITLE をクリックして、そのロールの条件を表示します。

bq

Cloud Shell で条件付きアクセス ポリシーを表示または更新するには、Cloud Shell バージョン 503.0.0 以降を使用する必要があります。

既存のアクセス ポリシーを取得して JSON でローカル ファイルに出力するには、Cloud Shell で bq show コマンドを使用します。

bq show --format=prettyjson PROJECT_ID:DATASET > PATH_TO_FILE

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

  • PROJECT_ID: プロジェクト ID
  • DATASET: データセットの名前
  • PATH_TO_FILE: ローカルマシン上の JSON ファイルへのパス

データセット リソースの JSON ファイルの access プロパティには、アクセス ポリシーが含まれています。

API

条件付きのデータセットのアクセス ポリシーを表示するには、accessPolicyVersion=3 をリクエスト パラメータとして datasets.get を呼び出します。データセット リソースの access プロパティには、アクセス ポリシーが含まれています。

リソースの条件付きアクセスを変更する

以降のセクションでは、さまざまなリソースへの条件付きアクセスを追加または削除する方法について説明します。

組織、フォルダ、プロジェクトに条件を追加する

BigQuery で組織、フォルダ、プロジェクトへの条件付きアクセスを追加するには、条件付きポリシーを許可するをご覧ください。条件を作成するときは、属性形式の表をご覧ください。

データセットに条件付きアクセスを追加する

データセットに条件を追加するには、次のいずれかの方法を選択します。条件を作成するときは、属性形式の表をご覧ください。

コンソール

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

    [BigQuery] に移動

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

  3. 詳細パネルで、[共有 > 権限] をクリックします。

  4. [プリンシパルを追加] をクリックします。

  5. [新しいプリンシパル] フィールドに、プリンシパルを入力します。

  6. [ロールを選択] リストで、事前定義ロールまたはカスタムロールを選択します。

  7. [IAM の条件を追加] をクリックします。

  8. 条件属性を使用して、condition フィールドに条件を追加します。

  9. [IAM の条件を追加] パネルで、[保存] をクリックします。

  10. [DATASET へのアクセス権を付与する] パネルで、[保存] をクリックします。

bq

Cloud Shell で条件付きアクセス ポリシーを表示または更新するには、Cloud Shell バージョン 503.0.0 以降を使用する必要があります。

Cloud Shell を使用してデータセットへの条件付きアクセス権を付与するには、データセットへのアクセス権を付与するの手順に沿って操作します。条件付きアクセス条件は、データセットの JSON ファイルの access セクションに追加できます。

たとえば、データセットの JSON ファイルの access セクションに次の行を追加すると、2032 年 12 月 31 日まで roles/bigquery.dataViewer ロールが cloudysanfrancisco@gmail.com に付与されます。

"access": [
  {
    "role": "roles/bigquery.dataViewer",
    "userByEmail": "cloudysanfrancisco@gmail.com",
    "condition": {
      "title": "Grant roles/bigquery.dataViewer until 2033",
      "description": "Role expires on December 31, 2032.",
      "expression": "request.time < timestamp('2032-12-31T12:00:00Z')"
    }
  }
]

API

BigQuery API を使用してデータセットへの条件付きアクセス権を付与するには、リクエスト パラメータに accessPolicyVersion=3 を指定してデータセットへのアクセス権を付与する手順に沿って操作します。

アクセス条件を含むエントリは、データセット リソースの access.condition プロパティに追加できます。

条件付きアクセス ポリシーが適用されているデータセットの場合、ユーザーは accessPolicyVersion リクエスト パラメータを指定せずに、標準の読み取り、変更、更新フローを使用して無条件アクセス設定を更新できます。

データセットから条件付きアクセスを削除する

データセットから条件を削除するには、次のいずれかの方法を選択します。条件を作成するときは、属性形式の表をご覧ください。

コンソール

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

    [BigQuery] に移動

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

  3. 詳細パネルで、[共有 > 権限] をクリックします。

  4. アクセス権を取り消すプリンシパルを選択します。

  5. [削除] をクリックします。

  6. [プリンシパルを削除しますか?] ダイアログで、[削除] をクリックします。

bq

Cloud Shell で条件付きアクセス ポリシーを表示または更新するには、Cloud Shell バージョン 503.0.0 以降を使用する必要があります。

Cloud Shell を使用してデータセットへの条件付きアクセス権を削除するには、データセットに対するアクセス権の取り消しの手順に沿って操作します。条件付きのエントリは、データセットの JSON ファイルの access セクションから削除できます。

API

BigQuery API を使用してデータセットへの条件付きアクセスを取り消すには、リクエスト パラメータに accessPolicyVersion=3 を指定してデータセットへのアクセスを取り消す手順に沿って操作します。

条件付きのエントリは、データセット リソースの access プロパティから削除できます。

条件付きアクセス ポリシーが適用されているデータセットの場合、ユーザーは accessPolicyVersion リクエスト パラメータを指定せずに、標準の読み取り、変更、更新フローを使用して無条件アクセス設定を更新できます。

条件の属性

IAM Conditions は、次の属性に基づいて BigQuery リソースに設定できます。

  • request.time: ユーザーが BigQuery リソースへのアクセスを試行した時刻。詳細と例については、日時属性をご覧ください。
  • resource.name: BigQuery リソースのパス。形式については、属性の形式の表をご覧ください。
  • resource.type: BigQuery リソースのタイプ。形式については、属性の形式の表をご覧ください。
  • resource.service: BigQuery リソースが使用する Google Cloud サービス。形式については、属性の形式の表をご覧ください。
  • resource.tags: BigQuery リソースに付加されたタグ。タグは、BigQuery のデータセット、テーブル、ビューのリソースでのみサポートされています。形式については、属性の形式IAM ドキュメントの表をご覧ください。

属性の形式

BigQuery データセットの条件を作成する場合は、次の形式を使用します。

属性
resource.type bigquery.googleapis.com/Dataset
resource.name projects/PROJECT_ID/datasets/DATASET_ID
resource.service bigquery.googleapis.com
resource.tags hasTagKeyhasTagKeyIdmatchTagmatchTagId がサポートされます。詳細については、リソースタグをご覧ください。

BigQuery のテーブルとビューの条件を作成する場合は、次の形式を使用します。

属性
resource.type bigquery.googleapis.com/Table
resource.name projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID
resource.service bigquery.googleapis.com
resource.tags hasTagKeyhasTagKeyIdmatchTagmatchTagId がサポートされます。詳細については、リソースタグをご覧ください。

BigQuery ルーティンの条件を作成する場合は、次の形式を使用します。

属性
resource.type bigquery.googleapis.com/Routine
resource.name projects/PROJECT_ID/datasets/DATASET_ID/routines/ROUTINE_ID
resource.service bigquery.googleapis.com

BigQuery モデルの条件を作成する場合は、次の形式を使用します。

属性
resource.type bigquery.googleapis.com/Model
resource.name projects/PROJECT_ID/datasets/DATASET_ID/models/MODEL_ID
resource.service bigquery.googleapis.com

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

  • PROJECT_ID: アクセス権を付与するリソースを含むプロジェクトの ID
  • DATASET_ID: アクセス権を付与するデータセットの ID
  • TABLE_ID: アクセス権を付与するテーブルまたはビューの ID
  • ROUTINE_ID: アクセス権を付与するルーティンの ID
  • MODEL_ID: アクセス権を付与するモデルの ID

条件に関するベスト プラクティス

BigQuery で条件を作成する場合は、次のベスト プラクティスを使用します。

  • 精度を高めるには、resource.typeresource.nameresource.service に肯定的な条件を使用することをおすすめします。サポートされていないタイプは空の文字列で表されるため、否定条件は幅広いリソースに一致する可能性があります。詳細については、否定条件をご覧ください。
  • データセット レベルの IAM 条件は、テーブル、ビュー、モデル、ルーティンなど、データセット内のリソースに適用されるロールにのみ使用する必要があります。データセット レベルまたはプロジェクト レベルで動作するロール(bigquery.userbigquery.jobUser など)を付与するために使用しないでください。
  • データセット レベルのポリシーでは、条件 resource.type == 'bigquery.googleapis.com/Dataset' を使用しないでください。認可には影響しません。この属性は、テーブル、ビュー、ルーティン、モデルなどのサブデータセット リソースへのアクセスを制御することを目的としています。
  • そのレベルの具体性が必要でない場合でも、条件に resource.typeresource.nameresource.service を含めます。こうすることで、ワークフロー内のリソースが変更されても、今後他のリソースが意図せず他のリソースに含まれないように条件を維持できます。
  • 権限を付与する際は、可能な限り最小限の権限セットを含め、過剰な権限を誤って付与しないようにします。
  • resource.name.startsWith は注意して使用してください。BigQuery テーブルパスとビューパスには、親プロジェクト ID とデータセット ID が接頭辞として付きます。具体的でない条件によって、過剰な権限が付与されることがあります。ただし、resource.name.startsWith 属性を使用すると、ユーザーがテーブルに対してワイルドカード クエリを実行できます。たとえば、resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix") 条件を使用して付与されたアクセス権により、ユーザーは SELECT * FROM my_dataset.table_prefix* クエリを実行できます。
  • データセット、テーブル、ビュー、ルーティン、モデル以外の BigQuery リソースの条件を追加しないでください。
  • 正しいリソースに対して正しい権限を付与していることを確認します。たとえば、リソースを一覧表示する権限(bigquery.RESOURCE.list)は親レベルで付与する必要がありますが、リソースを削除する権限(bigquery.RESOURCE.delete)はリソースレベルで付与する必要があります。データセットの削除では、含まれているすべてのリソースも削除されるため、データセットに対するテーブル、モデル、ルーティンの削除権限が必要です。
  • テーブル スナップショットタイムトラベルは権限に影響しないことに注意してください。

否定条件

resource.name != resource のような否定条件では、過剰なアクセス権が誤って付与される可能性があります。サポートされていない BigQuery リソースには空のリソース属性があります。つまり、すべての否定条件に一致します。BigQuery の外部にあるサービスのリソースも、否定的な条件と一致する可能性があります。

さらに、否定条件により、ユーザーがワイルドカードを使用してクエリを実行する際に問題が発生します。たとえば、否定条件 resource.name != /projects/my_project/datasets/my_dataset/tables/secret について考えてみます。この条件は、secret という名前のテーブルを除くすべてのリソースへのアクセス権を付与しているようです。ただし、ユーザーは引き続き、SELECT * from my_project.my_dataset.secre*; などのワイルドカード クエリを使用して、そのテーブルをクエリできます。

また、テーブル、ルーティン、モデルに否定条件があると、親データセットに過剰な権限が付与される場合があります。削除権限はデータセット レベルで管理されるため、ユーザーはこれらのリソースを削除できる可能性があります。

制限事項

  • 承認済みビュー承認済みルーティン承認済みデータセットの付与を IAM Conditions で追加することはできません。
  • 条件付きのリソースの表示中に互換性のない accessPolicyVersion が使用されている場合、バインディングに withcond の後にハッシュ値が含まれていることがあります。詳細については、ポリシーとロール バインディングの withcond のトラブルシューティングをご覧ください。
  • データセットまたはテーブルへの条件付きアクセス権を持つユーザーは、Google Cloud コンソールからそのリソースに対する権限を変更できません。権限の変更は、bq ツールと BigQuery API でのみサポートされます。
  • 行レベルと列レベルのアクセス制御は、IAM Conditions で直接サポートされていません。ただし、条件付きアクセス権を持つユーザーは、テーブルに対する BigQuery 管理者ロール(roles/bigquery.admin)を自分自身に付与して行と列のアクセス ポリシーを変更できます。
  • IAM ポリシーの変更が有効になるまで、最長 5 分かかることがあります。
  • 条件付きアクセス権を持つユーザーは、INFORMATION_SCHEMA ビューをクエリできない場合があります。
  • 条件付きテーブルへのアクセス権のみを持つユーザーは、テーブル ワイルドカード関数を実行できません。

BigQuery での IAM Conditions のユースケースの例を次に示します。

特定のテーブルへの読み取り権限を付与する

この例では、dataset_1 データセットの table_1 テーブルに対する BigQuery データ閲覧者のロールを cloudysanfrancisco@gmail.com に付与します。このロールのユーザーは、テーブルに対してクエリを実行し、bq ツールを使用してそのテーブルにアクセスできます。ユーザーにはデータセットに対する bigquery.tables.list 権限がないため、Google Cloud コンソールでテーブルを表示できません。

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataViewer,
  "condition": {
    "title": "Table dataset_1.table_1",
    "description": "Allowed to read table with name table_1 in dataset_1 dataset",
    "expression":
resource.name == projects/project_1/datasets/dataset_1/tables/table_1
&& resource.type == bigquery.googleapis.com/Table
  }
}

特定のデータセットにリストアクセス権を付与する

この例では、dataset_2 データセットに対する BigQuery メタデータ閲覧者のロールを cloudysanfrancisco@gmail.com に付与します。このロールのユーザーは、データセット内のすべてのリソースを一覧表示できますが、それらのリソースに対してクエリを実行することはできません。

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.metadataViewer,
  "condition": {
    "title": "Dataset dataset_2",
    "description": "Allowed to list resources in dataset_2 dataset",
    "expression":
resource.name == projects/project_2/datasets/dataset_2
&& resource.type == bigquery.googleapis.com/Dataset
  }
}

特定の接頭辞を持つすべてのデータセット内のすべてのテーブルへのオーナー アクセス権を付与する

この例では、public_ 接頭辞で始まるすべてのデータセットのすべてのテーブルに対する BigQuery データオーナーのロールを cloudysanfrancisco@gmail.com に付与します。

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables public_",
    "description": "Allowed owner access to tables in datasets with public_ prefix",
    "expression":
resource.name.startsWith("projects/project_3/datasets/public_")
&& resource.type == bigquery.googleapis.com/Table
  }
}

特定の接頭辞を持つすべてのデータセット内のすべてのテーブル、モデル、ルーティンにオーナー アクセス権を付与する

この例では、general_ 接頭辞で始まるすべてのデータセットのすべてのテーブル、モデル、ルーティンに対する BigQuery データオーナーのロールを cloudysanfrancisco@gmail.com に付与します。

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables general_",
    "description": "Allowed owner access to tables in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Table
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Models general_",
    "description": "Allowed owner access to models in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Model
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Routines general_",
    "description": "Allowed owner access to routines in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Routine
  }
}

次のステップ