🔒 Google Cloud Data Loss Prevention (DLP)

機密データの検出、分類、マスキングで情報漏洩を防止

📖 DLP APIとは

🎯 概要

Google Cloud DLP(Data Loss Prevention)は、機密データや個人識別情報(PII)を自動的に検出、分類、保護するマネージドサービスです。 クレジットカード番号、社会保障番号、メールアドレスなど、120種類以上の組み込み検出器(InfoType)を提供し、 データの匿名化やマスキングを行うことで、データ漏洩リスクを軽減します。

DLPの基本的な処理フロー

📄
入力データ
テキスト、画像、
テーブル、
ストレージ内ファイル
🔍
検出・分類
機密データを
自動検出
(120+ InfoTypes)
🛡️
保護・変換
マスキング、
匿名化、
暗号化
出力結果
保護された
データ
+ 検出レポート

✨ 主要機能

🔍

機密データの検出(Inspection)

  • 120種類以上の組み込みInfoType
  • カスタムInfoTypeの作成可能
  • 正規表現、辞書、コンテキスト認識
  • テキスト、画像、構造化データに対応
  • ライクリフッド(確信度)スコア
🛡️

データの非識別化(De-identification)

  • マスキング(伏せ字)
  • トークン化(暗号化)
  • リダクション(削除)
  • 置換(ダミー値)
  • バケット化(範囲に丸める)
  • 日付シフト(日付をずらす)
🔄

データの再識別化(Re-identification)

  • 暗号化トークンから元データへ復元
  • Cloud KMSとの統合
  • 厳密なアクセス制御
  • 監査ログの記録
📊

リスク分析

  • k-匿名性の計算
  • l-多様性の評価
  • 再識別リスクの定量化
  • データセットの統計分析

🏷️ 組み込みInfoType(検出器)

📌 InfoTypeとは:

InfoTypeは、DLPが検出できる機密データの種類を定義したものです。 クレジットカード番号、電話番号、メールアドレスなど、120種類以上の組み込みInfoTypeが用意されています。

代表的なInfoType

💳
CREDIT_CARD_NUMBER
4111-1111-1111-1111
🆔
US_SOCIAL_SECURITY_NUMBER
123-45-6789
📧
EMAIL_ADDRESS
user@example.com
📱
PHONE_NUMBER
+1-555-123-4567
🏠
STREET_ADDRESS
123 Main St, Tokyo
🌐
IP_ADDRESS
192.168.1.1
🪪
JAPAN_INDIVIDUAL_NUMBER
マイナンバー
🏦
IBAN_CODE
国際銀行口座番号
🔑
AUTH_TOKEN
APIキー、パスワード
🌍 国・地域別のInfoType:

🛡️ 非識別化の変換手法

主要な非識別化手法

1️⃣ マスキング(Masking)
クレジットカード: 4111-1111-1111-1111
クレジットカード: ****-****-****-1111
一部または全部を「*」で置換
2️⃣ リダクション(Redaction)
顧客名: 山田太郎
メール: yamada@example.com
顧客名: [REDACTED]
メール: [REDACTED]
機密情報を完全削除・置換
3️⃣ 置換(Replacement)
SSN: 123-45-6789
電話: 090-1234-5678
SSN: [SSN]
電話: [PHONE_NUMBER]
InfoTypeラベルで置換
4️⃣ 暗号化トークン化(Crypto-based Tokenization)
顧客ID: CUST-12345
メール: user@example.com
顧客ID: AVc7k2n9pL
メール: 8fK3nQ2zXm
可逆暗号化(再識別化可能)
5️⃣ バケット化(Bucketing)
年齢: 27歳
年収: 5,500,000円
年齢: 25-30歳
年収: 5,000,000-6,000,000円
範囲にグループ化
6️⃣ 日付シフト(Date Shift)
誕生日: 1990-05-15
診察日: 2024-11-20
誕生日: 1990-08-22
診察日: 2024-12-27
日付をランダムにシフト(相対関係は保持)

💻 実装例

1. テキスト内の機密データ検出

from google.cloud import dlp_v2 def inspect_text(project_id, text): # DLPクライアントの初期化 client = dlp_v2.DlpServiceClient() # 検出したいInfoTypeを指定 info_types = [ {"name": "CREDIT_CARD_NUMBER"}, {"name": "EMAIL_ADDRESS"}, {"name": "PHONE_NUMBER"}, {"name": "US_SOCIAL_SECURITY_NUMBER"}, ] # 検査設定 inspect_config = { "info_types": info_types, "min_likelihood": dlp_v2.Likelihood.POSSIBLE, # 最小確信度 "include_quote": True, # 検出された値を含める } # 検査対象のアイテム item = {"value": text} # 親リソースの指定 parent = f"projects/{project_id}" # 検査を実行 response = client.inspect_content( request={ "parent": parent, "inspect_config": inspect_config, "item": item, } ) # 結果の表示 if response.result.findings: for finding in response.result.findings: print(f"InfoType: {finding.info_type.name}") print(f"Likelihood: {finding.likelihood.name}") print(f"Quote: {finding.quote}") print(f"Location: {finding.location.byte_range}") print("-" * 50) else: print("機密データは検出されませんでした") # 使用例 text = """ 顧客情報: 名前: 山田太郎 メール: yamada@example.com 電話: 090-1234-5678 クレジットカード: 4111-1111-1111-1111 SSN: 123-45-6789 """ inspect_text("my-project-id", text)

