Contents
1. データガバナンスの構成要素(4 層モデル)
| 階層 | 主なサービス | 目的 |
|---|---|---|
| メタデータ基盤 | Data Catalog / Dataplex Universal Catalog | 資産の一意 ID と検索インデックスを提供し、ビジネス・技術・運用メタデータを統合管理 |
| アクセス制御 | IAM(プロジェクト/データセット/テーブル単位) | 最小権限の原則に基づく認可 |
| 機密情報保護 | Cloud DLP + Policy Tag(Data Catalog のタグ) | 検出・マスキングと列レベルセキュリティ |
| 監査・モニタリング | Cloud Audit Logs / Access Transparency | すべての操作を証跡として残し、リアルタイムで可視化 |
ポイント
BigQuery は「分析層」の中心に位置し、上記 4 層すべてとシームレスに連携します。
参考文献
- Data Catalog – メタデータ管理: https://cloud.google.com/data-catalog/docs
- Dataplex Universal Catalog の概要: https://cloud.google.com/dataplex/docs/universal-catalog
- IAM の権限設計ベストプラクティス: https://cloud.google.com/iam/docs/best-practices
- Cloud DLP と Policy Tag の連携方法(カスタム実装例): https://cloud.google.com/dlp/docs/concepts-policy-tag-integration
2. Dataplex Universal Catalog による資産一元管理
2‑1. 主な機能
- 自動クローリング:BigQuery の新規テーブルが作成されるたびにメタデータを取得し、Data Catalog に登録。
- カスタム属性(Enum 推奨):
data_owner,sensitivity_levelなど組織独自の分類情報を付与でき、ポリシーエンジンと連携しやすくなる。
2‑2. 設定手順(概要)
- Lake の作成
bash
gcloud dataplex lakes create enterprise-lake \
--region=asia-northeast1 \
--project=$PROJECT_ID \
--description="Enterprise data lake with Universal Catalog" - Universal Catalog 有効化(Lake 作成時に
--enable-universal-catalogオプションを付与) - Asset の登録(対象プロジェクト・データセットを指定)
ベストプラクティス
- カタログ更新は 24 時間以内に完了させ、ポリシー適用遅延を防止。
- カスタム属性は Enum 型 に統一し、タグ付与時の入力ミスを最小化。
3. IAM と Policy Tag による階層的アクセス制御
3‑1. ロール設計の基本方針
| 階層 | 推奨ロール例 | 主な権限 |
|---|---|---|
| プロジェクト | roles/bigquery.admin(管理者) |
全リソースの作成・削除 |
| データセット | roles/bigquery.dataViewer、roles/bigquery.dataEditor |
SELECT / INSERT‑UPDATE‑DELETE |
| テーブル/列 | カスタムロール bigquery.columnReader(bigquery.tables.getData) + Policy Tag で列レベル制御 |
列単位の読み取り可否 |
IAM の階層は 上位が下位を包括 するため、最小権限を実現しやすい。公式ガイドでも「プロジェクト・データセット・テーブルレベルでロールを組み合わせる」ことが推奨されている【3】。
3‑2. Policy Tag の作成と列への適用(簡易サンプル)
|
1 2 3 4 5 6 7 8 9 10 11 |
# Taxonomy(分類体系)作成 gcloud data-catalog taxonomies create \ --location=asia-northeast1 \ --display-name="Data Sensitivity" \ --description="機密情報のレベル分け" # Policy Tag(例:Confidential)作成 gcloud data-catalog policy-tags create \ --taxonomy=data-sensitivity \ --display-name="Confidential" |
|
1 2 3 4 5 |
-- 列にタグを付与(SQL) ALTER TABLE `myproject.sales.customers` ALTER COLUMN ssn SET OPTIONS (policy_tags = ['projects/myproject/locations/asia-northeast1/taxonomies/data-sensitivity/policyTags/confidential']); |
注意点
Policy Tag と DLP の自動連携は GCP の標準機能ではありません。タグ付与は Cloud Functions などで検出結果を受け取って実装する必要があります(下章参照)。
4. Cloud DLP と Policy Tag を組み合わせた機密情報保護フロー
4‑1. 標準的な構成要素
| コンポーネント | 役割 |
|---|---|
| DLP 検査テンプレート | 正規表現・辞書ベースで SSN やクレジットカード番号を検出 |
| DLP ジョブ(スケジュール) | 指定テーブルを定期的にスキャンし、結果を Pub/Sub に送信 |
| Cloud Functions (Python) | Pub/Sub メッセージをトリガーに対象列へ Policy Tag を付与 |
| Data Catalog の Policy Tag | 列レベルアクセス制御とマスク処理の基盤 |
4‑2. 実装フロー(概要)
- 検査テンプレート作成
bash
gcloud dlp inspect-templates create ssn-template \
--info-types=US_SSN \
--min-likelihood=POSSIBLE \
--project=$PROJECT_ID - ジョブトリガー設定(Terraform で管理)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
resource "google_data_loss_prevention_job_trigger" "bq_scan" { parent = "projects/${var.project_id}" display_name = "Daily BQ SSN Scan" triggers { schedule { recurrence_period_duration = "86400s" } } inspect_job { storage_config { big_query_options { table_reference { project_id = var.project_id dataset_id = "sales" table_id = "customers" } } } inspect_template_name = google_data_loss_prevention_inspect_template.ssn.name actions { publish_to_pubsub { topic = google_pubsub_topic.dlp_results.id } } } } |
- Cloud Function がタグ付与(最小限のコード例)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import base64, json, os from google.cloud import bigquery def apply_policy_tag(event, context): msg = json.loads(base64.b64decode(event['data']).decode()) column = msg['quote'] # DLP が検出した列名(例:ssn) table = f"{msg['projectId']}.{msg['datasetId']}.{msg['tableId']}" client = bigquery.Client() tbl = client.get_table(table) new_schema = [] for field in tbl.schema: if field.name == column: field = bigquery.SchemaField( name=field.name, field_type=field.field_type, mode=field.mode, policy_tags={"names": [ f"projects/{os.getenv('GCP_PROJECT')}/locations/asia-northeast1/taxonomies/data-sensitivity/policyTags/confidential" ]} ) new_schema.append(field) tbl.schema = new_schema client.update_table(tbl, ["schema"]) |
重要:このように Pub/Sub → Cloud Functions → Policy Tag の流れを構築しなければ、DLP が自動でタグ付与することはできません(標準機能では未対応)。
5. IaC(Terraform)でガバナンス全体をコード化
以下は 主要リソースだけ を抽出した最小構成です。詳細なパラメータはプロジェクト要件に合わせて調整してください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# 1. Dataplex Lake (Universal Catalog 有効化) resource "google_dataplex_lake" "lake" { name = "enterprise-lake" location = var.region project = var.project_id metastore_config { type = "UNIVERSAL_CATALOG" } } # 2. Dataplex Asset (BigQuery データセット) resource "google_dataplex_asset" "sales_dataset" { name = "sales-dataset-asset" lake = google_dataplex_lake.lake.name location = var.region type = "BIGQUERY" resource_spec { name = "projects/${var.project_id}/datasets/sales" } discovery_spec { enabled = true schedule = "every 24 hours" } } # 3. IAM バインディング(データセット閲覧権限の例) resource "google_bigquery_dataset_iam_binding" "viewer" { dataset_id = "sales" role = "roles/bigquery.dataViewer" members = ["group:analytics@example.com"] } # 4. Policy Tag(Confidential)※Taxonomy は別途作成 resource "google_data_catalog_policy_tag" "confidential" { taxonomy = google_data_catalog_taxonomy.sensitivity.id display_name = "Confidential" description = "機密情報" } |
ポイント
-backend.tfに GCS リモートステートを設定し、環境差分(dev / prod)をコードで明示。
- CI/CD(GitHub Actions, Cloud Build 等)に組み込むことで、変更のレビューと自動適用が保証される。
6. 継続的コンプライアンス監視と落とし穴回避
6‑1. 監査ログ・Access Transparency の活用
| 項目 | 設定手順 |
|---|---|
| Audit Log エクスポート | Logging Sink → BigQuery データセット audit_logs にストリーム |
| Access Transparency | 組織レベルで有効化(デフォルトは無効) |
| 可視化ダッシュボード | Cloud Monitoring のカスタムウィジェットに以下クエリを貼り付け |
|
1 2 3 4 5 6 7 8 9 |
SELECT resource.type AS resource_type, protoPayload.methodName AS method, COUNT(*) AS cnt FROM `myproject.audit_logs.cloudaudit_googleapis_com_activity_*` WHERE timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) GROUP BY resource_type, method ORDER BY cnt DESC; |
6‑2. よくある失敗と対策
| 誤りケース | 影響 | 回避策 |
|---|---|---|
ロールの過剰付与(例:全員に bigquery.admin) |
データ漏洩リスク・監査指摘 | IAM テンプレート化+Terraform の plan 時に差分レビューを必須化 |
| Policy Tag 未適用の機密列 | DLP スキャンはできてもマスクが効かない | Cloud Function で未タグ列を検知するバッチクエリ(WHERE policy_tags IS NULL)を定期実行し、アラートを送信 |
| Audit Log のエクスポート忘れ | インシデント時の証跡が残らない | google_logging_project_sink を必須リソースとして IaC に組み込み |
| Dataplex カタログ更新遅延 | ポリシー適用タイミングがずれる | 重要テーブルは手動で gcloud dataplex assets update を実行し、スケジュールを「6 時間ごと」に変更 |
7. まとめ
- Google Cloud のデータガバナンス は Data Catalog → Dataplex Universal Catalog → IAM → Cloud DLP + Policy Tag の4層で構成され、BigQuery が分析層の中心としてすべてと連携します。
- Dataplex により資産が自動でカタログ化され、IAM と Policy Tag で最小権限かつ列レベルの機密保護が実現できます。
- Cloud DLP と Policy Tag の統合は標準機能ではなく、Pub/Sub → Cloud Functions のパイプラインを自前で構築する必要があります(公式ドキュメント[4]参照)。
- IaC(Terraform)と CI/CD を活用すれば、ガバナンス設定の再現性・変更管理が保証され、運用上のヒューマンエラーを大幅に削減できます。
- 監査ログと Access Transparency を BigQuery に集約し、ダッシュボードでリアルタイム可視化することで、継続的なコンプライアンスチェックが可能です。
次のステップ:本記事をベースに自組織のポリシーを「テンプレート化」し、Terraform リポジトリへインポート。CI パイプラインで
plan→applyのフローを確立すれば、データガバナンスがコードとして永続的に管理できるようになります。