「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で修正されています。