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**) |
| Confidential | NULLやゼロに置換 |
| 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ツールに安全なデータ提供が可能に
- 人手によるマスキング設計の手間・ミスを削減
- 分類変更時も**再生成で一括反映**できる柔軟性
セキュアでメンテナブルなデータ基盤を構築するうえで、**分類+マスキングの自動化は極めて重要**な施策となります。