[アップデート] Amazon Aurora PostgreSQL で pgcolumnmask を使った動的データマスキングをサポートしたので使ってみた
いわさです。
先月のアップデートになるのですが、Aurora PostgreSQL で pgcolumnmask 拡張機能を使った動的データマスキングがサポートされました。
アップデートから少し時間が空いてしまいましたが、軽く検証する機会があったのでその様子を紹介します。
クラスター作成
この拡張機能は Aurora PostgreSQL のバージョン 16.10 / 17.6 以上で利用出来るようです。
デフォルトで選択されているバージョンは本日時点では 17.4 だったので、今回は先日登場[1]した最新の 17.7 を使ってみました。

この拡張機能の利用にあたっては特にカスタムパラメータグループを作ってパラメータ変更などは不要そうだったので、デフォルトのパラメータグループで作成しました。

クラスターが作成出来たら、検証用のテーブルとレコードを作成しましょう。
今回の拡張では組み込みのマスキング関数が提供されており、テキスト、タイムスタンプ、Eメールアドレスがサポートされているみたいなので、それらが含まれるテーブルにしました。
% psql -h hoge1224aurora.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres -d hogedb
Password for user postgres:
psql (14.15 (Homebrew), server 17.7)
WARNING: psql major version 14, server major version 17.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
hogedb=> CREATE TABLE fuga (
id INTEGER,
hogetext TEXT,
hogetimestamp TIMESTAMP,
hogeemail TEXT
);
CREATE TABLE
hogedb=> INSERT INTO fuga VALUES (1, 'hoge AAA', '2023-06-15 14:30:00', 'hoge@example.com');
INSERT 0 1
hogedb=> INSERT INTO fuga VALUES (2, 'hoge BBB', '2023-06-15 14:30:00', 'hoge2@example.com');
INSERT 0 1
hogedb=> INSERT INTO fuga VALUES (3, 'hoge CCC', '2023-06-15 14:30:00', 'hoge3@example.com');
INSERT 0 1
hogedb=> SELECT * FROM fuga;
id | hogetext | hogetimestamp | hogeemail
----+----------+---------------------+-------------------
1 | hoge AAA | 2023-06-15 14:30:00 | hoge@example.com
2 | hoge BBB | 2023-06-15 14:30:00 | hoge2@example.com
3 | hoge CCC | 2023-06-15 14:30:00 | hoge3@example.com
(3 rows)
拡張機能をインストールする
デフォルトではこの拡張機能は有効化されていないので有効が必要です。
hogedb=> SELECT proname FROM pg_proc WHERE pronamespace = 'pgcolumnmask'::regnamespace AND proname LIKE 'mask_%';
ERROR: schema "pgcolumnmask" does not exist
LINE 1: SELECT proname FROM pg_proc WHERE pronamespace = 'pgcolumnma...
^
以下を参考にインストールしましょう。
hogedb=> CREATE EXTENSION pg_columnmask;
CREATE EXTENSION
hogedb=> SELECT proname FROM pg_proc WHERE pronamespace = 'pgcolumnmask'::regnamespace;
proname
----------------------------------------
rename_masking_policy
drop_masking_policy
ddm_internal_masking_policy_identifier
get_masking_policy_info
mask_text
mask_timestamp
mask_email
create_masking_policy
alter_masking_policy
(9 rows)
今回全ては使わないのですが、大きくはマスキング処理の関数と、ロールベースでマスキング処理を自動適用するポリシー関係の関数が利用可能になります。
組み込みマスキング関数を使う
まずは個別のマスキング処理を確認してみます。
ポリシーなしでこれだけ使うのもOKです。
mask_email、mask_text、mask_timestampの 3 つが使えます。
こうなります。
hogedb=> SELECT
pgcolumnmask.mask_text(hogetext),
pgcolumnmask.mask_timestamp(hogetimestamp),
pgcolumnmask.mask_email(hogeemail)
FROM fuga;
mask_text | mask_timestamp | mask_email
-----------+---------------------+-------------------
XXXXXXXX | 1900-01-01 00:00:00 | XXXX@XXXXXXX.com
XXXXXXXX | 1900-01-01 00:00:00 | XXXXX@XXXXXXX.com
XXXXXXXX | 1900-01-01 00:00:00 | XXXXX@XXXXXXX.com
(3 rows)
また、それぞれの関数はオプションが用意されています。以下に詳しく記載されています。
例えばマスキング文字列を指定したり、マスキングの範囲などを指定できます。
hogedb=> SELECT
pgcolumnmask.mask_text(hogetext, '*', 2, 2),
pgcolumnmask.mask_timestamp(hogetimestamp, 'year'),
pgcolumnmask.mask_email(hogeemail, '?', true, false)
FROM fuga;
mask_text | mask_timestamp | mask_email
-----------+---------------------+-------------------
ho****AA | 1900-06-15 14:30:00 | ????@example.com
ho****BB | 1900-06-15 14:30:00 | ?????@example.com
ho****CC | 1900-06-15 14:30:00 | ?????@example.com
(3 rows)
データマスキングポリシーを作成する
続いてポリシーを作成してみましょう。
先程のようにクエリの中で関数を使っても良いのですが、マスキングの自動適用ポリシーを作成することができます。
pgcolumnmask.create_masking_policyプロシージャで作成するのですが、どのテーブルのどの列をどうマスキングするのかを指定します。
また対象ロールが指定できるので、ロールも作っておきます。
hogedb=> CREATE ROLE hogerole;
CREATE ROLE
hogedb=> GRANT SELECT ON fuga TO hogerole;
GRANT
hogedb=> CALL pgcolumnmask.create_masking_policy(
'hoge_mask_1',
'fuga',
JSON_OBJECT('{
"hogetext", "pgcolumnmask.mask_text(hogetext)",
"hogetimestamp", "pgcolumnmask.mask_timestamp(hogetimestamp)",
"hogeemail", "pgcolumnmask.mask_email(hogeemail)"
}')::JSONB,
ARRAY['hogerole'],
100
);
CALL
ロールとポリシーを作成しました。hogeroleにはマスキングが適用されるはず。
ロール切り替えて読み込んでみましょう。
hogedb=> SET ROLE hogerole;
SET
hogedb=> SELECT * FROM fuga;
id | hogetext | hogetimestamp | hogeemail
----+----------+---------------------+-------------------
1 | XXXXXXXX | 1900-01-01 00:00:00 | XXXX@XXXXXXX.com
2 | XXXXXXXX | 1900-01-01 00:00:00 | XXXXX@XXXXXXX.com
3 | XXXXXXXX | 1900-01-01 00:00:00 | XXXXX@XXXXXXX.com
(3 rows)
おお、うまく動きました。
さいごに
本日は Amazon Aurora PostgreSQL で pgcolumnmask を使った動的データマスキングをサポートしたので使ってみました。
動的データマスキングは SQL Server などでもサポートされていた機能[2]で、権限のないユー〜あに対してカラムレベルでデータをマスクすることで機密データの公開範囲を制限することができます。
機密データを扱うテーブル設計を行う際、そもそもハッシュ化しちゃうとか、取得時にうまいことやるかとか、毎度検討すると思いますが、今回のアップデートで Aurora PostgreSQL の拡張機能を使って実装しやすくなりそうです。






