列レベルのアクセス制御によるアクセス制限
このページでは、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、デフォルト、またはハッシュされたコンテンツで置換することで、機密データをマスクできます。
準備
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Google Cloud プロジェクトの課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
-
Data Catalog and BigQuery Data Policy API を有効にします。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Google Cloud プロジェクトの課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
-
Data Catalog and BigQuery Data Policy API を有効にします。
- BigQuery は、新しいプロジェクトでは自動的に有効になりますが、既存のプロジェクトで有効にする必要がある場合があります。
BigQuery API を有効にします。
ロールと権限
ユーザーまたはサービス アカウントのポリシータグには、関連するロールがいくつかあります。
- ポリシータグを管理するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが必要です。ポリシータグ管理者のロールは、分類とポリシータグを管理できます。また、ポリシータグに関連付けられた IAM ロールを付与または削除できます。
列レベルのアクセス制御にアクセス制御を適用するユーザーまたはサービス アカウントには、BigQuery 管理者または BigQuery データオーナーのロールが必要です。BigQuery のロールでは、分類にアクセス制御を適用するためのデータポリシーを管理できます。
列レベルのアクセス制御で保護されているデータに対してクエリを実行するユーザーまたはサービス アカウントには、そのデータにアクセスするための Data Catalog のきめ細かい読み取りのロールが必要です。
すべてのポリシータグ関連のロールの詳細については、列レベルのアクセス制御で使用するロールをご覧ください。
Data Catalog のポリシータグ管理者のロール
Data Catalog ポリシータグ管理者のロールは、データポリシー タグを作成、管理できます。
ポリシータグ管理者のロールを付与するには、ロールを付与するプロジェクトに対する resourcemanager.projects.setIamPolicy
権限が必要です。この resourcemanager.projects.setIamPolicy
権限がない場合は、この権限を付与してもらうか、自分の代わりに次の手順を実行してもらうようプロジェクト オーナーに依頼してください。
Google Cloud Console の [IAM] ページに移動します。
ロールを付与するユーザーのメールアドレスがリストにある場合は、そのメールアドレスを選択して [編集](鉛筆アイコン)をクリックします。[別のロールを追加] をクリックします。
ユーザーのメールアドレスがリストにない場合は、[
追加] をクリックし、[新しいプリンシパル] ボックスにメールアドレスを入力します。[役割を選択] プルダウン リストをクリックします。
[データカタログ] をクリックし、[ポリシータグ管理者] をクリックします。
[保存] をクリックします。
BigQuery 管理者のロールとデータオーナーのロール
BigQuery 管理者のロールとデータオーナーのロールは、データポリシーを管理できます。
これらのロールのどちらかを付与するには、ロールを付与するプロジェクトの resourcemanager.projects.setIamPolicy
権限が必要です。この resourcemanager.projects.setIamPolicy
権限がない場合は、この権限を付与してもらうか、自分の代わりに次の手順を実行してもらうようプロジェクト オーナーに依頼してください。
Google Cloud Console の [IAM] ページに移動します。
ロールを付与するユーザーのメールアドレスがリストにある場合は、そのメールアドレスを選択して [編集](鉛筆アイコン)をクリックします。[別のロールを追加] をクリックします。
ユーザーのメールアドレスがリストにない場合は、[
追加] をクリックし、[新しいプリンシパル] ボックスにメールアドレスを入力します。[役割を選択] プルダウン リストをクリックします。
[BigQuery] をクリックしてから、[管理者] または [データオーナー] をクリックします。
[保存] をクリックします。
Data Catalog のきめ細かい読み取りのロール
列レベルのアクセス制御で保護されたデータにアクセスするユーザーには、Data Catalog のきめ細かい読み取りのロールが必要です。このロールは、ポリシータグを構成するときにプリンシパルに割り当てられます。
ポリシータグに対するきめ細かい読み取りのロールをユーザーに付与するには、そのポリシータグの分類を含むプロジェクトに対する datacatalog.taxonomies.setIamPolicy
権限が必要です。datacatalog.taxonomies.setIamPolicy
権限がない場合は、この権限を付与してもらうか、自分の代わりにアクションを実行してもらうようプロジェクト オーナーに依頼してください。
手順については、ポリシータグの権限を設定するをご覧ください。
列レベルのアクセス制御を設定する
次のタスクを完了して、列レベルのアクセス制御を設定します。
- ポリシータグの分類を作成します。
- プリンシパルをポリシータグに関連付け、プリンシパルに Data Catalog のきめ細かい読み取りのロールを付与します。
- ポリシータグと BigQuery テーブル列を関連付けます。
- ポリシータグを含む分類にアクセス制御を適用します。
分類の作成
分類を作成するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが付与されている必要があります。
コンソール
- Google Cloud コンソールで [ポリシータグの分類] ページを開きます。
- [分類の作成] をクリックします。
[新しい分類] ページで次の操作を行います。
- [分類名] に、作成する分類の名前を入力します。
- [説明] に、説明を入力します。
- 必要に応じて、[プロジェクト] に表示されているプロジェクトを変更します。
- 必要に応じて、[場所] に表示されている場所を変更します。
- [ポリシータグ] に、ポリシータグの名前と説明を入力します。
- ポリシータグの子ポリシータグを追加するには、[サブタグを追加] をクリックします。
- 新しいポリシータグを別のポリシータグと同じレベルで追加するには、[+ ポリシータグを追加] をクリックします。
- 必要に応じて、分類にポリシータグと子ポリシータグをさらに追加します。
- ポリシータグの階層の作成が完了したら、[作成] をクリックします。
API
既存の分類を使用するには、次の手順の最初の 2 つのステップの代わりに taxonomies.import
を呼び出します。
taxonomies.create
を呼び出して分類を作成します。taxonomies.policytag.create
を呼び出してポリシータグを作成します。
ポリシータグの権限を設定する
分類を作成するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが付与されている必要があります。
コンソール
Google Cloud コンソールで [ポリシータグの分類] ページを開きます。
関連するポリシータグを含む分類の名前をクリックします。
1 つ以上のポリシータグを選択します。
[情報パネル] が表示されていない場合は、[情報パネルを表示] をクリックします。
情報パネルに、選択したポリシータグのロールとプリンシパルが表示されます。ポリシータグを作成および管理するアカウントに、ポリシータグ管理者のロールを追加します。列レベルのアクセス制御で保護されたデータにアクセスするアカウントにきめ細かい読み取りのロールを追加します。また、このパネルを使用して、アカウントからのロールの削除や、他の権限の変更を行うことができます。
[保存] をクリックします。
API
taxonomies.policytag.setIamPolicy
を呼び出して、プリンシパルに適切なロールを割り当てることで、ポリシータグへのアクセス権を付与します。
ポリシータグを列に設定する
ポリシータグを設定するユーザーまたはサービス アカウントには、datacatalog.taxonomies.get
権限と bigquery.tables.setCategory
権限が必要です。datacatalog.taxonomies.get
は、Data Catalog ポリシータグ管理者とプロジェクト閲覧者のロールに含まれています。bigquery.tables.setCategory
は、Data Catalog 管理者とデータオーナーのロールに含まれています。
コンソール
Google Cloud コンソールを使用してスキーマを変更し、ポリシータグを設定します。
Google Cloud コンソールで [BigQuery] ページを開きます。
BigQuery Explorer で、更新するテーブルを探します。そのテーブルのテーブル スキーマが開きます。
[スキーマを編集] をクリックします。
[現在のスキーマ] 画面でターゲット列を選択し、[ポリシータグを追加] をクリックします。
[ポリシータグを追加] 画面で、列に適用するポリシータグを見つけて選択します。
[選択] をクリックします。画面は次のようになります。
[保存] をクリックします。
bq
ローカル ファイルにスキーマを書き込みます。
bq show --schema --format=prettyjson \ project-id:dataset.table > schema.json
ここで
- project-id は、プロジェクト ID です。
- dataset は、更新しているテーブルを含むデータセットの名前です。
- table は、更新するテーブルの名前です。
schema.json を変更して、列にポリシータグを設定します。
policyTags
のnames
フィールドの値には、ポリシータグのリソース名を使用します。[ ... { "name": "ssn", "type": "STRING", "mode": "REQUIRED", "policyTags": { "names": ["projects/project-id/locations/location/taxonomies/taxonomy-id/policyTags/policytag-id"] } }, ... ]
スキーマを更新します。
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 閲覧者のロールも必要です。
Console
アクセス制御を適用する手順は次のとおりです。
Google Cloud コンソールで [ポリシータグの分類] ページを開きます。
列レベルのアクセス制御を適用する分類をクリックします。
[アクセス制御を適用] がまだオンになっていない場合は、[アクセス制御を適用] をクリックして有効にします。
アクセス制御が有効な場合に停止するには、[アクセス制御を適用] をクリックして制御を切り替えます。
分類内のポリシータグにデータポリシーが関連付けられている場合は、アクセス制御の適用を停止する前に、分類内のすべてのデータポリシーを削除する必要があります。BigQuery Data Policy API を使用してデータポリシーを削除する場合は、dataPolicyType
が DATA_MASKING_POLICY
であるすべてのデータポリシーを削除する必要があります。詳細については、データポリシーの削除をご覧ください。
API
アクセス制御を適用するには、create
を呼び出して dataPolicyType
フィールドが COLUMN_LEVEL_SECURITY_POLICY
に設定されている DataPolicy
リソースに渡します。
アクセス制御が有効な場合に停止するには、分類に関連付けられたデータ ポリシーを削除します。これを行うには、そのデータポリシーの delete
メソッドを呼び出します。
分類内のポリシータグにデータポリシーが関連付けられている場合、分類内のすべてのデータポリシーを削除しないと、アクセス制御の適用を停止できません。詳細については、データポリシーの削除をご覧ください。
ポリシータグを使用する
このセクションでは、ポリシータグを表示、変更、削除する方法を説明します。
ポリシータグを表示する
分類用に作成したポリシータグを表示するには:
Google Cloud コンソールで [ポリシータグの分類] ページを開きます。
ポリシータグを表示する分類をクリックします。[分類] ページに、分類内のポリシータグが表示されます。
スキーマ内のポリシータグを表示する
テーブル スキーマの検証時に、テーブルに適用されたポリシータグを表示できます。スキーマを表示するには、Google Cloud コンソール、bq
コマンドライン ツール、BigQuery API、クライアント ライブラリを使用します。スキーマの表示方法の詳細については、テーブル情報の取得をご覧ください。
ポリシータグの権限を表示する
Google Cloud コンソールで [ポリシータグの分類] ページを開きます。
関連するポリシータグを含む分類の名前をクリックします。
1 つ以上のポリシータグを選択します。
[情報パネル] が表示されていない場合は、[情報パネルを表示] をクリックします。
情報パネルに、選択したポリシータグのロールとプリンシパルが表示されます。
ポリシータグの権限を更新する
分類を作成するユーザーまたはサービス アカウントには、Data Catalog ポリシータグ管理者のロールが付与されている必要があります。
コンソール
Google Cloud コンソールで [ポリシータグの分類] ページを開きます。
関連するポリシータグを含む分類の名前をクリックします。
1 つ以上のポリシータグを選択します。
[情報パネル] が表示されていない場合は、[情報パネルを表示] をクリックします。
情報パネルに、選択したポリシータグのロールとプリンシパルが表示されます。ポリシータグを作成および管理するアカウントに、ポリシータグ管理者のロールを追加します。列レベルのアクセス制御で保護されたデータにアクセスするアカウントにきめ細かい読み取りのロールを追加します。また、このパネルを使用して、アカウントからのロールの削除や、他の権限の変更を行うことができます。
[保存] をクリックします。
API
taxonomies.policytag.setIamPolicy
を呼び出して、プリンシパルに適切なロールを割り当てることで、ポリシータグへのアクセス権を付与します。
ポリシータグのリソース名を取得する
ポリシータグを列に適用するには、ポリシータグのリソース名が必要です。
ポリシータグのリソース名を取得するには:
ポリシータグを含む分類のポリシータグを表示します。
リソース名をコピーするポリシータグを見つけます。
[ポリシータグのリソース名をコピー] アイコンをクリックします。
ポリシータグを消去する
テーブル スキーマを更新して、列からポリシータグを消去します。Google Cloud コンソール、bq
コマンドライン ツール、BigQuery API メソッドを使用して、列からポリシータグを消去できます。
コンソール
[現在のスキーマ] ページの [ポリシータグ] で、[X] をクリックします。
bq
スキーマを取得してローカル ファイルに保存します。
bq show --schema --format=prettyjson \ project-id:dataset.table > schema.json
ここで
- project-id は、プロジェクト ID です。
- dataset は、更新しているテーブルを含むデータセットの名前です。
- table は、更新するテーブルの名前です。
schema.json を変更して、列からポリシータグを消去します。
[ ... { "name": "ssn", "type": "STRING", "mode": "REQUIRED", "policyTags": { "names": [] } }, ... ]
スキーマを更新します。
bq update \ project-id:dataset.table schema.json
API
tables.patch
を呼び出し、schema
プロパティを使用して、スキーマ定義のポリシータグを消去します。ポリシータグの消去方法については、コマンドラインのサンプル スキーマを参照してください。
tables.update
メソッドはテーブル リソース全体を置き換えるため、tables.patch
メソッドの方が適切です。
ポリシータグを削除する
分類内の 1 つ以上のポリシータグを削除できます。また、分類とその中のすべてのポリシータグを削除することもできます。ポリシータグを削除すると、ポリシータグと、そのタグが適用された列との間の関連付けが自動的に削除されます。
データポリシーが関連付けられているポリシータグを削除すると、そのデータポリシーも削除されるまで最大で 30 分かかります。データポリシーを直ちに削除する場合は、直接データポリシーを削除します。
分類内の 1 つ以上のポリシータグを削除するには、次の手順を行います。
- Google Cloud コンソールで [ポリシータグの分類] ページを開きます。
- 削除するタグを含む分類の名前をクリックします。
- [編集] をクリックします。
- 削除するポリシータグの横にある をクリックします。
- [保存] をクリックします。
- [確認] をクリックします。
分類全体を削除するには、次の手順を実行します。
- Google Cloud コンソールで [ポリシータグの分類] ページを開きます。
- 削除するタグを含む分類の名前をクリックします。
- [ポリシーの分類を削除] をクリックします。
- 分類名を入力して [削除] をクリックします。
列レベルのアクセス制御を使用してデータにクエリを実行する
ユーザーにデータセットへのアクセス権があり、Data Catalog のきめ細かい読み取りのロールがある場合は、列データを使用できます。ユーザーは通常どおりクエリを実行します。
ユーザーがデータセットにアクセスできるものの、Data Catalog のきめ細かい読み取りのロールがない場合、列データを使用できません。そのようなユーザーが SELECT *
を実行した場合、ユーザーがアクセスできない列を示すエラーが表示されます。このエラーを解決する方法は次のとおりです。
クエリを変更し、アクセスできない列を除外します。たとえば、ユーザーが
ssn
列にはアクセスできないものの残りの列にはアクセスできる場合、次のクエリを実行できます。SELECT * EXCEPT (ssn) FROM ...
上の例では、
EXCEPT
句でssn
列を除外しています。ユーザーを関連データクラスに対して Data Catalog のきめ細かい読み取りのロールを持つものとして追加するよう、Data Catalog 管理者に依頼します。エラー メッセージには、ユーザーがアクセスする必要があるポリシータグの完全な名前が表示されます。
よくある質問
BigQuery の列レベルのセキュリティはビューに対して機能しますか?
はい。ビューは、基になるテーブルから派生します。テーブルと同じ列レベルのアクセス制御が、保護された列にビューでアクセスするときに適用されます。
BigQuery には、論理ビューと承認済みビューの 2 種類があります。どちらのタイプのビューもソーステーブルから派生しており、どちらもテーブルの列レベルのアクセス制御が適用されます。
列レベルのアクセス制御は STRUCT
列または RECORD
列で機能しますか?
はい。ポリシータグはリーフ フィールドにのみ適用でき、それらのフィールドのみが保護されます。
レガシー SQL と GoogleSQL の両方を使用できますか?
Google SQL を使用して、列レベルのアクセス制御で保護されているテーブルをクエリできます。
ターゲット テーブルにポリシータグがある場合、レガシー SQL クエリはすべて拒否されます。
クエリは Cloud Logging に記録されますか?
ポリシータグのチェックは Logging に記録されます。詳細については、監査ロギングの列レベルのアクセス制御をご覧ください。
テーブルのコピーは、列レベルのアクセス制御の影響を受けますか?
はい。アクセスできない列はコピーできません。
次の操作は、列レベルの権限を確認して行われます。
- 宛先テーブルのある
SELECT
クエリ - テーブルコピー ジョブ
- データ エクスポート ジョブ(たとえば、Cloud Storage などへ)
新しいテーブルにデータをコピーすると、ポリシータグは自動的に反映されますか?
ほとんどの場合、反映されません。クエリの結果を新しいテーブルにコピーしても、新しいテーブルに自動的にポリシータグが割り当てられることはありません。したがって、新しいテーブルには列レベルのアクセス制御がありません。Cloud Storage にデータをエクスポートする場合も同様です。
例外は、テーブルコピー ジョブを使用する場合です。テーブルコピー ジョブはデータ変換を適用しないため、ポリシータグは自動的に宛先テーブルに反映されます。
列レベルのアクセス制御は Virtual Private Cloud と互換性がありますか?
はい。列レベルのアクセス制御と VPC は互換性があり、補完的です。
VPC は IAM を利用して、BigQuery や Cloud Storage などのサービスへのアクセスを制御します。列レベルのアクセス制御は、BigQuery 自体の個々の列のきめ細かなセキュリティを提供します。
ポリシータグに VPC を適用し、列レベルのアクセス制御と動的データ マスキングの VPC ポリシーを適用するには、境界で次の API を制限する必要があります。
トラブルシューティング
Data Catalog のロールが表示されない
Data Catalog のきめ細かな読み取りのロールが表示されない場合は、プロジェクトで Data Catalog API が有効になっていない可能性があります。Data Catalog API を有効にする方法については、始める前にをご覧ください。Data Catalog API を有効にしてから数分後に、Data Catalog のロールが表示されます。
[分類] ページが表示されない
[分類] ページを表示するには、追加の権限が必要です。たとえば、Data Catalog のポリシータグ管理者のロールは、[分類] ページにアクセスできます。
ポリシータグを適用したが、動作していないように見える
アクセス権のないアカウントのクエリ結果がまだ表示される場合は、そのアカウントがキャッシュ内の結果を受信している可能性があります。具体的には、以前にクエリの実行に成功しその後ポリシータグを適用した場合、クエリ結果キャッシュから結果を取得している場合があります。デフォルトでは、クエリ結果は 24 時間キャッシュされます。結果キャッシュを無効にすると、クエリはすぐに失敗するはずです。キャッシュの詳細については、列レベルのアクセス制御の影響をご覧ください。
一般に、IAM の更新の反映には 30 秒ほどの時間がかかります。ポリシータグ階層の変更が反映されるまでには、最大で 30 分ほどかかる場合があります。