Cloud DLPにドッグフーディング

Cloud DLP を使用した大規模なデータセットにおける PII の匿名化と再識別
参照:https://cloud.google.com/architecture/de-identification-re-identification-pii-using-cloud-dlp?hl=ja

Cloud Data Loss Prevention(Cloud DLP)を使用して、個人情報(PII)などのセンシティブ データを匿名化する自動データ変換パイプラインを作成する方法をまとめる。
Cloud DLP では、削除、マスキング、トークン化、バケット化などの方法で匿名化を行うことが可能。

リファレンス アーキテクチャ
- データ匿名化ストリーミング パイプライン: Dataflow を使用してテキスト内のセンシティブ データを匿名化します。このパイプラインは、複数の変換やユースケースで再利用できます。
- 構成(DLP テンプレートと鍵)の管理: 匿名化方法と暗号鍵を公開しないように、少数のユーザー グループ(セキュリティ管理者など)のみがアクセスできるマネージドの匿名化構成で構成されます。
- データ検証と再識別のパイプライン: 匿名化されたデータのコピーを検証し、Dataflow パイプラインを使用して大規模なデータの再識別を行います。

保存時の暗号化: Cloud Storage
GCPでは、保存されているデータをデフォルトで暗号化している。Cloud Storage バケットにアップロードされたオブジェクトはGoogle が管理する暗号鍵で暗号化される。
転送中の暗号化: Dataflow
転送中のデータの暗号化方法は保存時と異なります。転送中データは、転送時の暗号化という安全なネットワーク プロトコルによって保護されている。デフォルトの設定では、Dataflow は Google が管理する暗号鍵を使用。

Cloud DLP データ変換
Cloud DLP で行われる変換には主に 2 つのタイプ
レコード変換
レコード変換(RecordTransformations オブジェクト)は、特定の infoType と識別された表形式データ内の値にのみ適用されます。RecordTransformations には、さらに 2 つのサブカテゴリがあります。
- fieldTransformations[]: さまざまなフィールド変換を適用する変換。
- recordSuppressions[]: 完全に抑止されるレコードを定義するルール。recordSuppressions[] 内で抑止ルールに一致するレコードは、出力から除外されます。
infoType 変換
リクエストごとに 1 つ以上の infoType 変換を指定できます。各 InfoTypeTransformation オブジェクトに、次の両方を指定します。
- 変換を適用する 1 つ以上の infoType(infoTypes[] 配列オブジェクト)
- プリミティブ変換(PrimitiveTransformation オブジェクト)

匿名化プロセスを複雑な順に示すと、次のようになります。
- 削除: 機密性の高いコンテンツを置換せずに削除します。
- マスキング: 機密性の高いコンテンツを特定の文字で置き換えます。
- 暗号化: 機密性の高いコンテンツを暗号化された文字列で置き換えます。

変換タイプの決定
- 双方向トークン化: 元のデータを確定的なトークンに置き換え、参照整合性を維持します。 トークンを使用してデータの結合や集計分析を行うことができます。
- 確定的暗号化(DE): 元のデータを base64 エンコードの暗号化された値に置き換え、元の文字セットや長さを保持しません。
- FFX によるフォーマット保持暗号化(FPE-FFX): FFX モードのフォーマット保持暗号化を使用して生成されたトークンで元のデータを置き換えます。認証と初期化ベクトルがないため、出力トークンが長くなる可能性があります。従長さや文字セットの保持が必ずしも必要でない場合には、DE など、より強力なセキュリティを提供する方法をおすすめします。
- 暗号ハッシュを使用した一方向のトークン化: 元の値をハッシュ値で置き換え、参照整合性を維持します。 ただし、双方向トークン化とは異なり、この方法ではデータを元に戻すことはできません。ハッシュ値は、入力値に SHA-256 ベースのメッセージ認証コード(HMAC-SHA-256)を使用して生成されます。
- マスキング: 指定した文字で元のデータを部分的または完全に置換します。
- バケット化: 識別しやすい値を識別しにくい値で置き換えます。
- 置換: 元のデータをトークンまたは infoType の名前(検出された場合)で置き換えます。

