テックカリキュラム

分類されたデータに対するマスキング自動ビュー生成

分類されたデータに対するマスキング自動ビュー生成

PII(個人識別情報)や機密データを含むカラムは、開発環境やBIツール向けにマスキング処理を行う必要があります。しかし、データベースのカラム数が多くなると、手動マスキングは非効率かつミスの原因になります。

本記事では、自動分類されたカラム情報をもとに、マスキング処理を自動的に反映したビューを生成する実践的なテクニックを紹介します。


前提:分類済みカラム情報の保持

以下のような分類テーブルがすでに存在しているとします(前回の記事参照)。

CREATE TABLE classified_columns ( table_schema TEXT, table_name TEXT, column_name TEXT, classification TEXT, -- 例: 'PII', 'Confidential', 'Public' detected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); 

このテーブルには、各テーブルのどのカラムがPIIかなどの情報が格納されています。


マスキングルールの定義

分類ごとに以下のようなマスキングルールを定義しておきます。

分類マスキング例
PII先頭文字+伏せ字(例:T**)
ConfidentialNULLやゼロに置換
Publicそのまま表示

ステップ1:動的ビュー作成SQLの生成

PostgreSQLの pg_catalog + classified_columns を活用して、ビュー作成用SQLを動的に生成します。

WITH columns_with_mask AS ( SELECT cc.table_schema, cc.table_name, cc.column_name, cc.classification, CASE WHEN cc.classification = 'PII' THEN format('CASE WHEN %1$I IS NULL THEN NULL ELSE LEFT(%1$I, 1) || repeat(''*'', 2) END AS %1$I', cc.column_name) WHEN cc.classification = 'Confidential' THEN format('NULL AS %1$I', cc.column_name) ELSE format('%1$I', cc.column_name) END AS masked_column FROM classified_columns cc ) SELECT table_schema, table_name, string_agg(masked_column, ', ' ORDER BY column_name) AS masked_columns_sql FROM columns_with_mask GROUP BY table_schema, table_name; 

このクエリで、各テーブルごとのマスキング済みカラム一覧SQLが得られます。


ステップ2:マスキングビューを自動生成

上記で取得したSQLを使って、各テーブルに対して「_masked」ビューを生成します。

例:users テーブルのマスキングビュー

CREATE OR REPLACE VIEW users_masked AS SELECT id, CASE WHEN name IS NULL THEN NULL ELSE LEFT(name, 1) || '**' END AS name, NULL AS email, created_at FROM public.users; 

ビューは参照専用にしておくことで、安全にマスキングデータを共有可能です。

全テーブルに適用するバッチスクリプト例(psql + bash)

#!/bin/bash
DB="your_db"
USER="your_user"

psql -U $USER -d $DB -t -A -F"," -c "
WITH columns_with_mask AS (
  SELECT 
    cc.table_schema,
    cc.table_name,
    cc.column_name,
    cc.classification,
    CASE 
      WHEN cc.classification = 'PII' THEN 
        format('CASE WHEN %1\$I IS NULL THEN NULL ELSE LEFT(%1\$I, 1) || repeat(''*'', 2) END AS %1\$I', cc.column_name)
      WHEN cc.classification = 'Confidential' THEN 
        format('NULL AS %1\$I', cc.column_name)
      ELSE 
        format('%1\$I', cc.column_name)
    END AS masked_column
  FROM classified_columns cc
)
SELECT format(
  'CREATE OR REPLACE VIEW %1\$I_masked AS SELECT %2\$s FROM %1\$I.%1\$I;',
  table_name,
  string_agg(masked_column, ', ' ORDER BY column_name)
)
FROM columns_with_mask
GROUP BY table_name;" > create_masked_views.sql

# 実行
psql -U $USER -d $DB -f create_masked_views.sql

まとめ

分類済みデータに対するマスキングビューを自動生成することで:

  • 開発・テスト・BIツールに安全なデータ提供が可能に
  • 人手によるマスキング設計の手間・ミスを削減
  • 分類変更時も**再生成で一括反映**できる柔軟性

セキュアでメンテナブルなデータ基盤を構築するうえで、**分類+マスキングの自動化は極めて重要**な施策となります。