Azure Cosmos DB for PostgreSQL の行レベルのセキュリティ
適用対象: Azure Cosmos DB for PostgreSQL (PostgreSQL の Citus データベース拡張機能を利用)
PostgreSQL 行レベルのセキュリティ ポリシーでは、どのユーザーがどのテーブル行を変更またはアクセスできるかを制限します。 行レベルのセキュリティは、マルチテナント クラスターで特に役立つ場合があります。 これにより、個々のテナントは、各テナントの情報を他のテナントから非表示にしながら、データベースへのフル SQL アクセス権を持つことができます。
マルチテナント アプリの実装
テーブル行レベルのセキュリティ ポリシーに結び付けるデータベース ロールの名前付け規則を使用して、テナント データの分離を実装できます。 tenant1
、tenant2
などの連番で各テナントにデータベース ロールを割り当てます。テナントは、これらの個別のロールを使用して Azure Cosmos DB for PostgreSQL に接続します。 行レベルのセキュリティ ポリシーでは、tenant_id
ディストリビューション列のロール名と値を比較して、アクセスを許可するかどうかを決定できます。
次に、tenant_id
によって分散された簡略なイベント テーブルにアプローチを適用する方法を示します。 最初に、ロール tenant1
と tenant2
を作成します。 次に、citus
管理者ユーザーとして次の SQL コマンドを実行します。
CREATE TABLE events(
tenant_id int,
id int,
type text
);
SELECT create_distributed_table('events','tenant_id');
INSERT INTO events VALUES (1,1,'foo'), (2,2,'bar');
-- assumes that roles tenant1 and tenant2 exist
GRANT select, update, insert, delete
ON events TO tenant1, tenant2;
現時点では、このテーブルに対する SELECT アクセス許可を持つすべてのユーザーが両方の行を表示できます。 いずれかのテナントのユーザーは、他方のテナントの行を表示および更新できます。 行レベルのテーブル セキュリティ ポリシーを使用して、データ リークを解決できます。
各ポリシーは、USING と WITH CHECK の 2 つの句で構成されます。 ユーザーが行の読み取りまたは書き込みを試みると、データベースは各行をこれらの句に照らして評価します。 PostgreSQL は、USING 句で指定された式に照らして既存のテーブル行をチェックし、WITH CHECK 句に照らして INSERT または UPDATE を使用して作成される行をチェックします。
-- first a policy for the system admin "citus" user
CREATE POLICY admin_all ON events
TO citus -- apply to this role
USING (true) -- read any existing row
WITH CHECK (true); -- insert or update any row
-- next a policy which allows role "tenant<n>" to
-- access rows where tenant_id = <n>
CREATE POLICY user_mod ON events
USING (current_user = 'tenant' || tenant_id::text);
-- lack of CHECK means same condition as USING
-- enforce the policies
ALTER TABLE events ENABLE ROW LEVEL SECURITY;
これで、ロール tenant1
と tenant2
は、クエリのさまざまな結果を取得します。
tenant1 として接続済み:
SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│ 1 │ 1 │ foo │
└───────────┴────┴──────┘
tenant2 として接続済み:
SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│ 2 │ 2 │ bar │
└───────────┴────┴──────┘
INSERT INTO events VALUES (3,3,'surprise');
/*
ERROR: new row violates row-level security policy for table "events_102055"
*/
次の手順
- クラスターでロールを作成する方法について学習します。
- Azure Cosmos DB for PostgreSQL のセキュリティ概念を確認する