G-gen のminです。BigQuery のデータマスキング機能を解説します。データマスキングを使うと、機密情報をマスキングして特定できない形でクエリ結果に表示させることができ、分析を阻害せずにデータを保護することができます。

データマスキングとは
概要
BigQuery のデータマスキングとは、BigQuery テーブルの特定の列に対して、ユーザーの権限に応じてデータをマスクして表示する機能です。
ポリシータグと呼ばれるタグをテーブルの列に付与することで、誰が機密情報に直接アクセスできるか、あるいはマスクされた状態でアクセスできるか、またマスキングをどのように行うかを定義します。この機能により、分析を阻害せずにデータを保護することができます。
列レベルのアクセス制御との違い
BigQuery で特定の列を保護する他の機能として、列レベルのアクセス制御があります。
列レベルのアクセス制御とデータマスキングの主な違いは、「権限がない場合にエラーにするか、マスクして見せるか」という点です。
| 比較項目 | 列レベルのアクセス制御 | データマスキング |
|---|---|---|
| 主な目的 | 特定の列へのアクセス自体を制限する | アクセスを許可しつつ、値を加工してマスクする |
| 権限がない場合の挙動 | クエリに含めるとエラー(Access Denied)になる | 値がマスクされて表示される |
| 分析への影響 | クエリ自体が実行できない | マスクされた状態で集計や結合が可能 |
| 主なユースケース | 閲覧を完全に禁止すべき極めて機密性の高い情報 | 個人の特定は避けつつ、統計分析には利用したい情報 |
列レベルのアクセス制御では、権限のないユーザーが機密情報の列を含むクエリを実行するとエラーになります。
一方、データマスキングを使用すると、権限のないユーザーでもクエリ自体は成功させつつ、データの値をハッシュ値や NULL、あるいは「XXXX」のように、別の文字列に置き換えて表示させることができます。
仕組み
データマスキングは、以下のように設定されます。

- 分類(Taxonomy)とポリシータグの作成
分類はデータの意味的な区分を表すコンテナです。この分類の中に、「個人情報」「機密情報」など複数のポリシータグを定義できます。各ポリシータグには IAM ロールを直接紐づけることが可能です。 - データポリシーの作成
ポリシータグに対して、「どのようなマスキングルールを適用するか」と「どのプリンシパルに適用するか」を定義します。 - テーブル列への適用
テーブルの列にポリシータグを紐付けます。
ポリシーが適用された列へクエリが実行されると、クエリ実行時に以下のように動的に表示結果に反映されます。
- タグに紐づく IAM ポリシーが評価される
- 対象ユーザーのロールが確認される
- 必要に応じてマスキングルールが適用される
権限とロール
データマスキングの挙動は、ユーザーが持つ IAM ロールによって決定されます。主に以下の2つのロールが関係します。
| ロール名 | ID | 権限の内容 |
|---|---|---|
| きめ細かい読み取り | roles/datacatalog.categoryFineGrainedReader | 元のマスクされていない生データを閲覧できる。 |
| マスクされた読み取り | roles/bigquerydatapolicy.maskedReader | マスクされたデータを閲覧できる。 |
ユーザーが上記のどちらの権限も持っていない場合、Access Denied エラーとなり、クエリは失敗します。
マスキングルールの種類
定義済みルール
データポリシーには、以下の定義済みのマスキングルールを適用できます。
| ルール名 | 動作概要 | 適用可能なデータ型 |
|---|---|---|
| ハッシュ(SHA-256) | 値を SHA-256 でハッシュ化して表示します。同じ値は常に同じハッシュ値になる(決定論的である)ため、JOIN のキーとして利用可能です。 | STRING, BYTES |
| メールマスク | メールアドレスの@ の前を XXXXX に置き換えます(例: XXXXX@gmail.com)。無効な形式の場合は SHA-256 ハッシュ化されます。 |
STRING |
| 先頭/末尾 4 文字 | 先頭または末尾の 4 文字のみを表示し、残りを XXXXX に置き換えます。文字列が短い場合は SHA-256 ハッシュ化されます。 |
STRING |
| 年月日マスク | 日付をその年の1月1日に切り詰めます(例: 2026-02-14 → 2026-01-01)。 |
DATE, DATETIME, TIMESTAMP |
| デフォルトのマスキング値 | データ型に応じたデフォルト値を返します。 | 全ての型 |
| NULL 化 | NULL を返します。データ型自体もマスクしたい場合に使用します。 |
全ての型 |
| ランダムハッシュ | 読み取りごとに一意のソルトを自動生成して非決定論的にハッシュ化します。同じ値でもクエリごとに結果が変わるため、セキュリティ強度は高いですが、異なるクエリ間での JOIN はできません。ポリシータグでは使用できず、列に直接付与するデータポリシーで使用できます | STRING, BYTES |
カスタムマスキングルーチン
定義済みのマスキングルールの他に、ユーザー定義関数を使用して、独自のマスキングロジックを作成することも可能です。例えば、「電話番号の下4桁だけを表示する」「特定の辞書に基づいて置換する」といった高度な要件に対応できます。
ただし、STRUCT 型には対応していません(STRUCT の中の各フィールドに対しては適用可能です)。
ルールの優先順位

