Azure Database for PostgreSQL の PostgreSQL Anonymizer がパブリックプレビューになったので有効化して使ってみた
いわさです。
個人的にデータフィールドのマスキング実装方法について課題になることが多いのですが、PostgreSQL には PostgreSQL Anonymizer (postgresql_anonymizer) という拡張機能があります。
気にはなっていたのですが私が以前調べた際には Amazon RDS ではまだサポートされていなさそうでした。
そんな中、先週の Azure アップデートで Azure Database for PostgreSQL 上の postgresql_anonymizer 1.3.2 がパブリックプレビューで使えるようになったというアナウンスがありました。
有効化してみたので手順などを紹介します。
有効化には Azure ポータルから拡張機能の許可が必要
この拡張機能はデフォルトで有効化されているものではなく、Azure Database for PostgreSQL リソースの作成直後は次のようにエラーとなります。
hogedb=> SELECT anon.start_dynamic_masking();
ERROR: schema "anon" does not exist
LINE 1: SELECT anon.start_dynamic_masking();
^
hogedb=> CREATE EXTENSION IF NOT EXISTS anon CASCADE;
ERROR: extension "anon" is not allow-listed for "azure_pg_admin" users in Azure Database for PostgreSQL
HINT: to learn how to allow an extension or see the list of allowed extensions, please refer to https://go.microsoft.com/fwlink/?linkid=2281561
hogedb=>
Azure ポータル上でanon
拡張機能を許可してやる必要があります。
サーバーパラメーターからazure.extensions
を検索し、値でANON
を有効化して保存しましょう。
これで拡張機能の有効化が出来ます。
hogedb=> CREATE EXTENSION IF NOT EXISTS anon CASCADE;
CREATE EXTENSION
hogedb=> SELECT * FROM pg_extension;
oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+---------+----------+--------------+----------------+------------+-----------+--------------
14126 | plpgsql | 10 | 11 | f | 1.0 | |
24768 | anon | 10 | 2200 | f | 1.3.2 | |
(2 rows)
Dynamic Masking を使ってみる
PostgreSQL Anonymizer を使う際には大きくは Anonymous Dumps、Static Masking、Dynamic Masking があります。
Anonymous Dumps はまだ開発中の機能ですが、匿名化されたデータをデータベースからエクスポートする機能です。
Static Masking は指定したルールに基づいて元データをマスキングして更新します。
Dynamic Masking も指定したルールに基づいてマスキングされるのですが、元データに変更は行われず、指定したロールがアクセスする際のみ機密データをマスキングすることが出来ます。
色々なユースケースが考えられるとは思いますが、今回は Dynamic Masking を試してみました。
hogedb=> SELECT anon.start_dynamic_masking();
start_dynamic_masking
-----------------------
t
(1 row)
hogedb=>
まずはマスキングを有効化するユーザーを定義しておきます。
hogedb=> create role fuga LOGIN;
CREATE ROLE
hogedb=> alter role fuga with password '**********';
ALTER ROLE
hogedb=> security label for anon on role fuga is 'MASKED';
SECURITY LABEL
マスキング対象のサンプルデータを作成します。postgresql_anonymizer で使われているサンプルデータと同じものを今回は使います。
hogedb=> create table people (id varchar(10), firstname varchar(10), lastname varchar(10), phone varchar(10));
CREATE TABLE
hogedb=> insert into people values ('T1', 'Sarah', 'Conor', '0609110911');
INSERT 0 1
hogedb=> select * from people;
id | firstname | lastname | phone
----+-----------+----------+------------
T1 | Sarah | Conor | 0609110911
(1 row)
今時点ではまだ普通にデータを参照することが出来ていますね。
では、マスキングルールを定義しましょう。
hogedb=> SECURITY LABEL FOR anon ON COLUMN people.lastname IS 'MASKED WITH FUNCTION anon.fake_last_name()';
SECURITY LABEL
hogedb=> SECURITY LABEL FOR anon ON COLUMN people.phone IS 'MASKED WITH FUNCTION anon.partial(phone,2,$$******$$,2)';
SECURITY LABEL
people テーブルの lastname と phone フィールドに対してマスキングルールを設定しました。
このマスキングルールの設定が少しむずかしそうですが、使える機能は全部以下に定義されています。かなり高機能なこと出来ますね。すげえ。
ルールを設定したので fuga 接続して確認してみましょう。
hogedb=> \connect - fuga
Password for user fuga:
psql (14.11 (Homebrew), server 16.4)
WARNING: psql major version 14, server major version 16.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "hogedb" as user "fuga".
hogedb=> select * from people;
id | firstname | lastname | phone
----+-----------+-----------+------------
T1 | Sarah | Hernandez | 06******11
(1 row)
保護したデータが無事マスキングされていることが確認出来ました。
さいごに
本日は Azure Database for PostgreSQL の PostgreSQL Anonymizer がパブリックプレビューになったので有効化して使ってみました。
PostgreSQL Anonymizer かなり良いですね。
Amazon RDS や Aurora でも使いたいなぁ、以下を見る限りだと難しそうですが。