BigQuery の列レベルのセキュリティによるアクセス制限

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

このページの手順には、BigQuery と Data Catalog の両方が使用されます。料金については、次のトピックをご覧ください。

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

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

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

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

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

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

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

    API を有効にする

  5. 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、 BigQuery API を有効にします。

    API を有効にする

    にアクセスします。

役割の付与

ポリシータグを管理するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが必要です。列レベルのセキュリティで保護されたデータに対してクエリを実行するユーザーまたはサービス アカウントには、Data Catalog きめ細かい読み取りのロールが必要です。以下のセクションでは、これらのロールを付与する方法について説明します。

これらのロールの概要については、列レベルのセキュリティで使用するロールをご覧ください。

ポリシータグ管理者のロールを付与する

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

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

    [IAM] ページを開く

  2. ロールを付与するユーザーのメールアドレスがリストにある場合は、そのメールアドレスを選択して [編集](鉛筆アイコン)をクリックします。ユーザーのメールアドレスがリストにない場合は、プロジェクトにユーザーを追加してから次の手順に進みます。

  3. [権限の編集] ページで、[別のロールを追加] をクリックします。

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

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

このロールの詳細については、列レベルのセキュリティで使用されるロールをご覧ください。

きめ細かい読み取りのロールを付与する

列レベルのセキュリティで保護されたデータにアクセスする必要があるユーザーには、Data Catalog のきめ細かい読み取りのロールを付与します。次の手順を実行するには、きめ細かい読み取りのロールをユーザーに付与するプロジェクトに対する resourcemanager.projects.setIamPolicy 権限が必要です。resourcemanager.projects.setIamPolicy 権限がない場合は、この権限を付与してもらうか、自分の代わりに次の手順を実行してもらうようプロジェクト オーナーに依頼してください。

  1. Cloud Console で IAM ページを開きます。

    [IAM] ページを開く

  2. ロールを付与するユーザーのメールアドレスがリストにある場合は、そのメールアドレスを選択して [編集](鉛筆アイコン)をクリックします。ユーザーのメールアドレスがリストにない場合は、プロジェクトにユーザーを追加してから次の手順に進みます。

  3. [権限の編集] ページで、[別のロールを追加] をクリックします。

  4. [データカタログ] をクリックし、[きめ細かい読み取り] をクリックします。

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

このロールの詳細については、列レベルのセキュリティで使用されるロールをご覧ください。

分類を作成する

Data Catalog を使用して分類を作成し、データのポリシータグを追加します。

次の手順を行うユーザー アカウントには、Data Catalog ポリシータグ管理者のロールが必要です。

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

    分類ページを開く

  2. [分類の作成] をクリックします。

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

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

      以下に、[新しい分類] ページの例を示します。

      分類の作成ページ

    8. 必要に応じて、分類にポリシータグと子ポリシータグをさらに追加します。

    9. ポリシータグの階層の作成が完了したら、[保存] をクリックします。

ポリシータグを表示する

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

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

    分類ページを開く

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

    ポリシータグ

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

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

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

    分類ページを開く

  2. 権限を割り当てるポリシータグが含まれる分類をクリックします。

  3. 権限を割り当てるポリシータグをクリックします。

    選択したポリシータグ

  4. 右側のパネルに、選択したポリシータグのメンバーと権限が表示されます。

    ポリシータグの権限

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

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

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

    分類ページを開く

  2. 権限を更新するポリシータグが含まれる分類をクリックします。

  3. 権限を更新するポリシータグをクリックします。

    選択したポリシータグ

  4. 右側のパネルに、選択したポリシータグのメンバーと権限が表示されます。ポリシータグを作成、管理するアカウント用のポリシータグ管理者のロールにアカウントを追加します。列レベルのセキュリティで保護されたデータにアクセスするアカウント用のきめ細かい読み取りのロールにアカウントを追加します。このパネルを使用して、アカウントの削除や、他の権限の変更もできます。

  5. 完了したら、[保存] をクリックします。

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

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

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

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

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

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

    リソース名をコピー

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

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

Console

Cloud Console で BigQuery ウェブ UI を使用してスキーマを変更するには、スキーマの編集時にポリシータグを設定します。

  1. [現在のスキーマ] 画面で列を選択し、[ポリシータグを追加] をクリックします。
  2. [ポリシータグを追加] 画面で、列に適用するポリシータグを選択します。
  3. [選択] をクリックします。画面は次のようになります。

    スキーマを編集

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

または、Cloud Console で BigQuery ウェブ UI を使用してテーブルを作成するスキーマを変更する際、スキーマをテキストとして編集するときにポリシータグを設定します。

  1. [スキーマ] で [テキストとして編集] をクリックします。
  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 を呼び出し、schema プロパティを使用して、スキーマ定義にポリシータグを設定します。ポリシータグの設定方法については、コマンドラインのサンプル スキーマを参照してください。

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

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

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

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

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

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

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

列レベルのセキュリティでデータをクエリする

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

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

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

    SELECT * EXCEPT (ssn) FROM ...
    

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

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

ポリシータグの消去

テーブル スキーマを更新して、列からポリシータグを消去します。Cloud Console の BigQuery ウェブ UI、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. Cloud Console で Data Catalog の分類ページを開きます。

    分類ページを開く

  2. 列レベルのセキュリティを適用する分類をクリックします。

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

アクセス制御をオフにする

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

    分類ページを開く

  2. 列レベルのセキュリティをオフにする分類をクリックします。

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

よくある質問

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

はい。ビューは、基になるテーブルから派生します。テーブルと同じ列レベルのセキュリティが、保護された列にビューでアクセスするときに適用されます。

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

列レベルのセキュリティは STRUCT 列または RECORD 列で機能しますか?

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

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

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

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

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

IAM ポリシータグのチェックは 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 分ほどかかる場合があります。