1つのポリシータグに対して、複数のデータポリシーを設定することが可能です。ユーザーが複数のグループに所属している場合など、複数のルールが同時に適用されるユースケースでは、以下の優先順位に従って、最も具体的で有用性の高いルールが優先されます。
- カスタムマスキングルーチン
- ランダムハッシュ
- ハッシュ(SHA-256)
- メールマスク
- 末尾 4 文字
- 先頭 4 文字
- 年月日マスク
- デフォルトのマスキング値
- NULL 化
例えば、あるユーザーに対して「ハッシュ」の権限と「NULL 化」の権限の両方が与えられている場合、優先度の高い「ハッシュ」が適用されます。
設定手順
- 参考 : Mask column data
分類とポリシータグの作成
Google Cloud コンソールの BigQuery > ポリシータグ を選択します。

分類(Taxonomy)とポリシータグを作成します。


データポリシーの作成
作成したポリシータグを選択し、データポリシーを管理を選択します。

「マスキングルール」と「対象のプリンシパル(ユーザーやグループ)」を指定します。

指定されたプリンシパルに roles/bigquerydatapolicy.maskedReader ロールが付与されます。
テーブル列へのタグ付け
BigQuery のテーブルスキーマ編集画面 > Add policy tag を選択して、対象の列にポリシータグを付与します。

データポリシーの列への直接付与
別の設定手順として、ポリシータグを作成せずに、データポリシーをテーブルの列に直接紐付けることができます。
ただし2026年2月現在、この設定方法は Preview です。また2026年2月現在、コンソール画面からの設定操作はできず、SQL を実行するか、REST API へのリクエストによって設定します。
この設定方法を使う場合は、いくつかの制約事項がありますので、使用の際は必ず公式ドキュメントを確認してください。
以下に、SQL を使った設定操作を紹介します。 CREATE TABLE または ALTER TABLE ステートメントを使用し、OPTIONS 句でデータポリシーを指定します。
データポリシーの作成
-- 例: データポリシー「ハッシュ(SHA-256)」のマスキングを東京リージョンに作成 CREATE DATA_POLICY `your-project-id.region-asia-northeast1.test_direct_masking_policy` OPTIONS( data_policy_type="DATA_MASKING_POLICY", masking_expression="SHA256" );
テーブル列へのポリシー適用
-- 例: 既存の列にデータポリシーを適用する ALTER TABLE `your-project-id.your-dataset.your-table` ALTER COLUMN email SET OPTIONS ( data_policies=[ "{'name':'your-project-id.region-asia-northeast1.test_direct_masking_policy'}" ]);
制約と注意点
互換性のない機能
- レガシー SQL
サポートされていません。GoogleSQL を使用する必要があります。 - ワイルドカードテーブル
ワイルドカードを使用したクエリでは、参照されるすべてのテーブルのすべての列に対して、生データの閲覧権限「きめ細かい読み取り」が必要です。 - パーティション/クラスタ化列
パーティションまたはクラスタ化キーとして設定されている列に対してデータマスキングを適用した場合、その列を含むクエリはサポートされません。 - テーブルのコピー
テーブルコピーを行うには、ソーステーブルの全列に対する生データの閲覧権限が必要です。
SQL で利用する際の注意点
マスクされた列を SQL の WHERE 句などで使用する場合、挙動に注意が必要です。
SHA-256 ハッシュなどの決定的なマスキング(同じ入力に対して常に同じ結果が返るもの)では、等価比較(=)や GROUP BY による集計は機能しますが、大小比較(> や <)や LIKE 検索は元の値に基づいた結果にならないため、意味をなしません。
コストへの影響
オンデマンドでの BigQuery の料金はスキャンしたデータ量に基づきます。データマスキングで「NULL 化」や「デフォルトのマスキング値」が適用される場合、その列のデータはスキャンされず、課金対象のバイト数が削減される場合があります。
一方、ハッシュ化などの計算を伴うマスキングの場合、通常通りのスキャン料金が発生します。
セキュリティの考慮事項
SHA-256 ハッシュは決定論的であるため、ブルートフォース攻撃に対して脆弱になる可能性があります。攻撃者が元の値のリストを持っている場合、それらをハッシュ化して比較することで、元の値を推測できる可能性があります。
より高いセキュリティが必要な場合は、NULL 化やデフォルトマスキングルール、あるいは非決定論的なハッシュ化を行うランダムハッシュなど別のマスキング方法を検討してください。ただし、前述のとおり、ランダムハッシュは列に直接データポリシーを付与する場合にのみ使用できます(2026年2月現在、Preview)。
佐々木 愛美 (min) (記事一覧)
クラウドソリューション部 データアナリティクス課。2024年7月 G-gen にジョイン。G-gen 最南端、沖縄県在住。最近覚えた島言葉は、「マヤー(猫)」。