1

スーパーユーザー権限を持つユーザー ロールを作成しました。サーバーには約 30 のデータベースがあります。このロールをDBのみにのみ割り当てたい。現在のロールでは、ユーザーはすべての DB にスーパー ユーザーとしてアクセスできます。彼が他の DB にスーパー ユーザーとしてアクセスできないようにするにはどうすればよいですか。

これは、スーパーユーザーを割り当てるために私が持っているものです:

CREATE ROLE fc LOGIN
   SUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

誰かがこれで私を助けることができますか?

4

2 に答える 2

3

@Craigが説明したように、できません(できたとしても、かなり無意味です)。

制限されたスーパーユーザー権限を実装する通常の方法は、既存のスーパーユーザー ロールとして接続し、承認されたコマンドの限定セットを含むSECURITY DEFINER関数を作成することです。これらの関数は、呼び出し元ではなく作成者の権限で実行されるようになりました。

ただし、関数内のすべてがスーパーユーザーとして実行されるため、インジェクションの脆弱性を開かないように十分に注意する必要があります。たとえば、呼び出し元は、=スーパーユーザー権限を付与するカスタム オペレーターを作成し、それを検索パスに入れることができるため=pg_catalogスキーマで を使用していることを完全に確認する必要があります。

少なくとも、次のことを行う必要があります。

  • 句を使用して、これらすべての関数を作成しますSECURITY DEFINER SET search_path TO pg_catalog, pg_temppg_tempスキーマは常にリストの最後に含める必要があります (省略した場合、暗黙的に先頭に含まれます) 。
  • 関数が参照する他のすべてのテーブル、関数などをスキーマ修飾し (たとえばpublic.MyTable、 だけではなくMyTable)、これらすべてがスーパーユーザーによって所有されていることを確認します (呼び出し元が悪意のあるコードをトリガーなどに入れることができないようにするため)。
  • EXECUTE 'SELECT ...'徹底的な検証なしに、ユーザー入力を動的クエリ文字列 ( ) に入れないでください。
于 2015-06-19T04:58:04.850 に答える