「SELECTの特権」はありません "。必要なのはEXECUTEへの権限だけです 機能。関連する関数は、SECURITYで実行できます。 DEFINER
所有者のすべての特権を継承します。可能な特権昇格を最小限のアプリオリに制限するには、デーモンロールに、スーパーユーザーではなく、必要な特権のみを持つ関連機能を所有させます。
レシピ
スーパーユーザーとして...
スーパーユーザー以外の役割を作成するmyuser 。
CREATE ROLE myuser PASSWORD ...;
グループロールmygroupを作成します myuserを作成します その中のメンバー。
CREATE ROLE mygroup;
GRANT mygroup TO myuser;
myuserのようにユーザーを追加することもできます 後で。
特権をまったく付与しない myuserへ 。
これらはmygroupにのみ付与してください :
データベースmydbのmygroupへの接続を許可します;mygroupに公開されているスキーマの使用を許可する;-
GRANT EXECUTE ON FUNCTION foo()TO mygroup;
すべてを削除します publicの権限 そのmyuser 持ってはいけません。
REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;
もっとあるかもしれません。 マニュアルを引用します:
デーモンの役割を作成します 所有 関連する機能。
CREATE ROLE mydaemon;
これらの機能を実行するために必要な権限のみをmydaemonに付与します 、( EXECUTE ON FUNCTIONを含む 別の関数を呼び出せるようにするため)。ここでも、グループロールを使用して特権をバンドルし、それらを mydaemonに付与できます。
GRANT bundle1 TO mydaemon;
さらに、 DEFAULT PRIVILEGES コード>
将来のオブジェクトに対する特定の特権をバンドルまたはデーモンに直接自動的に付与するには:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO bundle1;
これは、実行される役割にのみ適用されます。 ドキュメントによると:
スキーマ内の既存のオブジェクトもカバーするため(robのコメント ):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bundle1;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO bundle1;
mydaemonを作成します 独自の関連機能。次のようになります:
CREATE OR REPLACE FUNCTION foo()
...
SECURITY DEFINER SET search_path = myschema, pg_temp;
ALTER FUNCTION foo() OWNER TO mydaemon;
REVOKE EXECUTE ON FUNCTION foo() FROM public;
GRANT EXECUTE ON FUNCTION foo() TO mydaemon;
GRANT EXECUTE ON FUNCTION foo() TO mygroup;
-- possibly others ..
###注
REVOKE EXECUTE ON FUNCTION foo() FROM public;
リバースエンジニアリングされたDDLスクリプトにありません。再作成するときは、忘れずに追加してください。
このバグは、現在のバージョンのpgAdmin1.18.1で修正されています。