こんにちは。SCSKの山口です。
今回は、BigQuery の、様々なレベルでのアクセス制御についてまとめます。
BigQuery のアクセス制御
BigQuery では、下記のレベルでのアクセス制御が可能です。
- リソースレベル
- データセット
- テーブル
- データレベル
- 列
- 行
公式ドキュメントには「データレベル」というワードありませんが、わかりやすくするために使用しています。
図式化すると以下の通りです。
アクセス制御が実装されているBigQuery では、ユーザは目的のデータ(宝石)を入手するために各レベルに設定されたアクセス制御を潜り抜ける必要があります。
もちろん、アクセス制御がされていない場合もあります。
今回のブログ(その①)では、リソースレベルでのアクセス制御について詳しく見ていきます。
リソースレベルのアクセス制御
前述しましたが、ここでいう「リソース」はデータセット/テーブルを指します。
下記方法で設定することが可能です。
- IAMを使用したアクセス制御
- 承認によるアクセス制御
- VPC Service Controlsを使用する
- タグを使用する
- IAM Conditionsを使用する
IAMを使用したアクセス制御
IAMを使用してBigQuery のアクセス制御を実装する場合は、下記のロールが必要です。
- BigQuery データオーナー(roles/bigquery.dataOwner)
既に実装されているアクセス制御については、下記手順で、コンソール上で確認することができます。
新たにアクセス権を付与する場合もコンソール上での操作が可能です。
- (上記と同様の手順)
- (上記と同様の手順)
- 「プリンシパルを追加」をクリック
- 「新しいプリンシパル」欄にプリンシパルを入力
- 「ロールを選択」リストで付与するロールを選択
- 「保存」をクリック
承認によるアクセス制御
VPC Service Controlsを使用する
VPC Service Controls の詳細については下記ドキュメントをご参照ください。
BigQuery で VPC Service Controls を使用することで、データアクセスとデータの引き出しを制限することができます。
タグを使用する
事前に作成したタグを使用し、リソースにタグが付いているかどうかに基づいて条件付きでポリシーを適用する方法です。
タグはKey-Value ペアとして構成されるリソースで、組織リソースまたはプロジェクトリソース配下に作成することができます。詳細は下記をご参照ください。
タグを使用することで、例えば下記のような運用・制御が可能です。
[前提]
- 組織を管理している
- 組織内のデータアナリストはすべてグループ「analysts@example.com 」のメンバ
- アナリストはプロジェクト「userData」に対して「BigQuery データ閲覧者IAMロール」を持つ
- アナリストのインターンの学生が一名入ってきた
[やりたいこと]
- インターンの学生にはuserData プロジェクトの 「anonymousData」 データセットを表示する権限のみを付与したい
[実現方式]
- 「anonymousData」 データセットにタグを付与する
- インターン生のIAM(もしくはサービスアカウント)の「BigQuery データ閲覧者IAMロール」に対してタグの条件を追加する
(公式ドキュメント内の例を参考にしています。)
この方法に関しては、後ほど実践したいと思います。
IAM Conditionsを使用する
この方法では、指定された条件が満たされた場合のみBigQuery リソースへのアクセスを認可できます。
IAM Conditions は、プロジェクト、フォルダ、組織レベルでサポートされ、BigQuery データセット、テーブル、ルーティン、モデルに適用できます。
次の属性に基づいた設定が可能です。
属性 | 概要 | 値 |
request.time | ユーザがBigQuery リソースへアクセスした時刻 | – |
resource.name | BigQuery リソースのパス | projects/PROJECT_ID/datasets/DATASET_ID
projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID |
resource.type | BigQuery リソースのタイプ | bigquery.googleapis.com/Dataset(Table) |
resource.service | BigQuery リソースが使用するGoogle Cloud サービス | bigquery.googleapis.com |
resource.tags | BigQuery リソースに付加されたタグ | – |
具体的な実践は今回は省きますが、タグの使用でも説明した「IAMの条件を追加」から設定することが可能です。
[例:request.time]
実践1:IAMを使用したアクセス制御
IAMを使ってアクセス制御してみます。
以降はAdminとMemberでアカウントを分けて進めます。
Admin:データセット+テーブル作成
下記データセットとテーブルを作成します。
- データセット:yamaguchi_test_acctrl
- テーブル:test1,test2
次に、AdminのBigQueryで、test1テーブルの権限の共有で下記を設定します。
- プリンシパル:shXXXXX@XXXX(MemberのGoogleアカウントのアドレス)
- ロール:BigQuery データ閲覧者
Member:テーブル確認
Admin側で共有設定をする前は、test1.test2テーブルともに閲覧ができない状態でした。
Adminでtest1テーブルの共有設定を行うと、
test1テーブルのみ閲覧することができるようになりました。
実践2:タグを使用したアクセス制御
次に、同じことをタグを使って実現してみます。
今度はtest2テーブルに対する閲覧許可を実装します。
Admin:タグ作成+付与
まず、タグを作成します。
次に、test2テーブルに作成したタグを付与します。
- 「詳細」タブから「詳細を編集」
- タグの「スコープの選択」でプロジェクトを選択し、作成したタグ情報を入力
Admin:IAMの条件を追加
権限付与対象のプリンシパルの「BigQuery データ閲覧者」ロールに、下記IAMの条件を追加します。
- 条件タイプ:タグ
- 演算子:値IDがある
- キーID:tagKeys/281476642126196(タグ値詳細画面の「親キー」)
- 値ID:tagValues/281483470283076(タグ値詳細画面の「タグ値ID」)
Member:テーブル確認
Admin側でタグ設定をする前は、test2テーブルが閲覧できない状態でした。
タグとIAMの設定完了後にtest2テーブルを再度確認すると、
test2テーブルも閲覧可能になりました。
まとめ
今回はBigQuery のアクセス制御 その①ということで、リソースレベルのアクセス制御を実践してみました。
本ブログで実践した通り、IAMによる制御と承認(タグ)による制御は共存させることができます。便利ではあるのですが、闇雲に設定してしまうと意図しない認可が発生してしまう恐れもあります。
IAMの設定に関しては下記ドキュメント等のプラクティスに準拠することをお勧めします。
まとめ②では、BigQueryテーブル内の行・列単位のアクセス制御について取り扱います。