列レベルのアクセス制御によるアクセス制限

このページでは、BigQuery の列レベルのアクセス制御を使用して、BigQuery データへのアクセスを列レベルで制限する方法について説明します。列レベルのアクセス制御に関する一般的な情報については、BigQuery の列レベルのアクセス制御の概要をご覧ください。

このページの手順には、BigQuery と Data Catalog の両方が使用されます。

テーブル スキーマを更新して、列にポリシータグを設定する必要があります。Google Cloud コンソール、bq コマンドライン ツール、BigQuery API を使用して、列のポリシータグを設定できます。さらに、次の手法を使用して、テーブルの作成、スキーマの指定、ポリシータグの指定を 1 回の操作で行えます。

  • bq コマンドライン ツールの bq mk コマンドと bq load コマンド。
  • tables.insert API メソッド。
  • Google Cloud コンソールの [テーブルの作成] ページ。Google Cloud コンソールを使用する場合は、スキーマを追加または編集するときに [テキストとして編集] を選択する必要があります。

列レベルのアクセス制御を適用するため、必要に応じて動的データ マスキングを使用できます。データ マスキングを使用すると、列の実際の値を null、デフォルト、またはハッシュされたコンテンツで置換することで機密データをマスクできます。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Data Catalog and BigQuery Data Policy APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Data Catalog and BigQuery Data Policy APIs.

    Enable the APIs

  8. BigQuery は、新しいプロジェクトでは自動的に有効になりますが、既存のプロジェクトでは有効にする必要がある場合があります。

    Enable the BigQuery API.

    Enable the API

ロールと権限

ユーザーまたはサービス アカウントのポリシータグに関連するロールがいくつかあります。

  • ポリシータグを管理するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが必要です。ポリシータグ管理者のロールは、分類とポリシータグを管理できます。また、ポリシータグに関連付けられた IAM ロールを付与または削除できます。
  • アクセス制御を適用して列レベルのアクセス制御を行うユーザーまたはサービス アカウントには、BigQuery 管理者のロールまたは BigQuery データオーナーのロールが必要です。BigQuery のロールでは、分類階層にアクセス制御を適用するために使用されるデータポリシーを管理できます。
  • Google Cloud コンソールで組織内のすべてのプロジェクトのタクソノミーとポリシータグを表示するには、組織閲覧者のロールが必要です。組織閲覧者のロールがない場合、コンソールに表示されるのは、選択したプロジェクトに関連付けられているタクソノミーとポリシータグのみです。
  • 列レベルのアクセス制御で保護されているデータに対してクエリを実行するユーザーまたはサービス アカウントには、そのデータにアクセスするための Data Catalog のきめ細かい読み取りのロールが必要です。

すべてのポリシータグ関連のロールの詳細については、列レベルのアクセス制御で使用するロールをご覧ください。

Data Catalog のポリシータグ管理者のロール

Data Catalog ポリシータグ管理者のロールは、データポリシー タグを作成、管理できます。

ポリシータグ管理者のロールを付与するには、ロールを付与するプロジェクトに対する resourcemanager.projects.setIamPolicy 権限が必要です。resourcemanager.projects.setIamPolicy 権限がない場合は、権限を付与するようプロジェクト オーナーに依頼してください。または、次の手順を行ってください。

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

    [IAM] ページを開く

  2. ロールを付与するユーザーのメールアドレスがリストにある場合は、そのメールアドレスを選択して [編集](鉛筆アイコン)をクリックします。[別のロールを追加] をクリックします。

    ユーザーのメールアドレスがリストにない場合は、[追加] をクリックし、[新しいプリンシパル] ボックスにメールアドレスを入力します。

  3. [ロールを選択] プルダウン リストをクリックします。

  4. [Data Catalog] をクリックし、[ポリシータグ管理者] をクリックします。

  5. [保存] をクリックします。

BigQuery 管理者のロールとデータオーナーのロール

BigQuery 管理者のロールとデータオーナーのロールは、データポリシーを管理できます。

