🦑

BigQuery でカスタム マスキング ルーチンが使えるようになりました

2023/12/06に公開

こんにちは!クラウドエース株式会社 データ 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 と同じように作ることができますが、次の点に注意する必要があります。

  • OPTIONSdata_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

作成された UDF は上記の通りです。
「データ ガバナンスの種類」に DATA_MASKING が設定されています。

データポリシーを設定する

事前に準備していたポリシータグ(今回は「secret」という名前)に、データポリシーを設定します。

マスキングルール一覧

データポリシーの設定画面でマスキングルールを選ぶことができますが、一覧の中に先ほど作った UDF が表示されています。

データポリシー一覧

上記のようにデータポリシーを設定しました。
データポリシーを 2 つ作っています。

  1. no-access ユーザーに対しては、「null 化」(BigQuery のプリセットの一つ)でマスキングをする
  2. 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 文字列などをビジネスの要件に合わせて柔軟にマスクする、などいろいろな活用方法がありそうです。

また、列データのマスキング機能を実際に触ってみたのは初めてだったのですが、とても便利だなと思いました!

脚注
  1. 2023/12/05 現在、以下の関数がサポートされています。
    REGEXP_REPLACE
    FARM_FINGERPINT
    MD5
    SHA1
    SHA256
    SHA512
    CAST
    CONCAT ↩︎

Discussion