列レベルのアクセス制御でアクセスを制限する

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

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

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

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

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

準備

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  4. Data Catalog and BigQuery Data Policy API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  7. Data Catalog and BigQuery Data Policy API を有効にします。

    API を有効にする

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

    BigQuery API を有効にします。

    API を有効にする

ロールと権限

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

  • ポリシータグを管理するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが必要です。ポリシータグ管理者のロールは、分類とポリシータグを管理できます。また、ポリシータグに関連付けられた IAM ロールを付与または削除できます。
  • 列レベルのアクセス制御にアクセス制御を適用するユーザーまたはサービス アカウントには、BigQuery 管理者または BigQuery データオーナーのロールが必要です。BigQuery のロールでは、分類にアクセス制御を適用するためのデータポリシーを管理できます。

  • 列レベルのアクセス制御で保護されているデータに対してクエリを実行するユーザーまたはサービス アカウントには、そのデータにアクセスするための Data Catalog のきめ細かい読み取りのロールが必要です。

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

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

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

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

  1. Google Cloud Console の [IAM] ページに移動します。

    [IAM] ページを開く

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

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

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

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

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

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

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

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

  1. Google Cloud Console の [IAM] ページに移動します。

    [IAM] ページを開く

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

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

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

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

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

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

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

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

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

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

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

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

分類の作成

Data Catalog を使用して、データと一緒に使用するポリシータグの分類を作成します。

分類を作成するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが付与されている必要があります。

Console

  1. 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 を使用して、データと一緒に使用するポリシータグの分類を作成します。

分類を作成するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが付与されている必要があります。

Console

  1. Cloud Console で Data Catalog の [分類] ページを開きます。

    分類ページを開く

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

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

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

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

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

API

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

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

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

Console

Cloud Console を使用してスキーマを変更し、ポリシータグを設定します。

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

    BigQuery ページに移動

  2. BigQuery Explorer で、更新するテーブルを探します。そのテーブルのテーブル スキーマが開きます。

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

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

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

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

    スキーマを編集

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

または、Cloud コンソールを使用してテーブルを作成する場合、スキーマをテキストとして編集するときにポリシータグを設定できます。

Console の手順に沿って、スキーマを手動で指定します。手順 7 でオプション 2 を選択し、指定されたスキーマの列に必要なポリシータグをすべて含めます。policyTagsnames フィールドの値には、ポリシータグのリソース名を使用します。

テキストとして編集

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 を使用してデータをテーブルに読み込むとき。テーブルを読み込むときに使用するスキーマを渡します。

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

アクセス制御の適用

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

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

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

Console

アクセス制御を適用する手順は次のとおりです。

  1. Cloud Console で Data Catalog の [分類] ページを開きます。

    分類ページを開く

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

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

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

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

API

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

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

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

ポリシータグを使用する

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

ポリシータグを検索する

Data Catalog でポリシータグを検索する手順は次のとおりです。

  1. Data Catalog のホームページを開き、[検索] フィールドからデータアセットを検索します。

    Data Catalog のホームページを開く

Data Catalog のポリシータグなどのアセットを検索する詳しい方法については、データアセットの検索方法をご覧ください。

ポリシータグを表示する

分類用に作成したポリシータグを表示するには:

  1. Cloud Console で Data Catalog の [分類] ページを開きます。

    [分類] ページを開く

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

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

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

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

  1. Cloud Console で Data Catalog の [分類] ページを開きます。

    分類ページを開く

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

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

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

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

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

Data Catalog を使用して、データと一緒に使用するポリシータグの分類を作成します。

分類を作成するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが付与されている必要があります。

Console

  1. Cloud Console で Data Catalog の [分類] ページを開きます。

    分類ページを開く

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

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

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

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

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

API

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

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

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

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

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

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

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

    リソース名をコピー

ポリシータグを消去する

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

Console

[現在のスキーマ] ページの [ポリシータグ] で、[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. Cloud Console で Data Catalog の [分類] ページを開きます。

    分類ページを開く

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

分類全体を削除するには、次の手順を実行します。

  1. Cloud Console で Data Catalog の [分類] ページを開きます。

    分類ページを開く

  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 と標準 SQL の両方を使用できますか?

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

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

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

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

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

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

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

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

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

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

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

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

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

トラブルシューティング

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

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

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

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

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

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

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