これらのロールのどちらかを付与するには、ロールを付与するプロジェクトの resourcemanager.projects.setIamPolicy 権限が必要です。resourcemanager.projects.setIamPolicy 権限がない場合は、権限を付与するようプロジェクト オーナーに依頼してください。または、次の手順を行ってください。

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

    [IAM] ページを開く

  2. ロールを付与するユーザーのメールアドレスがリストにある場合は、そのメールアドレスを選択して [編集](鉛筆アイコン)をクリックします。[別のロールを追加] をクリックします。

    ユーザーのメールアドレスがリストにない場合は、[追加] をクリックし、[新しいプリンシパル] ボックスにメールアドレスを入力します。

  3. [ロールを選択] プルダウン リストをクリックします。

  4. [BigQuery] をクリックし、[管理者] または [データオーナー] をクリックします。

  5. [保存] をクリックします。

組織閲覧者のロール

組織閲覧者のロールを持つユーザーは、組織リソースの詳細を表示できます。このロールを付与するには、組織に対する resourcemanager.organizations.setIamPolicy 権限が必要です。

Data Catalog のきめ細かい読み取りのロール

列レベルのセキュリティで保護されたデータにアクセスするユーザーには、Data Catalog のきめ細かい読み取りのロールが必要です。このロールは、ポリシータグの構成の一環としてプリンシパルに割り当てられます。

ポリシータグに対するきめ細かい読み取りのロールをユーザーに付与するには、そのポリシータグの分類を含むプロジェクトに対する datacatalog.taxonomies.setIamPolicy 権限が必要です。datacatalog.taxonomies.setIamPolicy 権限がない場合は、プロジェクト オーナーに依頼して権限を付与してもらうか、この操作を実行してもらってください。

手順については、ポリシータグの権限を設定するをご覧ください。

列レベルのアクセス制御を設定する

次のタスクを実行して、列レベルのアクセス制御を設定します。

  • ポリシータグの分類を作成します。
  • プリンシパルをポリシータグに関連付け、プリンシパルに Data Catalog のきめ細かい読み取りのロールを付与します。
  • ポリシータグと BigQuery テーブル列を関連付けます。
  • ポリシータグを含む分類にアクセス制御を適用します。

分類の作成

分類を作成するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者ロールが必要です。

コンソール

  1. Google Cloud コンソールで [ポリシータグの分類] ページを開きます。

    [ポリシータグの分類] ページを開く

  2. [分類の作成] をクリックします。
  3. [新しい分類] ページで次の操作を行います。

    1. [分類名] に、作成する分類の名前を入力します。
    2. [説明] に、説明を入力します。
    3. 必要に応じて、[プロジェクト] に表示されているプロジェクトを変更します。
    4. 必要に応じて、[場所] に表示されている場所を変更します。
    5. [ポリシータグ] に、ポリシータグの名前と説明を入力します。
    6. ポリシータグの子ポリシータグを追加するには、[サブタグを追加] をクリックします。
    7. 別のポリシータグと同じレベルに新しいポリシータグを追加するには、[+ ポリシータグを追加] をクリックします。
    8. 必要に応じて、分類にポリシータグと子ポリシータグをさらに追加します。
    9. ポリシータグの階層の作成が完了したら、[作成] をクリックします。

API

既存の分類を使用するには、次の手順の最初の 2 つのステップの代わりに taxonomies.import を呼び出します。

  1. taxonomies.create を呼び出して分類を作成します。
  2. taxonomies.policytag.create を呼び出してポリシータグを作成します。

ポリシータグに権限を設定する

分類を作成するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者ロールが必要です。

コンソール

  1. Google Cloud コンソールで [ポリシータグの分類] ページを開きます。

    [ポリシータグの分類] ページを開く

  2. 関連するポリシータグを含む分類の名前をクリックします。

  3. ポリシータグを 1 つ以上選択します。

  4. [情報パネル] が表示されていない場合は、[情報パネルを表示] をクリックします。

  5. 情報パネルに、選択したポリシータグのロールとプリンシパルが表示されます。ポリシータグを作成および管理するアカウントに、ポリシータグ管理者のロールを追加します。列レベルのアクセス制御で保護されたデータにアクセスするアカウントにきめ細かい読み取りのロールを追加します。また、このパネルを使用して、アカウントからのロールの削除や、他の権限の変更を行うことができます。

  6. [保存] をクリックします。

