データガバナンスの強化や情報セキュリティ対策として、「この列は個人情報?」「このカラムは機密?」といったデータ分類(Data Classification)の自動化が重要になっています。本記事では、**カスタム辞書(分類ルール)とSQLを組み合わせて、DB内のカラムを自動分類・タグ付けする手法**を紹介します。
なぜデータ分類が必要か?
- 個人情報保護法・GDPRなどの法規制への対応
- PII・PHI・機密情報の洗い出しと可視化
- マスキング・暗号化・アクセス制御設計の前提
しかし、手動での分類は手間がかかり非効率です。これを解決するのが、辞書ベースでの自動分類です。
カスタム辞書による分類ルールの定義
まずは、自社におけるデータ分類ルールを辞書テーブルとして定義します。
分類ルール辞書の例
CREATE TABLE data_classification_dictionary ( keyword TEXT, classification TEXT -- 例: 'PII', 'Confidential', 'Public' ); -- 登録例 INSERT INTO data_classification_dictionary (keyword, classification) VALUES ('name', 'PII'), ('email', 'PII'), ('phone', 'PII'), ('address', 'PII'), ('salary', 'Confidential'), ('ssn', 'PII'), ('zip', 'PII'), ('credit', 'Confidential');
このテーブルにより、列名に含まれるキーワードと分類カテゴリのマッピングが可能になります。
カラムメタデータ × カスタム辞書 で自動分類
PostgreSQLの information_schema.columns を利用し、全カラムを辞書と照合して分類できます。
-- 列名に辞書キーワードが含まれるものを自動分類 SELECT c.table_schema, c.table_name, c.column_name, d.classification FROM information_schema.columns c JOIN data_classification_dictionary d ON c.column_name ILIKE '%' || d.keyword || '%' WHERE c.table_schema NOT IN ('information_schema', 'pg_catalog') ORDER BY c.table_schema, c.table_name;
このSQLにより、データベース全体のカラムを走査して分類タグを自動付与することが可能です。
分類結果を保存して運用する
分類結果を保存して、継続的な監視・差分検出・レポーティングに活用できます。
分類結果保存用テーブルの例
CREATE TABLE classified_columns ( table_schema TEXT, table_name TEXT, column_name TEXT, classification TEXT, detected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
定期更新スクリプト(例)
INSERT INTO classified_columns (table_schema, table_name, column_name, classification) SELECT c.table_schema, c.table_name, c.column_name, d.classification FROM information_schema.columns c JOIN data_classification_dictionary d ON c.column_name ILIKE '%' || d.keyword || '%' WHERE c.table_schema NOT IN ('information_schema', 'pg_catalog');
このようにすれば、分類の履歴管理や変更差分の検知も可能になります。
ビューで分類付きメタデータを可視化
CREATE VIEW view_classified_columns AS SELECT table_schema, table_name, column_name, classification FROM classified_columns;
このビューを用いれば、BIツールやSQLクエリでいつでもデータ分類状態を確認可能になります。
応用:複数の分類カテゴリや優先度の扱い
同じ列が複数のキーワードに一致することもあるため、以下のような工夫が可能です:
- 辞書に優先度カラムを追加(例:PII > Confidential > Public)
- 辞書マッチ結果を
ROW_NUMBER()でフィルタして、優先度の高い分類を採用
-- 辞書に優先度を追加 ALTER TABLE data_classification_dictionary ADD COLUMN priority INT; -- 最も優先度が高い分類のみ抽出 WITH ranked AS ( SELECT c.table_schema, c.table_name, c.column_name, d.classification, d.priority, ROW_NUMBER() OVER (PARTITION BY c.table_schema, c.table_name, c.column_name ORDER BY d.priority) AS rn FROM information_schema.columns c JOIN data_classification_dictionary d ON c.column_name ILIKE '%' || d.keyword || '%' WHERE c.table_schema NOT IN ('information_schema', 'pg_catalog') ) SELECT * FROM ranked WHERE rn = 1;
まとめ
データ分類の自動化は、セキュリティ・ガバナンス・可視化の土台となる重要な仕組みです。
- カスタム辞書を定義して分類ルールを明文化
- information_schemaと照合し、全カラムを自動分類
- 分類結果は保存・可視化・差分検出
- 優先度や分類重複対策で現場運用に対応
このような仕組みを定期ジョブやCI/CDに組み込めば、データガバナンスの自動化と属人性排除に大きく貢献します。