sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL-DBユーザーは関数の呼び出しのみを許可する必要があります

    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 ..
    

    ###注
    このバグ が原因 pgAdmin の現在のバージョン1.16.1では 必要なコマンド

    REVOKE EXECUTE ON FUNCTION foo() FROM public;
    

    リバースエンジニアリングされたDDLスクリプトにありません。再作成するときは、忘れずに追加してください。
    このバグは、現在のバージョンのpgAdmin1.18.1で修正されています。




    1. mysqlで値をcsv値と比較する方法は?

    2. 列がSQLServerの計算列であるかどうかを確認する3つの方法

    3. データベースを接続するとアクセスが拒否されます

    4. MariaDBで英数字以外の文字のみを含む行を返す2つの方法