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


44

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

Ubuntu Server 12.04で行うことは次のとおりです。

  1. apt-get 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つ(またはおそらく複数)のデータベースにのみアクセスできるようにすることです。


1
ユーザーが1つのデータベースに制限されている場合でも、グローバルテーブルを照会できるため、データベース名のリストとユーザーのリストを表示できることに注意してください。
kgrittn

回答:


47

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

REVOKE connect ON DATABASE database_name FROM PUBLIC;

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

GRANT connect ON DATABASE database_name TO rolename;

編集:マルチテナントシナリオでは、connect特権だけが削除されます。マルチテナンシーのヒントとベストプラクティスについては、postgresqlの公開wiki:PostgreSQLの共有データベースホスティング管理の権利をお読みください 。


デフォルトは逆のはずです。ランダムに生成されたパスワードを使用してユーザーを作成し、postgresすべてのデータベースにアクセスできることを認識して、単一のDB へのアクセスを許可します。
TheRealChx101

24

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

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

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

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

そうですか。今ではもっと理にかなっています。PostgreSQLの新人としてここに来るべきではないと思いますし、PUBLICがデフォルトとしてtemplate1のCONNECT特権を持ってはならないことに異議を唱えることはありません:) ありがとう!
マイクプレート

1
あなたは新人として、また設定を争うことも歓迎します。誰もがそこから学ぶことができます!
フランクハイケンズ

1
実際には、そのCONNECT特権はテンプレートから新しいデータベースに渡されないため、template1でそれを取り消しても上記の効果はありません。
ダニエルベリテ

2
@DanielVéritéなるほど。そのため、新しいデータベースを作成するときは、常に接続を取り消してREVOKE CONNECTすることが解決策だと思います。これは、PostgreSQL管理者によって通常どのように行われるのでしょうか、それともデータにアクセスできないため、それほど気にする必要はありませんか?それでも、マルチテナント環境で既に許可されているユーザー間でのみ、テーブルのリストが将来の攻撃に不要な情報を提供する可能性があると思います。また、publicは、REVOKE CONNECTされていないデータベースに独自のテーブルを作成できることにも気付きました。デフォルトとして持つのは少し奇妙に感じます、私は言わなければなりません。
マイクプレート

1
はい。私は答えに関連リンクを追加しています。あなたはそれについてさらにいくつかのドキュメントを読むことができます。
ダニエルヴェリテ

4

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

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

SHOW hba_file;

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

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


ありがとう!私はpg_hba.confファイルを確認しましたが、データベースに接続するときのユーザーの認証方法のみを管理し、同じデータベースでのユーザーの権限は管理しないという印象を受けました。
マイクプレート

1
ユーザーは、pg_hba.confで許可されているデータベースにのみ接続できます。これには、ユーザーとデータベースの組み合わせだけでなく、接続元のホストと許可される認証方法も含まれます。そのような細かな制御が必要ない場合は、他の回答で説明したGRANT/ REVOKEテクニックの方がおそらく簡単です。1つには、ファイルを編集できるOSログインが必要なのに対して、スーパーユーザーデータベース接続が必要なだけです。
kgrittn

0

ユーザーが他のデータベース名をリストすることさえできないようにする方法を探しているこのスレッドに出会いました。これREVOKE CONNECTはこれを妨げません。

このSO質問への回答によると、それを達成する(推奨される)方法はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.