API

taxonomies.policytag.setIamPolicy を呼び出して、プリンシパルに適切なロールを割り当てることで、ポリシータグへのアクセス権を付与します。

ポリシータグを列に設定する

ポリシータグを設定するユーザーまたはサービス アカウントには、datacatalog.taxonomies.get 権限と bigquery.tables.setCategory 権限が必要です。datacatalog.taxonomies.get は、Data Catalog ポリシータグ管理者とプロジェクト閲覧者のロールに含まれています。bigquery.tables.setCategory は、BigQuery 管理者(roles/bigquery.admin)ロールと BigQuery データオーナー(roles/bigquery.dataOwner)ロールに含まれています。

Google Cloud コンソールで組織内のすべてのプロジェクトのタクソノミーとポリシータグを表示するには、resourcemanager.organizations.get 権限が必要です。この権限は、組織閲覧者のロールに含まれています。

コンソール

Google Cloud コンソールを使用してスキーマを変更し、ポリシータグを設定します。

  1. Google Cloud コンソールで [BigQuery] ページを開きます。

    [BigQuery] ページに移動

  2. BigQuery Explorer で、更新するテーブルを見つけて選択します。そのテーブルのテーブル スキーマが開きます。

  3. [スキーマを編集] をクリックします。

  4. [現在のスキーマ] 画面でターゲット列を選択し、[ポリシータグを追加] をクリックします。

  5. [ポリシータグを追加] 画面で、列に適用するポリシータグを選択します。

  6. [選択] をクリックします。画面は次のようになります。

    スキーマを編集

  7. [保存] をクリックします。

bq

  1. ローカル ファイルにスキーマを書き込みます。

    bq show --schema --format=prettyjson \
       project-id:dataset.table > schema.json

    ここで

    • project-id は、プロジェクト ID です。
    • dataset は、更新しているテーブルを含むデータセットの名前です。
    • table は、更新するテーブルの名前です。
  2. schema.json を変更して、列にポリシータグを設定します。policyTagsnames フィールドの値には、ポリシータグのリソース名を使用します。

    [
     ...
     {
       "name": "ssn",
       "type": "STRING",
       "mode": "REQUIRED",
       "policyTags": {
         "names": ["projects/project-id/locations/location/taxonomies/taxonomy-id/policyTags/policytag-id"]
       }
     },
     ...
    ]
  3. スキーマを更新します。

    bq update \
       project-id:dataset.table schema.json

API

既存のテーブルの場合は tables.patch を呼び出し、新しいテーブルの場合は tables.insert を呼び出します。渡した Table オブジェクトの schema プロパティを使用して、スキーマ定義でポリシータグを設定します。ポリシータグの設定方法については、コマンドラインのサンプル スキーマを参照してください。

既存のテーブルを操作する場合は、tables.patch メソッドの方が適切です。tables.update メソッドはテーブル リソース全体を置き換えるからです。

列にポリシータグを設定するその他の方法

ポリシータグは次の場合にも設定できます。

  • bq mk を使用してテーブルを作成するとき。テーブルの作成に使用するスキーマを渡します。
  • bq load を使用してデータをテーブルに読み込むとき。テーブルを読み込むときに使用するスキーマを渡します。

スキーマに関する一般的な情報については、スキーマの指定をご覧ください。

アクセス制御の適用

アクセス制御の適用を有効または無効にするには、次の手順を使用します。

アクセス制御を適用するには、データポリシーを作成する必要があります。これは、Google Cloud コンソールを使用してアクセス制御を適用する場合に行われます。BigQuery Data Policy API を使用してアクセス制御を適用する場合は、データポリシーを明示的に作成する必要があります。