2. データの非識別化(マスキング)

from google.cloud import dlp_v2 def deidentify_with_mask(project_id, text): client = dlp_v2.DlpServiceClient() # 検出するInfoType info_types = [ {"name": "CREDIT_CARD_NUMBER"}, {"name": "EMAIL_ADDRESS"}, {"name": "PHONE_NUMBER"}, ] # マスキング設定 character_mask_config = { "masking_character": "*", # マスキング文字 "number_to_mask": 0, # 0 = 全てマスク "reverse_order": False, # 前から順にマスク } # 変換設定 primitive_transformation = { "character_mask_config": character_mask_config } # 非識別化設定 deidentify_config = { "info_type_transformations": { "transformations": [ { "info_types": info_types, "primitive_transformation": primitive_transformation, } ] } } # 検査設定 inspect_config = {"info_types": info_types} # アイテム item = {"value": text} # 非識別化を実行 parent = f"projects/{project_id}" response = client.deidentify_content( request={ "parent": parent, "deidentify_config": deidentify_config, "inspect_config": inspect_config, "item": item, } ) return response.item.value # 使用例 original_text = """ 顧客: 山田太郎 メール: yamada@example.com 電話: 090-1234-5678 カード: 4111-1111-1111-1111 """ masked_text = deidentify_with_mask("my-project-id", original_text) print("元のテキスト:") print(original_text) print("\nマスキング後:") print(masked_text)

3. Cloud Storageのスキャン

from google.cloud import dlp_v2 def inspect_gcs_file(project_id, bucket_name, file_name): client = dlp_v2.DlpServiceClient() # スキャン対象のGCSファイル storage_config = { "cloud_storage_options": { "file_set": { "url": f"gs://{bucket_name}/{file_name}" } } } # InfoType設定 info_types = [ {"name": "CREDIT_CARD_NUMBER"}, {"name": "EMAIL_ADDRESS"}, {"name": "PHONE_NUMBER"}, ] inspect_config = { "info_types": info_types, "min_likelihood": dlp_v2.Likelihood.POSSIBLE, } # 結果の出力先(別のGCSバケット) actions = [ { "save_findings": { "output_config": { "table": { "project_id": project_id, "dataset_id": "dlp_results", "table_id": "findings", } } } } ] # 検査ジョブの設定 inspect_job = { "inspect_config": inspect_config, "storage_config": storage_config, "actions": actions, } parent = f"projects/{project_id}" # ジョブを作成して実行 response = client.create_dlp_job( request={ "parent": parent, "inspect_job": inspect_job, } ) print(f"ジョブ作成: {response.name}") return response.name

4. BigQueryテーブルのスキャン

def inspect_bigquery_table(project_id, dataset_id, table_id): client = dlp_v2.DlpServiceClient() # BigQueryテーブルの指定 storage_config = { "big_query_options": { "table_reference": { "project_id": project_id, "dataset_id": dataset_id, "table_id": table_id, }, "sample_method": dlp_v2.BigQueryOptions.SampleMethod.RANDOM_START, "rows_limit": 10000, # サンプリング行数 } } # InfoType設定 info_types = [ {"name": "EMAIL_ADDRESS"}, {"name": "CREDIT_CARD_NUMBER"}, {"name": "PHONE_NUMBER"}, ] inspect_config = { "info_types": info_types, "min_likelihood": dlp_v2.Likelihood.LIKELY, } # アクション: Pub/Subに通知 actions = [ { "pub_sub": { "topic": f"projects/{project_id}/topics/dlp-findings" } } ] inspect_job = { "inspect_config": inspect_config, "storage_config": storage_config, "actions": actions, } parent = f"projects/{project_id}" response = client.create_dlp_job( request={"parent": parent, "inspect_job": inspect_job} ) print(f"BigQueryスキャンジョブ開始: {response.name}") return response.name

🎯 主なユースケース

1️⃣ データベースの機密データ検出

シナリオ: 本番データベースに個人情報が含まれているか確認したい

実装:
  • BigQueryテーブル全体をDLPでスキャン
  • 機密データの種類と場所を特定
  • 検出結果をBigQueryまたはPub/Subに出力
  • 定期的なスキャンジョブをスケジュール
効果: データインベントリの作成、コンプライアンス対応、リスク可視化

2️⃣ 開発・テスト環境用データの匿名化

