[アップデート] Amazon Aurora PostgreSQL で pgcolumnmask を使った動的データマスキングをサポートしたので使ってみた

[アップデート] Amazon Aurora PostgreSQL で pgcolumnmask を使った動的データマスキングをサポートしたので使ってみた

2025.12.24

いわさです。

先月のアップデートになるのですが、Aurora PostgreSQL で pgcolumnmask 拡張機能を使った動的データマスキングがサポートされました。

https://aws.amazon.com/about-aws/whats-new/2025/11/amazon-aurora-postgresql-dynamic-data-masking/

アップデートから少し時間が空いてしまいましたが、軽く検証する機会があったのでその様子を紹介します。

クラスター作成

この拡張機能は Aurora PostgreSQL のバージョン 16.10 / 17.6 以上で利用出来るようです。
デフォルトで選択されているバージョンは本日時点では 17.4 だったので、今回は先日登場[1]した最新の 17.7 を使ってみました。

49E6115C-7C05-4E39-AFE4-611119174E90.png

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

A25A46A1-CE97-4447-8760-9817D64A9A77.png

クラスターが作成出来たら、検証用のテーブルとレコードを作成しましょう。
今回の拡張では組み込みのマスキング関数が提供されており、テキスト、タイムスタンプ、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...
                                                         ^

以下を参考にインストールしましょう。

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Security.DynamicMasking.GetStarted.html

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_emailmask_textmask_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)

また、それぞれの関数はオプションが用意されています。以下に詳しく記載されています。
例えばマスキング文字列を指定したり、マスキングの範囲などを指定できます。

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Security.DynamicMasking.PredefinedMaskingFunctions.html

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)

データマスキングポリシーを作成する

続いてポリシーを作成してみましょう。
先程のようにクエリの中で関数を使っても良いのですが、マスキングの自動適用ポリシーを作成することができます。

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Security.DynamicMasking.Procedures.html

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 の拡張機能を使って実装しやすくなりそうです。

脚注
  1. [アップデート] Amazon Aurora PostgreSQL 17.7 がリリースされたので、Babelfish 5.4 のアップデート内容を確認してみた | DevelopersIO ↩︎

  2. 動的データマスキング - SQL Server | Microsoft Learn ↩︎

この記事をシェアする

FacebookHatena blogX

関連記事