アクセス制御を適用するユーザーまたはサービス アカウントには、BigQuery 管理者のロールまたは BigQuery データオーナーのロールが必要です。また、Data Catalog 管理者ロールまたは Data Catalog 閲覧者ロールのいずれかも必要です。

コンソール

アクセス制御を適用するには、次の手順を行います。

  1. Google Cloud コンソールで [ポリシータグの分類] ページを開きます。

    [ポリシータグの分類] ページを開く

  2. 列レベルのアクセス制御を適用する分類をクリックします。

  3. [アクセス制御を適用] がまだオンになっていない場合は、[アクセス制御を適用] をクリックして有効にします。

アクセス制御の適用(有効になっている場合)を停止するには、[アクセス制御を適用] をクリックして切り替えます。

分類のいずれかのポリシータグにデータポリシーが関連付けられている場合は、アクセス制御の適用を停止する前に、分類内のすべてのデータポリシーを削除する必要があります。BigQuery Data Policy API を使用してデータポリシーを削除する場合は、dataPolicyTypeDATA_MASKING_POLICY のデータポリシーをすべて削除する必要があります。詳細については、データポリシーを削除するをご覧ください。

API

アクセス制御を適用するには、create を呼び出して dataPolicyType フィールドが COLUMN_LEVEL_SECURITY_POLICY に設定されている DataPolicy リソースに渡します。

アクセス制御が有効になっている場合、その適用を停止するには、分類に関連付けられているデータポリシーを削除します。これを行うには、そのデータポリシーの delete メソッドを呼び出します。

分類のいずれかのポリシータグにデータポリシーが関連付けられている場合、分類内のすべてのデータポリシーを最初に削除しない限り、アクセス制御の適用を停止できません。詳細については、データポリシーを削除するをご覧ください。

ポリシータグを使用する

このセクションでは、ポリシータグを表示、変更、削除する方法について説明します。

ポリシータグを表示する

分類用に作成したポリシータグを表示するには、次の操作を行います。

  1. Google Cloud コンソールで [ポリシータグの分類] ページを開きます。

    [ポリシータグの分類] ページを開く

  2. ポリシータグを表示する分類をクリックします。[分類] ページに、分類内のポリシータグが表示されます。

スキーマ内のポリシータグを表示する

テーブル スキーマの検証時に、テーブルに適用されたポリシータグを表示できます。スキーマを表示するには、Google Cloud コンソール、bq コマンドライン ツール、BigQuery API、クライアント ライブラリを使用します。スキーマの表示方法の詳細については、テーブル情報の取得をご覧ください。

ポリシータグの権限を表示する

  1. Google Cloud コンソールで [ポリシータグの分類] ページを開きます。

    [ポリシータグの分類] ページを開く

  2. 関連するポリシータグを含む分類の名前をクリックします。

  3. ポリシータグを 1 つ以上選択します。

  4. [情報パネル] が表示されていない場合は、[情報パネルを表示] をクリックします。

  5. 情報パネルに、選択したポリシータグのロールとプリンシパルが表示されます。

ポリシータグの権限を更新する

分類を作成するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者ロールが必要です。

コンソール

  1. Google Cloud コンソールで [ポリシータグの分類] ページを開きます。

    [ポリシータグの分類] ページを開く

  2. 関連するポリシータグを含む分類の名前をクリックします。

  3. ポリシータグを 1 つ以上選択します。

  4. [情報パネル] が表示されていない場合は、[情報パネルを表示] をクリックします。

  5. 情報パネルに、選択したポリシータグのロールとプリンシパルが表示されます。ポリシータグを作成および管理するアカウントに、ポリシータグ管理者のロールを追加します。列レベルのアクセス制御で保護されたデータにアクセスするアカウントにきめ細かい読み取りのロールを追加します。また、このパネルを使用して、アカウントからのロールの削除や、他の権限の変更を行うことができます。

  6. [保存] をクリックします。

API

taxonomies.policytag.setIamPolicy を呼び出して、プリンシパルに適切なロールを割り当てることで、ポリシータグへのアクセス権を付与します。

ポリシータグのリソース名を取得する

