case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

BigQueryの個人情報にポリシータグによるカラムレベルのアクセス制御を適用したまま、利用者にマスクしたカラムの閲覧権限を与える方法

本記事はZOZOテクノロジーズ #1 Advent Calendar 2020 - Qiita 25日目の記事です。本記事ではBigQueryにある個人情報に対してカラムレベルのアクセス制御を行うポリシータグを付与したまま、利用者にマスク処理したカラムの閲覧権限を与える方法についてご紹介できればと思います。

ポリシータグとマスク処理したカラムの相性

BigQuery内の個人情報はポリシータグを付与してカラムレベルのアクセス制御をしています。ポリシータグはBigQueryでカラムレベルのアクセス制御を実現します。権限のないユーザはオーナーであってもクエリを実行することはできません。クエリを実行するにはDatacatalogの「きめ細かい読み取り権限」が必要になります。クエリを実行する際は対象のカラムを取り除き、次のようにしてクエリを実行する必要があります。

SELECT
  * EXCEPT(secret_columns)
FROM
  DATASET.TABLE

ポリシータグを付与することで権限のないユーザは個人情報を閲覧できなくなりますが、誕生月や住所を丸めたマスクしたカラムは閲覧できるようにする必要がありました。


これまでのデータ基盤はETL方式を採用しており、データ転送の過程で個人情報などはマスク処理し、そのほかのカラムも必要に応じて加工していました。これからはデータ基盤でデータレイクとしての役割を担えるようETLからELT方式にリプレイスしようとしています。

ELTで個人情報など元データは残したままBigQueryへ転送します。ここで問題になって来るのが個人情報をマスク処理したデータを閲覧したい場合です。ELT方式では利用者がビューでデータを加工する想定でしたが、ポリシータグを付与するとそもそも対象のカラムにアクセスできないのでデータ加工もできなくなってしまうのです。

cloud.google.com

検討案と対策

ポリシータグによるカラムレベルのアクセス制御を適用したまま、利用者にマスクしたカラムの閲覧権限を付与するために対応策を検討してみました。検討案と対応策についてご紹介します。

検討案1:ポリシータグと承認済みビューを併用する

ポリシータグと承認済みビューの併用してマスク済みカラムを閲覧できるようにする案です。承認済みビューを使うとテーブルにアクセス権限がないユーザでも承認済みビューからであればテーブルのデータを閲覧できます。そのため、ポリシータグの権限がないユーザでも承認済みビューからであれば閲覧できるのではないかと考えました。

試してみたところ、ポリシータグは例外で、Datacatalogの「きめ細かい読み取り権限」が付与されてないユーザは承認済みビューからであっても対象のカラムを閲覧することができませんでした。承認済みビューとポリシータグの関係は次のようになっています。
f:id:casekblog:20201221231747p:plain

qiita.com

検討案2:ポリシータグをやめて、マスク済みカラムを閲覧できるビューを作る

ポリシータグをやめて、データセットレベルで権限を制御しビューからマスク済みカラムを閲覧できるようにする
データセットレベルでアクセス制御を行い、ユーザから元テーブルの閲覧権限を取り除きます。デメリットとして、元テーブルを参照できなくなるのでテーブルのプレビューできなくなります。

「SELECT * FROM TABLE LIMIT 100」のようにして確認する必要があります。利用者にとって使い勝手が悪く、もしBigQueryをオンデマンドで使っていた場合、カラム単位で全件スキャンしてしまうのでコスト面で懸念があります。また、ポリシータグを廃止することで、個人情報がみたい場合はテーブルの個人情報は全て見ることができてしまいます。例えば住所だけみたい場合でも、名前や誕生日も閲覧できてしまいます。

検討案3:マスク処理したテーブルを新しく作る

マスク処理したテーブルを別途作りマスク済みのカラムを閲覧できるようにします。ロードしたテーブルとは別に個人情報ををマスクした値を適用したテーブルを作る案です。この方法だとポリシータグと併用はでき、データ基盤でデータレイクの役割は担える一方で、テーブルの実体が増えるので管理が煩雑になってしまいます。

検討案4:元テーブルにマスク済みのカラムを新しく追加する

これは元のデータは残したままテーブルにマスクしたカラムを追加する案です。この方法であれば元データは残し、カラムレベルのアクセス制御を行った状態のまま利用者にマスクしたカラムを閲覧させることができます。

採用案

検討案4を採用しました。この方法であればポリシータグによるカラムレベルのアクセス制御を提供したまま、利用者にマスク済みのカラムの閲覧権限を付与できます。
データ基盤の利用者や運用者、個人情報のセキュリティの観点でも最適に思いました。一点、マスク済みのカラムを追加するとオンプレのスキーマを同期済みのData Catalogとの相性が気になりますが、Data Catalogのタグテンプレートを使ってどういった役割(マスク等)を担うカラムなのか識別できるようにすれば問題ないように思います。
Data Catalogを使ったデータ基盤のカラム追従については次の記事に書いたので良かったら読んでみてください。
www.case-k.jp

まとめ

ポリシータグによるカラムレベルのアクセス制御を適用したまま、利用者にマスクしたカラムの閲覧権限を与える方法をご紹介しました。個人情報を含むテーブルに対してマスクしたカラムを新しく追加することで、ポリシータグとの併用が実現でき、利用者や運用者、セキュリティ面でも安全な運用が実現できるのではないかと思います。