サーバーには 2 つのデータベースがあります (たとえば db1 と db2 )。user1 というスーパーユーザーがいます。
私の要件は、データベース db1 の user1 (スーパー ユーザー) を無効にすることです。そのため、user1 を使用すると、db1 ではなく db2 にのみ接続できます。
これはどのように行うことができますか。
注 : postgres のバージョンは 8.0 で、両方のデータベースが同じデータベース クラスター上にあります。
サーバーには 2 つのデータベースがあります (たとえば db1 と db2 )。user1 というスーパーユーザーがいます。
私の要件は、データベース db1 の user1 (スーパー ユーザー) を無効にすることです。そのため、user1 を使用すると、db1 ではなく db2 にのみ接続できます。
これはどのように行うことができますか。
注 : postgres のバージョンは 8.0 で、両方のデータベースが同じデータベース クラスター上にあります。
スーパーユーザー権限を完全に削除します。それらを()の所有者にして、 C拡張機能のロードなどの制限されたスーパーユーザーのみの操作を除いて何でもできるようにします。db2
ALTER DATABASE db2 OWNER TO whatever_user
db2
スーパーユーザーを制限することはできません。それがポイントです。スーパーユーザーのみの操作は、通常のアクセス制御ルールを破る操作です。たとえば、ユーザー定義の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を使用して、外部クライアントからは同じサーバーのように見せることができます。