ポリシータグを列に適用するには、ポリシータグのリソース名が必要です。

ポリシータグのリソース名を取得するには:

  1. ポリシータグを含む分類のポリシータグを表示します。

  2. リソース名をコピーするポリシータグを見つけます。

  3. [ポリシータグのリソース名をコピー] アイコンをクリックします。

    リソース名をコピーします。

ポリシータグを消去する

テーブル スキーマを更新して、列からポリシータグを消去します。Google Cloud コンソール、bq コマンドライン ツール、BigQuery API メソッドを使用して、列からポリシータグを消去できます。

コンソール

[現在のスキーマ] ページの [ポリシータグ] で、[X] をクリックします。

ポリシータグを消去します。

bq

  1. スキーマを取得してローカル ファイルに保存します。

    bq show --schema --format=prettyjson \
       project-id:dataset.table > schema.json

    ここで

    • project-id は、プロジェクト ID です。
    • dataset は、更新しているテーブルを含むデータセットの名前です。
    • table は、更新するテーブルの名前です。
  2. schema.json を変更して、列からポリシータグを消去します。

    [
     ...
     {
       "name": "ssn",
       "type": "STRING",
       "mode": "REQUIRED",
       "policyTags": {
         "names": []
       }
     },
     ...
    ]
  3. スキーマを更新します。

    bq update \
       project-id:dataset.table schema.json

API

tables.patch を呼び出し、schema プロパティを使用して、スキーマ定義のポリシータグを消去します。ポリシータグの消去方法については、コマンドラインのサンプル スキーマを参照してください。

tables.update メソッドはテーブル リソース全体を置き換えるため、tables.patch メソッドの方が適切です。

ポリシータグを削除する

分類内の 1 つ以上のポリシータグを削除するか、分類とそれに含まれるすべてのポリシータグを削除できます。ポリシータグを削除すると、適用先の列との関連付けが自動的に削除されます。

データポリシーが関連付けられているポリシータグを削除すると、データポリシーが削除されるまで最大で 30 分かかることがあります。すぐに削除したい場合は、データポリシーを直接削除できます。

分類内の 1 つ以上のポリシータグを削除するには、次の手順を行います。

  1. Google Cloud コンソールで [ポリシータグの分類] ページを開きます。

    [ポリシータグの分類] ページを開く

  2. 削除するタグを含む分類の名前をクリックします。
  3. [編集] をクリックします。
  4. 削除するポリシータグの横にある をクリックします。
  5. [保存] をクリックします。
  6. [確認] をクリックします。

分類全体を削除する手順は次のとおりです。

  1. Google Cloud コンソールで [ポリシータグの分類] ページを開きます。

    [ポリシータグの分類] ページを開く

  2. 削除するタグを含む分類の名前をクリックします。
  3. [ポリシーの分類を削除] をクリックします。
  4. 分類名を入力して、[削除] をクリックします。

列レベルのアクセス制御を使用してデータにクエリを実行する

ユーザーにデータセットへのアクセス権があり、Data Catalog のきめ細かい読み取りのロールがある場合は、列データを使用できます。ユーザーは通常どおりクエリを実行します。

ユーザーがデータセットにアクセスできるものの、Data Catalog のきめ細かい読み取りのロールがない場合、列データを使用できません。そのようなユーザーが SELECT * を実行した場合、ユーザーがアクセスできない列を示すエラーが表示されます。このエラーを解決する方法は次のとおりです。

  • クエリを変更し、アクセスできない列を除外します。たとえば、ユーザーが ssn 列にはアクセスできないものの残りの列にはアクセスできる場合、次のクエリを実行できます。

    SELECT * EXCEPT (ssn) FROM ...

    上記の例では、EXCEPT 句で ssn 列を除外しています。

  • ユーザーを関連データクラスに対して Data Catalog のきめ細かい読み取りのロールを持つものとして追加するよう、Data Catalog 管理者に依頼します。エラー メッセージには、ユーザーがアクセスする必要があるポリシータグの完全な名前が表示されます。

よくある質問

BigQuery の列レベルのセキュリティはビューに対して機能しますか?

