問題は基本的にこれに帰着します:postgresで新しいデータベースを安全に作成するにはどうすればよいですか?つまり、デフォルトでは誰も新しいデータベースに対する特権を持たず、すべてのアクセスを明示的に定義する必要があります。
インターネットでいろいろな資料を試しましたが、明確な答えが得られません。postgres9.1を使用するfedora17linuxでこれを試しましたが、最終的にはpostgres8.4を使用するredhat6.3で使用します。
プロセス:
- postgresをインストールし、initdbを実行し、サーバーを起動します
- postgresスーパーユーザーとローカルに接続する
- オプションcreatedbおよびcreateroleを使用して新しいユーザーu1を作成します
- 切断してu1として再接続します
- データベースdb1を作成します
- ユーザーu2を作成します
- 切断してu2として再接続します
- db1にテーブルt1を作成します
私はその最後のステップが成功することを期待していません。u2にはdb1に対する特権が与えられておらず、データベースまたはスキーマを照会するときに特権が表示されません。私の理解では、パブリックスキーマと組み込みのパブリックロールのデフォルトの権限により、u2はdb1にテーブルを作成できます。それらを取り消す場合は、データベースでのみ行うことができますが、スキーマでは行うことができません。これは、postgresが所有しているためです。したがって、最終的には、新しいデータベースを作成するたびに、スーパーユーザーでこれらの特権を取り消す必要があります。データベースの所有者に委任することはできません。また、新しいデータベースごとに委任することを忘れてはなりません。
デフォルトでは、すべてのユーザーが新しいデータベースのパブリックスキーマにスパムを送信できます。他のユーザーはデフォルトでパブリックスキーマで作業し、テーブルがすでに存在することを確認せず、見知らぬ人が所有する既存のテーブルを使用する可能性があるため、これは危険です。
これらの安全でないデフォルトを修正するにはどうすればよいですか?