Webアプリケーションをサポートするマルチテナントデータベースで新しい行レベルのセキュリティ機能を使用する最良の方法を理解しています。PostgreSQL 9.5 - 行レベルのセキュリティ/ ROLEのベストプラクティス
現在、アプリケーションでは、実行しようとしている操作によって、いくつかの異なる役割が利用できます。
アプリケーションが独自のROLEを使用して接続すると、アプリケーションはユーザーが指定した認証パラメータに基づいて行を除外するさまざまな機能にユーザーが提供する認証パラメータを渡します。このシステムは何千人ものユーザーと連携して動作するように設計されており、動作するようです。しかし、それは反抗的にclunky(そして遅い)です。
新しい行レベルのセキュリティ機能を使用する場合は、データベースにアクセスするために実際の各ユーザー(Webアプリケーションだけでなく)に新しいROLEを作成する必要があるようです。
これは間違いありませんか?もしそうなら、何千ものROLEをデータベースに作成することをお勧めしますか?私は下にあったように私はcurrent_setting('app_name.app_user')
によって混乱している、今
CREATE USER application;
CREATE TABLE t1 (id int primary key, f1 text, app_user text);
INSERT INTO t1 VALUES(1,'a','bob');
INSERT INTO t1 VALUES(2,'b','alice');
ALTER TABLE t1 ENABLE ROW LEVEL SECURITY;
CREATE POLICY P ON t1 USING (app_user = current_setting('app_name.app_user'));
GRANT SELECT ON t1 TO application;
SET SESSION AUTHORIZATION application;
SET app_name.app_user = 'bob';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
1 | a | bob
(1 row)
SET app_name.app_user = 'alice';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
2 | b | alice
(1 row)
SET app_name.app_user = 'none';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
(0 rows)
:コメント欄でa_horse_with_no_nameのリンクから
更新(おかげで、そのスレッドは上のスポットです)これは設定パラメータのためのものだと感じています... app_name
はどこに定義されていますか?セッションの設定に基づいてセキュリティポリシーを設定する
http://www.postgresql.org/message-id/[email protected] –
@a_horse_with_no_name - ありがとうございました。しかし、スレッドで与えられた例はちょっと暗いです...私は質問を更新しました。 – losthorse
**設定パラメータの**は**です。これを使用することは、本質的に「ハック」です。これを事前に定義する必要はありません。これは動的に行うことができます。パラメータが定義されていない場合、 'current_setting( 'app_name.app_user')'はエラーになります。これを防ぐため、 'postgresql.conf'にダミー値を定義することができます。 –