シナリオ: 本番データを開発環境で使いたいが、個人情報は除去したい

実装:
  • 本番データをDLPでスキャン
  • 検出された機密データをマスキング・トークン化
  • 非識別化されたデータを開発環境にエクスポート
  • 暗号化トークンは本番環境に保管
効果: 安全な開発環境、GDPR/CCPA準拠、データ漏洩リスク低減

3️⃣ ログファイルの自動スクリーニング

シナリオ: アプリケーションログに誤って個人情報が含まれていないか監視

実装:
  • Cloud Logging → Cloud Storage → DLP スキャン
  • 機密データ検出時にPub/Subで通知
  • Cloud Functions で自動リダクション
  • アラートをSlack/メールに送信
効果: リアルタイム監視、自動修復、インシデント防止

4️⃣ データ移行時の機密情報チェック

シナリオ: オンプレからクラウドへ移行するデータに機密情報が含まれているか確認

実装:
  • 移行前にCloud Storageにアップロード
  • DLPで全ファイルをスキャン
  • 検出結果に基づいて非識別化
  • 承認プロセス後にBigQueryにロード
効果: 安全な移行、コンプライアンス確保、リスク評価

5️⃣ カスタマーサポートチャットの匿名化

シナリオ: チャットログを分析したいが、個人情報は保護したい

実装:
  • リアルタイムでチャットメッセージをDLPに送信
  • クレジットカード、メールアドレスなどを検出
  • 即座にリダクションまたはトークン化
  • 匿名化されたログをBigQueryに保存
効果: 安全なチャット分析、自動コンプライアンス、顧客信頼向上

6️⃣ レポート・ダッシュボードの自動マスキング

シナリオ: 経営層向けレポートに個人を特定できる情報を含めたくない

実装:
  • BigQueryのビューにDLP連携
  • クエリ実行時に自動的に非識別化
  • 集計データは維持しつつ、個別データはマスキング
  • Looker/Data Studioで可視化
効果: プライバシー保護、データ活用促進、柔軟なアクセス制御

🏗️ アーキテクチャ例

データパイプラインにおけるDLP統合

📥 データソース
💾
Cloud Storage
ファイル、ログ
🗄️
BigQuery
テーブル
💬
Datastore
NoSQLデータ
🔍 DLP処理
🔎
Inspection
機密データ検出
🛡️
De-identification
非識別化
📊
Risk Analysis
リスク評価
📤 出力・アクション
📊
BigQuery
結果保存
📢
Pub/Sub
通知
🔔
Cloud Functions
自動対応

🔗 他のGCPサービスとの統合

💾

Cloud Storage

  • バケット全体のスキャン
  • 新規ファイルの自動検査
  • イベント駆動型処理
🗄️

BigQuery

  • テーブルスキャン
  • 非識別化クエリ
  • 結果保存
📢

Pub/Sub

  • 検出通知
  • イベント駆動
  • リアルタイム処理

Cloud Functions

  • 自動修復
  • カスタム処理
  • アラート送信
🔐

Cloud KMS

  • 暗号化トークン化
  • 鍵管理
  • 再識別化
🔄

Dataflow

  • ストリーミング処理
  • 大規模バッチ処理
  • ETLパイプライン

💰 料金

機能 料金 単位
コンテンツ検査 $1.00 / GB 処理データ量
コンテンツ非識別化 $1.00 / GB 処理データ量
Cloud Storage検査 $0.50 / GB スキャンデータ量
BigQuery検査 $0.01 / GB スキャンデータ量
無料枠 最初の1 GB/月 検査・非識別化
💡 コスト最適化のヒント:

✅ ベストプラクティス

🎯 効果的なDLP活用のために

項目 推奨事項
InfoType選択 業界・地域に応じて適切なInfoTypeを選択。不要なものは除外してコスト削減
確信度設定 min_likelihoodを調整。厳しすぎると見逃し、緩すぎると誤検知
カスタムInfoType 組み込みで対応できない場合は、正規表現や辞書でカスタムInfoType作成
段階的展開 まず小規模でテスト、精度確認後に本番展開
自動化 Cloud Scheduler + Cloud Functions で定期実行を自動化
監査ログ Cloud Loggingで全DLP操作を記録し、コンプライアンス対応
暗号化トークン管理 Cloud KMSで鍵を適切に管理。再識別化権限を厳格に制御
データ分類 Data Catalogと連携してメタデータ管理を自動化
⚠️ 注意点:

📚 まとめ

🎓 Google Cloud DLPの要点

💡 DLPの価値:
  • コンプライアンス: GDPR、CCPA、HIPAA対応を自動化
  • リスク低減: データ漏洩の可能性を大幅に削減
  • データ活用: 安全に非識別化して分析・開発に利用
  • 運用効率化: 手作業でのスクリーニングを自動化
Google Cloud DLPにより、
機密データを自動的に検出・保護し、
セキュアなデータ活用とコンプライアンス対応を実現できます!