1

サーバーには 2 つのデータベースがあります (たとえば db1 と db2 )。user1 というスーパーユーザーがいます。

私の要件は、データベース db1 の user1 (スーパー ユーザー) を無効にすることです。そのため、user1 を使用すると、db1 ではなく db2 にのみ接続できます。

これはどのように行うことができますか。

注 : postgres のバージョンは 8.0 で、両方のデータベースが同じデータベース クラスター上にあります。

4

1 に答える 1

4

スーパーユーザー権限を完全に削除します。それらを()の所有者して、 C拡張機能のロードなどの制限されたスーパーユーザーのみの操作を除いて何でもできるようにします。db2ALTER DATABASE db2 OWNER TO whatever_userdb2

スーパーユーザーを制限することはできません。それがポイントです。スーパーユーザーのみの操作は、通常のアクセス制御ルールを破る操作です。たとえば、ユーザー定義のC関数をロードすると、関数を開いて再書き込みしpg_hba.confたり、システムカタログを直接操作したりする関数を作成してロードできます。同様に、これらのadminpack関数を使用すると、ファイルシステムに直接アクセスできるため、スーパーユーザー専用です。

彼らがスーパーユーザーである場合、彼らはただ読むことができpg_hba.conf、あなたのユーザーIDがログインする権利を持っていることを確認し、パスワードを変更してからあなたとしてログインしdb1ます。

スーパーユーザーを1つのDBに制限するように要求することは、ユーザーrootを作成できるかどうかを要求することと似ていますが、1つのサブディレクトリに対してのみです。(OK、SELinuxを使用すると、それを行うことができますが、複雑です)。

本当にこれを行う必要がある場合、それを行う唯一の方法は、異なる非特権システムユーザーIDで実行されている異なるPostgreSQLサーバーdb1に分割することです。db2それぞれに独自のshared_buffersデータディレクトリ、リスニング(ip-address, port)コンボ、WAL、ユーザーID、データベースリストなどがあります。異なるシステムユーザーの下で実行されているため、互いのデータディレクトリを読み書きする権利がありません。孤立しています。それらは異なるポートや異なるIPアドレスでリッスンする必要がありますが、PgBouncerを使用して、外部クライアントからは同じサーバーのように見せることができます。

于 2012-11-02T14:00:50.270 に答える