TL; DR: Neue Benutzer können Tabellen im public
Schema erstellen, weil sich die Leute beschwert haben, dass es zu schwierig war, wenn sie es nicht konnten.
Wenn Sie die Standardeinstellungen nicht mögen, sollten Sie wahrscheinlich eine neue Vorlagendatenbank mit der gewünschten Erstkonfiguration erstellen. Zum Beispiel könnten Sie:
DROP SCHEMA public;
oder
REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;
in Ihrer Vorlage.
Wenn Sie möchten, dass der public
Benutzer keine Rechte für eine Datenbank hat, sollten Sie zusätzlich:
REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;
Damit der public
Benutzer keine Schemas erstellen oder temporäre Tabellen verwenden kann.
Persönlich, wenn ich dies entwerfe, würde ich Benutzern TEMP
standardmäßig das Recht auf die Datenbank geben, aber nicht CREATE
(Schemata in der Datenbank) oder CREATE
(Tabellen im public
Schema). Ich würde diese für den Eigentümer reservieren.
Es sind Entscheidungen, die vor langer Zeit getroffen wurden, und es ist ziemlich schwer, sie jetzt zu ändern.
So wie es ist, gibt es regelmäßig Beschwerden, dass es zu schwierig ist, mit PostgreSQL zu beginnen, da Sie ein Benutzerkonto erstellen müssen und häufig auch eine Datenbank erstellen möchten. Warum erstellen wir sie nicht einfach automatisch und 'vertrauen' standardmäßig als Auth-Modus, um es einfach zu machen? Warum hat der postgres
Benutzer nicht standardmäßig das Passwort postgres
? Warum erstellen wir Benutzer nicht automatisch, wenn sie im Betriebssystem vorhanden sind? etc.
Es gibt einige echte Usability-Probleme für neue Benutzer - insbesondere haben die meisten Leute keine Ahnung, was peer
Authentifizierung ist, oder warum das Ausführen psql
nach der Installation von PostgreSQL ihnen sagt, dass es keinen Benutzer mit dem Namen gibt, unter dem sie angemeldet sind.
Es ist auch chaotisch, dass pg_hba.conf
es sich um eine Konfigurationsdatei handelt, aber Benutzer werden auf SQL-Ebene erstellt. Diese Aufteilung verwirrt die Benutzer.
Viele Dinge sind jedoch Kompromisse zwischen sicheren Standardeinstellungen und einfachen Standardeinstellungen, bei denen das Projekt nicht alle glücklich machen wird.
revoke create on database [databasename] from [username];
und die DB ist jetzt wirklich nur für [Benutzername] lesbar. Richtig? Ich werde auf diese Antwort noch einmal zurückkommen, wenn ich ein gutes Postgres-Buch gelesen habe :)