BigQuery でカスタム マスキング ルーチンが使えるようになりました
こんにちは!クラウドエース株式会社 データ ML ディビジョン所属の福家です。
クラウドエースの データ ML ディビジョンは、クラウドエースの IT エンジニアリングを担うシステム開発部の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門としています。
データ ML ディビジョンでは活動の一環として、毎週 Google Cloud の新規リリースを調査・発表し、データ領域のプロダクトのキャッチアップをしています。その中でも重要と考えるリリースを本ページ含め記事として公開しています。
今回紹介するリリースは、2023/08/22 に発表された BigQuery の カスタム マスキング ルーチン(Custom masking routines) についてです。
なお、この機能はプレビュー段階になります。
はじめに
BigQuery はビッグデータの分析、分析ができるデータウェアハウスで、 Google Cloud を代表するプロダクトです。
機械学習技術などの発展によって、ビッグデータを使ったシステム開発の需要が高まっていますが、
大規模なデータを「活用すること」と同時に、「機密データを適切に守る」 ことが重要です。
BigQuery のデータマスキング
BigQuery では「列データのマスキング」がサポートされています。
(※ ドキュメントによっては「動的データマスキング(dynamic data masking)」と紹介されています。)
「列データのマスキング」を使うと、データベース上の機密データを 元のデータを変えることなく、アクセス時のコンテキストによって マスキングすることができます。
上の図では、会員情報テーブルの特定の列に「ポリシータグ」をつけていて、タグには 3 つの「データポリシー」を適用しています。
それぞれのポリシーにユーザー(またはグループ)・ロール・マスキングのルール(それぞれ図中の Principal・Role・Data masking rule に対応)を設定しています。
このような設定をすることで、ユーザーごとに適切な権限でデータにアクセスできるようになります。
元のデータを変える必要はなく、また、マスキングの方法や対象ユーザーを変えたい場合はデータポリシーを編集するだけでよいため、管理が簡単で、業務要件の変化にすばやく対応することができます。
「列データのマスキング」について、こちらの過去記事もぜひご覧ください!
BigQueryのDynamic Data Maskingの機能が更新されました
カスタム マスキング ルーチン
前述のマスキングのルールは、BigQuery が用意しているいくつかのロジックの中から選ぶことができますが、
これまでは、BigQuery が用意していない独自のロジックを使ったマスキングルールを設定する、ということができませんでした。
2023/08/22 のリリースで、マスキングのルールに「ユーザー定義関数(以下、UDF)」を適用することができるようになり、ユーザー独自の要件にも対応することができるようになりました。
それが、今回紹介する「カスタム マスキング ルーチン」です。
試してみた
UDF を作る
まず、カスタム マスキング ルーチンで使用する UDF を作成します。
通常の UDF と同じように作ることができますが、次の点に注意する必要があります。
-
OPTIONS
でdata_governance_type="DATA_MASKING"
を指定する必要があります。 - SQL UDF である必要があります(JavaScript UDF は使用できません)。
- UDF の中で使える関数は限られています(
REGEXP_REPLACE
など)。- 2023/10/23 に新しくリリースがあり、使える関数が増えました![1]
他の注意事項は、公式ドキュメント を参照してください。
CREATE OR REPLACE FUNCTION zenn_demo_masking.secret_custom_mask(secret STRING) RETURNS STRING
OPTIONS (data_governance_type="DATA_MASKING") AS (
SAFE.REGEXP_REPLACE(secret, '(^..).*(..$)', '\\1XXXXX\\2')
);
今回は、上記の SQL で UDF を作成しました。
REGEXP_REPLACE
関数を使って、最初の 2 文字と最後の 2 文字以外を XXXXX
で置き換えています。
作成された UDF は上記の通りです。
「データ ガバナンスの種類」に DATA_MASKING
が設定されています。
データポリシーを設定する
事前に準備していたポリシータグ(今回は「secret」という名前)に、データポリシーを設定します。
データポリシーの設定画面でマスキングルールを選ぶことができますが、一覧の中に先ほど作った UDF が表示されています。
上記のようにデータポリシーを設定しました。
データポリシーを 2 つ作っています。
-
no-access
ユーザーに対しては、「null 化」(BigQuery のプリセットの一つ)でマスキングをする -
partial-access
ユーザーに対しては、secret_custom_mask
UDF を使ったカスタムマスキングルーチンでマスキングをする
アクセスを試す
BigQuery テーブルの特定の列(今回は「card_no」列)に「secret」タグを設定し、
「no-access」ユーザーと「partial-access」ユーザーでアクセスして、結果を比較してみます。
# no-access ユーザーで実行
$ bq query --nouse_legacy_sql "SELECT * FROM zenn_demo_masking.demo ORDER BY id"
+----+------+---------+
| id | name | card_no |
+----+------+---------+
| 1 | 佐藤 | NULL |
| 2 | 鈴木 | NULL |
| 3 | 高橋 | NULL |
| 4 | 田中 | NULL |
+----+------+---------+
# partial-access ユーザーで実行
$ bq query --nouse_legacy_sql "SELECT * FROM zenn_demo_masking.demo ORDER BY id"
+----+------+-----------+
| id | name | card_no |
+----+------+-----------+
| 1 | 佐藤 | 41XXXXX11 |
| 2 | 鈴木 | 21XXXXX11 |
| 3 | 高橋 | 51XXXXX11 |
| 4 | 田中 | 31XXXXX11 |
+----+------+-----------+
結果、ユーザーごとに意図した通りのマスキングルールでアクセスできていました 🎉
まとめ
今回は、BigQuery の「カスタム マスキング ルーチン」機能のリリースを紹介しました。
独自のマスキングルールを設定できるようになり、企業固有の要件や複雑な要件にも対応ができるようになりました。
企業独自のフォーマットの ID 文字列などをビジネスの要件に合わせて柔軟にマスクする、などいろいろな活用方法がありそうです。
また、列データのマスキング機能を実際に触ってみたのは初めてだったのですが、とても便利だなと思いました!
-
2023/12/05 現在、以下の関数がサポートされています。
REGEXP_REPLACE
FARM_FINGERPINT
MD5
SHA1
SHA256
SHA512
CAST
CONCAT ↩︎
Discussion