web-dev-qa-db-ja.com

作成されたユーザーは、権限なしでPostgreSQLのすべてのデータベースにアクセスできます

PostgreSQLの設定に関して何か欠けているに違いありません。特定のユーザーが指定したデータベースにのみアクセスできるように、相互に分離された複数のデータベースとユーザーを作成します。ただし、私が判断できることから、作成されたユーザーは特定の権限が与えられていなくても、すべてのデータベースにアクセスできます。

これが私がUbuntu Server 12.04でやっていることです:

  1. apt-get install postgresql
  2. Sudo -u postgres createuser -DRSP mike1(新しいユーザーのパスワードの指定)
  3. Sudo -u postgres createdb data1
  4. psql -h localhost -U mike1 data1(ユーザーmike1がログインするためのパスワードを指定)

新しいユーザー「mike1」はデータベース「data1」に接続してテーブルを作成するなどの問題はないようです。GRANTコマンドをまったく実行せずに、これを指定しました(「data1」の所有者は「postgres」です。手順3の所有者)。これは実際にどのように機能するはずですか?

私がしたいことは、mike1にdata1へのフルアクセスを許可してから、これをより多くのユーザーとデータベースに対して繰り返し、ユーザーが選択した1つ(または複数)のデータベースにのみアクセスできるようにすることです。

45
mikeplate

SQLレベルでは、次のSQLコマンドが発行されるまで、すべてのユーザーが新しく作成されたデータベースに実際に接続できます。

REVOKE connect ON DATABASE database_name FROM PUBLIC;

完了したら、接続できる必要がある各ユーザーまたはロールに、接続特権を明示的に付与する必要があります。

GRANT connect ON DATABASE database_name TO rolename;

編集:マルチテナントのシナリオでは、connect特権以外のものが削除されます。マルチテナンシーのヒントとベストプラクティスについては、postgresqlの公開wikiで読むことをお勧めします: Shared Database Hosting and PostgreSQLでの権限の管理

47
Daniel Vérité

PUBLICはデフォルトでデータベースにアクセスできますが、データにはアクセスできません。公開を取り消すことができます。

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

今後のすべてのデータベースでこの設定が必要な場合は、template1データベース(新しいデータベースを作成するためのデフォルトのテンプレートデータベース)でCONNECTを取り消します。

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;
24
Frank Heikens

デフォルトでPUBLICから接続特権を取り消し、特に必要に応じてそれらに付与することに加えて、アクセスを制御できるもう1つのレベルはpg_hba.confファイルを使用することです。

ファイルの保存場所は次の場所で確認できます。

SHOW hba_file;

このメカニズムを使用することを選択した場合は、開始するのに十分なコメントが埋め込まれています。ドキュメントはここにあります:

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html

4
kgrittn

ユーザーが他のデータベース名を一覧表示することを防ぐ方法を探しているこのスレッドに出くわしました。 REVOKE CONNECTはこれを防ぎません。

this SO question への回答に従って、それを達成するための(推奨される)方法はありません。

0
AdamAL