はい。ビューは、基になるテーブルから派生します。保護されている列にビューを介してアクセスする場合、テーブルと同じ列レベルのアクセス制御が適用されます。

BigQuery には、論理ビューと承認済みビューの 2 種類があります。どちらのタイプのビューもソーステーブルから派生しており、どちらもテーブルの列レベルのセキュリティが適用されます。

列レベルのアクセス制御は STRUCT 列または RECORD 列で機能しますか?

はい。ポリシータグはリーフ フィールドにのみ適用でき、それらのフィールドのみが保護されます。

レガシー SQL と GoogleSQL の両方を使用できますか?

列レベルのアクセス制御で保護されているテーブルには、GoogleSQL を使用してクエリを実行できます。

ターゲット テーブルにポリシータグがある場合、レガシー SQL クエリはすべて拒否されます。

クエリは Cloud Logging に記録されますか?

ポリシータグのチェックは Logging に記録されます。詳細については、監査ロギングの列レベルのアクセス制御をご覧ください。

テーブルのコピーは列レベルのアクセス制御の影響を受けますか?

はい。アクセスできない列はコピーできません。

次の操作は、列レベルの権限を確認して行われます。

新しいテーブルにデータをコピーすると、ポリシータグは自動的に反映されますか?

ほとんどの場合、反映されません。クエリの結果を新しいテーブルにコピーしても、新しいテーブルに自動的にポリシータグが割り当てられることはありません。そのため、新しいテーブルには列レベルのアクセス制御はありません。Cloud Storage にデータをエクスポートする場合も同様です。

例外は、テーブルコピー ジョブを使用する場合です。テーブルコピー ジョブはデータ変換を適用しないため、ポリシータグは自動的に宛先テーブルに反映されます。

列レベルのアクセス制御は Virtual Private Cloud と互換性がありますか?

はい。列レベルのアクセス制御と VPC には互換性があり、補完的です。

VPC は IAM を利用して、BigQuery や Cloud Storage などのサービスへのアクセスを制御します。列レベルのアクセス制御により、BigQuery 自体の個々の列できめ細かいセキュリティを実現できます。

ポリシータグとデータポリシーに VPC を適用して、列レベルのアクセス制御と動的データ マスキングを行うには、境界で次の API を制限する必要があります。

トラブルシューティング

Data Catalog のロールが表示されない

Data Catalog のきめ細かな読み取りのロールが表示されない場合は、プロジェクトで Data Catalog API が有効になっていない可能性があります。Data Catalog API を有効にする方法については、始める前にをご覧ください。Data Catalog API を有効にしてから数分後に、Data Catalog のロールが表示されます。

[分類] ページが表示されない

[分類] ページを表示するには、追加の権限が必要です。たとえば、Data Catalog のポリシータグ管理者のロールは、[分類] ページにアクセスできます。

ポリシータグを適用したが、動作していないように見える

アクセス権のないアカウントのクエリ結果がまだ表示される場合は、そのアカウントがキャッシュ内の結果を受信している可能性があります。具体的には、以前にクエリの実行に成功しその後ポリシータグを適用した場合、クエリ結果キャッシュから結果を取得している場合があります。デフォルトでは、クエリ結果は 24 時間キャッシュされます。結果キャッシュを無効にすると、クエリはすぐに失敗します。キャッシュ保存の詳細については、列レベルのアクセス制御の影響をご覧ください。

一般に、IAM の更新の反映には 30 秒ほどの時間がかかります。ポリシータグ階層の変更が反映されるまでには、最大で 30 分ほどかかる場合があります。

列レベルのセキュリティが適用されたテーブルから読み取る権限がない

組織、フォルダ、プロジェクト、ポリシータグなどのさまざまなレベルで、きめ細かい読み取りロールまたはマスクされた取りロールが必要です。きめ細かい読み取りロールは元データへのアクセスを許可し、マスクされた読み取りロールはマスクされたデータへのアクセスを許可します。IAM のトラブルシューティングを使用して、プロジェクト レベルでこの権限を確認できます。