方法の選択
最適な匿名化方法はユースケースによって異なります。たとえば、従来のアプリで匿名化されたレコードを処理している場合は、形式の保持が重要になります。 厳密にフォーマットされた 10 桁の数値を扱う場合、FPE を使用すると、入力の長さ(10 桁)と文字セット(数値)を保持できます。
ただし、Card Holder's Name 列の値のように、従来のフォーマットを厳密に維持する必要ない場合は、より強力な認証方法である DE をおすすめします。FPE と DE は、トークンの復元またはトークン化の解除を行うことができます。トークン化の解除が必要ない場合は、暗号ハッシュを使用すると整合性が維持されます。ただし、トークンを元に戻すことはできません。
完全な整合性を維持する必要のない値に対しては、マスキング、バケット化、日付シフト、置換などの方法が適しています。たとえば、年齢の値(例: 27)を年齢層(20〜30)にバケット化しても、個人の特定につながる可能性があります。

アーキテクチャ
- JDBC を使用してリレーショナル データベースからデータを抽出する。
- データベースの LIMIT 句を使用してレコードをサンプリングする。
- Cloud DLP API を使用してレコードを処理し、機密カテゴリを識別する。
- 結果を BigQuery テーブルと Data Catalog に保存する。
sample-and-identify パイプラインは、次のファイルを Cloud Storage に出力します。
- ソースのスキーマの Avro スキーマ(同等)
- 各入力列(PERSON_NAME、PHONE_NUMBER、STREET_ADDRESS)の検出した infoTypes データ

目標
- Data Catalog タグとエンティティ グループを作成する
- サンプリングと識別のパイプラインをデプロイする
- カスタム Data Catalog エンティティを作成する
- カスタム Data Catalog エンティティに機密タグを適用する
- 機密タグのデータも BigQuery に存在することを確認する

以下作業

セットアップ

sampling-and-identify パイプラインを実行する
サンプリングと Cloud DLP 識別のパイプラインは、次の順序で次のタスクを実行します。
- 指定されたソースからレコードを抽出します。たとえば、Cloud DLP の識別メソッドではフラットなテーブルのみをサポートしており、パイプラインは Avro、Parquet、または BigQuery のレコードをネストしています。これらのレコードには、ネストされたフィールドと繰り返しフィールドを含めることが可能です。
- null 値や空の値を除く、必要なサンプルの個々の列をサンプリングします。
- Cloud DLP を使用して、サンプルをバッチ処理で Cloud DLP で許容されるバッチサイズ(500 KB 未満、50,000 値未満)にして、機密 infoTypes データを識別します。
- 後で参照するためにレポートを Cloud Storage と BigQuery に書き込みます。
- タグ テンプレートとエントリ グループ情報を指定すると、Data Catalog エンティティが作成されます。この情報を指定すると、パイプラインは Data Catalog 内のエントリ用の機密タグを適切な列に対して作成します。

上記の方法は失敗
{
insertId: "1trgmlrcdih"
labels: {4}
logName: "projects/hybrid-chess-379402/logs/dataflow.googleapis.com%2Fjob-message"
receiveTimestamp: "2023-05-30T07:12:45.982203534Z"
resource: {2}
severity: "ERROR"
textPayload: "Failed to start the VM, launcher-2023053000122812280768720064269652, used for launching because of status code: UNAVAILABLE, reason: One or more operations had an error: 'operation-1685430749838-5fce3ed233be2-43afc5a9-f5105bb6': [UNAVAILABLE] 'HTTP_503'.."
timestamp: "2023-05-30T07:12:44.317955461Z"
}

テンプレートから作成する試み
Data Masking/Tokenization from Cloud Storage to BigQuery (using Cloud )

こちらも失敗、
{
insertId: "1ohrzb9a3"
labels: {4}
logName: "projects/hybrid-chess-379402/logs/dataflow.googleapis.com%2Fjob-message"
receiveTimestamp: "2023-05-30T07:49:09.810502402Z"
resource: {2}
severity: "ERROR"
textPayload: "Workflow failed. Causes: Project hybrid-chess-379402 has insufficient quota(s) to execute this workflow with 5 instances in region us-central1. Quota summary (required/available): 5/24 instances, 20/24 CPUs, 4150/4096 disk GB, 0/500 SSD disk GB, 1/100 instance groups, 1/50 managed instance groups, 1/100 instance templates, 5/8 in-use IP addresses.
Please see https://cloud.google.com/compute/docs/resource-quotas about requesting more quota."
timestamp: "2023-05-30T07:49:08.185699259Z"
}