列レベルのアクセス制御をBigQueryで試す

2024.01.29

データベース内の特定の列へのアクセスを制限するために列レベルのアクセス制御を使用することがあります。

アクセス制御が必要とされる状況はいくつかありますが、主に以下のような場合が挙げられていました。

  • 機密情報の保護: 特定の列に機密性の高い情報(例えば、社会保障番号、クレジットカード番号、医療記録など)が含まれている場合、その情報に対するアクセスを制限するために列レベルのアクセス制御が使用されます。
  • データのセグメンテーション: 組織内の異なる部門やチームが同じデータベースを使用しているが、特定のデータに対するアクセスを部門間で制限したい場合に使用されます。
  • 法的要件の遵守: 特定の業界や国では、データ保護に関する法律や規制があり、それに従って特定の種類のデータへのアクセスを制限する必要があります。
  • ユーザーの役割に基づくアクセス制御: 組織内のユーザーには異なる役割があり、それぞれの役割に応じてアクセスするべきデータの範囲が異なる場合に、列レベルのアクセス制御を使用して適切なアクセス権を設定します。
  • データの整合性と品質の維持: 特定の列に含まれるデータを編集することができるユーザーを限定することで、データの整合性や品質を維持するために列レベルのアクセス制御が用いられることがあります。
  • 監査と追跡のため: 特定の列へのアクセスを監査や追跡が必要な場合、アクセス制御を設定してどのユーザーがいつどのデータにアクセスしたかを記録することができます。

今回ですが、実際に実務で使っているBigQueryでの機密情報の保存、セグメンテーションの観点から、列レベルのアクセス制御を試していきたいと思います。

方法

列レベルでデータアクセスを制限するには

  1. 分類階層とポリシータグを定義します
    • データの分類とポリシータグを作成して管理します。
  2. BigQuery 列にポリシータグを割り当てます
    • BigQuery ではスキーマ アノテーションを使用して、アクセスを制限する列ごとにポリシータグを割り当てます。
  3. 分類階層にアクセス制御を適用します
    • アクセス制御を適用すると、分類階層内のすべてのポリシータグに対して定義されたアクセス制限が適用されます。
  4. ポリシータグへのアクセス権を管理します。
    • Identity and Access Management(IAM)ポリシーを使用して、各ポリシータグへのアクセスを制限します。ポリシーは、ポリシータグに属する列ごとに有効です。

分類階層とポリシータグを定義

ポリシータグのベストプラクティスを参考にし、定義していきます。

ドキュメントにあるように、組織には次のようなデータクラスに分類することがあります。

例) PIIデータ, 財務データ, 顧客の注文履歴

使用しているデータがどのようなものなのかを分類していく必要があります。

ポリシータグはツリー構造にまとめることができます。他のすべてのポリシータグを含むルート ポリシー タグを作成すると便利な場合があります。 例えば、以下のような感じでティアリストに分ける などができるのではないでしょうか。

ここでは sec_tier1, sec_tier2, sec_tier3 といった感じのポリシータグに分け、その下に各項目別のポリシータグをぶら下げています。

分類とポリシータグを作成

ポリシータグを管理するには、Google Cloud Data Catalog APIを有効にする必要があります。

有効にした後、コンソールのBigQueryメニューにあるポリシータグで作成していきます。

ここでは、センシティブなデータをティア1, ティア2というグループに分けて管理したいとします。

まずは分類を作成する必要があります。

※ ポリシータグを階層に整理することができるコンテナです

分類を決めた後、ポリシータグを定義していきます。

リーフノードとしてティア1の下に以下のようにポリシータグを作成することもできます

BigQuery列にポリシータグを割り当て

割り当てには BigQuery Data Policy API を有効にする必要があります。

作成した分類とポリシータグの管理ページで、アクセス制御の適用のトグルをONにします。

BigQueryのコンソールでテーブルを選択肢、現在のスキーマ ページで対象のフィールドを選択し、Add Policy Tag をクリックします。

先ほど作成したポリシータグから選択して割り当てることが可能になっていました。

保存後。カラム一覧では上記のようにポリシータグが割り当てられていることがわかります。

必要なカラム分、この割り当てを行っていきます。

ポリシータグのついたデータにアクセスする

元データにアクセスするには、ポリシータグに対する「きめ細かい読み取り」のロールがプリンシパルに必要です。タグ付けされた BigQuery 列に格納されているマスクされたデータにアクセスするには、データポリシーに対する「マスクされた読み取り」のロールがプリンシパルに必要です。

このような制限がかかるので、データにアクセスできるユーザーやサービスアカウントを決めて、権限を割り当てする必要があります。

権限がついていないと,読み取りを行った時に以下のようなエラーでアクセスできませんでした。

Access Denied: BigQuery BigQuery: User has neither fine-grained reader nor masked get permission to get data protected by policy tag "ビジネスクリティカル : email" on column {テーブル名とカラム名}

作成したポリシータグの分類以下のもの全てに許可を与えるには、

コンソールのポリシータグのページで、権限パネルを表示というリンクが右上にあるのでクリックし、プリンシパルの追加を行います。

読み取り許可を与えたいユーザーやサービスアカウントに対して、 データカタログのきめ細かい読み取り を設定しましょう。

分類以下のポリシータグ個別でも同じように設定が可能です。

これでデータの読み取りが可能となります。

この制御は、テーブル(ワイルドカード テーブルを含む)/ビュー/テーブルのコピー に適用されます。