2024.10.07 コラム
Analytics Hub で VPC Service Controls を使ってデータセットをセキュアに共有してみる

DataCurrent の金子です。Analytics Hub で VPC Service Controls を使ってデータセットを共有する方法を試してみました。
Analytics Hub で VPC Service Controls を利用することで、以下のようなメリットが期待できます。
- 隔離された環境でのみ、機密情報を含むデータセットを管理できる
- 一般のメンバーではアクセスできないプロジェクト配下のデータセットをセキュアに共有できる
例えば、機密情報や個人情報を含むデータセットなどを管理する際、厳しいセキュリティ要件から、オフィスの非常に限られたネットワークのみアクセス可能にしたい場合があります。そのような場合は VPC Service Controls で、特定の IP アドレスのみアクセスを許可することで、セキュアな環境を構築することができます。
しかしながら、この方法のデメリットは一般のメンバーもアクセスできないため、分析などの用途では利用できなってしまうことです。BigQuery では行レベルや列レベルのアクセス制御があるため、適切な処置を施したデータであれば、データを共有したいというケースもあるでしょう。
そのような場合には、Analytics Hub を利用することで、セキュアな環境でデータを管理しながら、同時に分析メンバーへ安全に共有することが可能です。
検証内容
今回はセキュアなプロジェクト( S プロジェクトとします)で、疑似的な個人情報を含むデータセットを作成し、このデータを別の分析用プロジェクト( A プロジェクトとします)に共有する方法を試してみました。
疑似的なデータセットは name
列に 山田太郎
とだけ入っているテーブルデータを用意しました。このデータを SHA 256 で動的にハッシュ化するよう設定し、A プロジェクトで name
列を直接見ることなくハッシュ化された状態でクエリ可能にすることを目指します。
※ VPC Service Controls や BigQuery のデータ マスキング機能に関しては、今回の記事では詳しく説明しません。詳細は公式ドキュメントをご参照ください。
以下は、最終的なアーキテクチャです。VPC Service Controls の設定内容を理解するために、リクエストの流れを把握しておくとよいでしょう。

事前準備
まずは S プロジェクトにサービス境界を設定して、セキュアな環境を構築します。Access Context Manager で検証に利用可能な固定 IP アドレスでアクセスレベルを定義し、VPC Service Controls で Access Levels
として紐づけました。VPC Service Controls の初期状態は以下の通りです。現時点では、Ingress と Egress は何も設定していないことに注意してください。

次に先ほど登録した IP アドレスを使って 同じ S プロジェクトにアクセスし、confidential
というデータセットを作成します。このデータセット配下に masked_data
というテーブル名で先ほどのデータを格納しました。
このテーブルの name
列にポリシータグを設定し、S プロジェクト上でクエリしてハッシュ化された結果が返されることを確認します。

ここまでで S プロジェクトは、限られたネットワークからのみアクセス可能であり、疑似的な個人情報が適切に処置された状態になりました。
Analytics Hub でリスティングする
S プロジェクトでデータセットを共有設定していきます。
1 エクスチェンジの作成
東京リージョンに S プロジェクト
という名前でエクスチェンジを作成します。公開範囲は限定公開です。

2-1 リスティングの作成 (1)
S プロジェクトの confidential
データセットを共有データセットに指定します。

2-2 リスティングの作成 (2)
confidential_demo
という名前でリスティングを作成します。その他のオプション機能はデフォルトのままで作成しました。

VPC Service Controls で Analytics Hub のサブスクライブを許可する
Analytics Hub 上で S プロジェクトをサブスクライブするには VPC Service Controls で Egress rules を設定する必要があります。
※ 詳しい仕様は、公式ドキュメントの Analytics Hub VPC Service Controls のルール をご参照ください。
また、公式のドキュメントには記述を見つけられませんでしたが、今回はすべてのユーザー、すべてのプロジェクトに対し、以下の 3 つの API が必要なようです。
Analytics Hub API
:サブスクライブ時に必要のようです。BigQuery API
:共有データセットを A プロジェクトに作成する際に Dataset を作成するのに必要みたいです。後述。BigQuery Data Policy API
:テーブルに設定されているポリシータグの動作に必要みたいです。後述。

Analytics Hub でリスティングをサブスクライブする
S プロジェクト上で、confidential_demo
を A プロジェクトでサブスクライブさせます。

動作確認
A プロジェクト上で、confidential_demo
がリンク済みデータセットとして表示されていることを確認します。このデータセットをクエリし、name
列がハッシュ化されていることを確認できれば成功です。以下は、実際にクエリした様子です。クエリ時は、 A プロジェクトのみアクセス可能で BigQuery Admin ロールが付与されたユーザーを使用しました。

よくあるエラー・不明点
サブスクライブ時に Failed to create linked dataset.
以下のエラー文が表示された場合は、VPC Service Controls の Egress rules で少なくとも Analytics Hub API と BigQuery API が許可されていることを確認しましょう。解決しない場合は、VPC Service Controls でその他の設定が間違っている可能性があります。VPC Service Controls Troubleshooter で確認してみましょう。
Operation failed, please try again. Error message: VPC Service Controls: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: xxx.
クエリ時に Access Denied: BigQuery
以下のエラー文が表示された場合は、VPC Service Controls で BigQuery Data Policy API が許可されていない可能性があります。
Access Denied: BigQuery BigQuery: User has neither fine-grained reader nor masked get permission to get data protected by policy tag "pii : user_name" on column xxxxx.confidential_demo.masked_data.name.
それでも解決しない場合は、事前準備の状態で S プロジェクトでクエリ可能か確認してみましょう。
データマスキングが利用可能なエディション問題
これはエラー文と関係ありませんが、BigQuery をオンデマンド料金で利用している場合はドキュメントの以下の記述が気になります。
一覧表示されたテーブルに行レベルのセキュリティ ポリシーまたはデータ マスキング ポリシーが設定されている場合、サブスクライバーがリンク済みデータセットに対してクエリジョブを実行するには、サブスクライバーが Enterprise または Enterprise Plus を購入している必要があります。
2024/9/18 の検証時点では、パブリッシャー、サブスクライバー双方がオンデマンド料金の契約形態であってもデータ マスキングは利用できるようでした。
まとめ
今回は Analytics Hub と VPC Service Controls を使って、セキュアな環境からデータを共有する方法を試してみました。セキュリティ要件が厳格なケースなどで、この検証が少しでもお役に立てれば幸いです。
最後に
自社に専門人材がいない、リソースが足りない等の課題をお持ちの方に、エンジニア領域の支援サービス(Data Engineer Hub)をご提供しています。 お困りごとございましたら是非お気軽にご相談ください。
【本件に関するお問い合わせ先】
DataCurrent 広報
E-mail:info@datacurrent.co.jp