Warum kann ein neuer Benutzer Tabellen in PostgreSQL erstellen?

13

Ich folgte zwei Tutorials, um eine DB mit zu erstellen:

  1. ein vollständig privilegierter Benutzer Link
  2. ein Nur - Lese-Benutzer Link

Ich habe dann einen Tipp aus dem Tutorial von CJ Estel bekommen, der besagt, dass "Sie möglicherweise die Fähigkeit geerbt haben , Tabellen zu erstellen , obwohl wir sie niemals explizit unserem neuen Benutzer gegeben haben". Sicher genug, der Nur-Lese-Benutzer kann Tabellen erstellen und besitzen!

CJ Estel hat die eigentliche Ursache sehr gut herausgearbeitet, nämlich eine Vorlagendatenbank. Die Möglichkeit, Tabellen zu erstellen, untergräbt jedoch die meisten Tutorials, die Sie durch das Durchsuchen von "Nur-Lese-Benutzer-Postgres" erhalten, einschließlich eines auf postgresql.org gehosteten Tutorials . Ihr Benutzer hat mehr als nur Leserechte!

Warum hat ein neuer Benutzer diese Fähigkeit? Ist die Datenbank nach dem Widerrufen dieser Berechtigung für diesen Benutzer wirklich schreibgeschützt?

Jesvin Jose
quelle

Antworten:

13

TL; DR: Neue Benutzer können Tabellen im publicSchema 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 publicBenutzer 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 publicBenutzer keine Schemas erstellen oder temporäre Tabellen verwenden kann.


Persönlich, wenn ich dies entwerfe, würde ich Benutzern TEMPstandardmäßig das Recht auf die Datenbank geben, aber nicht CREATE(Schemata in der Datenbank) oder CREATE(Tabellen im publicSchema). 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 postgresBenutzer 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 peerAuthentifizierung ist, oder warum das Ausführen psqlnach 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.confes 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.

Craig Ringer
quelle
Also laufe ich 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 :)
Jesvin Jose
2
Als Antwort auf den vorherigen Kommentar ist es ein Nein.
Jesvin Jose