it-swarm.com.de

Der erstellte Benutzer kann ohne Berechtigungen auf alle Datenbanken in PostgreSQL zugreifen

Mir muss etwas beim Einrichten von PostgreSQL fehlen. Ich möchte mehrere Datenbanken und Benutzer erstellen, die voneinander isoliert sind, sodass ein bestimmter Benutzer nur Zugriff auf die von mir angegebenen Datenbanken hat. Soweit ich jedoch feststellen kann, hat jeder erstellte Benutzer Zugriff auf alle Datenbanken, ohne dass bestimmte Zuschüsse gewährt werden.

Folgendes mache ich auf einem Ubuntu Server 12.04:

  1. apt-get install postgresql
  2. Sudo -u postgres createuser -DRSP mike1 (Angabe des Passworts für den neuen Benutzer)
  3. Sudo -u postgres createdb data1
  4. psql -h localhost -U mike1 data1 (Angabe des Passworts für den Benutzer mike1 zum Anmelden)

Es scheint, dass der neue Benutzer "mike1" kein Problem damit hat, eine Verbindung zur Datenbank "data1" herzustellen und Tabellen usw. zu erstellen. Und dies, ohne überhaupt einen GRANT-Befehl auszuführen (und der Besitzer von "data1" ist "postgres", da ich keine angegeben habe Besitzer in Schritt 3). Soll das wirklich so funktionieren?

Ich möchte mike1 vollen Zugriff auf data1 gewähren und dies dann für weitere Benutzer und Datenbanken wiederholen, um sicherzustellen, dass die Benutzer nur Zugriff auf eine (oder möglicherweise mehrere) Datenbanken meiner Wahl haben.

45
mikeplate

Auf SQL-Ebene kann jeder Benutzer tatsächlich eine Verbindung zu einer neu erstellten Datenbank herstellen, bis der folgende SQL-Befehl ausgegeben wird:

REVOKE connect ON DATABASE database_name FROM PUBLIC;

Anschließend muss jedem Benutzer oder jeder Rolle, die eine Verbindung herstellen kann, explizit das Verbindungsrecht gewährt werden:

GRANT connect ON DATABASE database_name TO rolename;

Bearbeiten: In einem Szenario mit mehreren Mandanten wird mehr als nur das Privileg connect entfernt. Tipps und Best Practices für Mandantenfähigkeit finden Sie im öffentlichen Wiki von postgresql: Shared Database Hosting und Verwalten von Rechten in PostgreSQL .

47
Daniel Vérité

PUBLIC hat standardmäßig Zugriff auf die Datenbank, kann jedoch nicht auf die Daten zugreifen. Sie können die ÖFFENTLICHKEIT widerrufen:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

Wenn Sie diese Einstellung für alle zukünftigen Datenbanken wünschen, widerrufen Sie CONNECT für die Datenbank template1 (Standardvorlagendatenbank zum Erstellen einer neuen Datenbank):

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;
24
Frank Heikens

Neben dem standardmäßigen Widerruf von Verbindungsberechtigungen aus PUBLIC und der Gewährung dieser Berechtigungen nach Bedarf können Sie den Zugriff auch über die Datei pg_hba.conf steuern.

Sie können feststellen, wo die Datei gespeichert ist mit:

SHOW hba_file;

Wenn Sie diesen Mechanismus verwenden, gibt es eingebettete Kommentare, die möglicherweise ausreichen, um Ihnen den Einstieg zu erleichtern. Die Dokumente sind hier:

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html

4
kgrittn

Ich bin auf diesen Thread gestoßen, um zu verhindern, dass Benutzer auch nur die anderen Datenbanknamen auflisten. Das REVOKE CONNECT verhindert dies nicht.

Gemäß den Antworten auf diese SO Frage gibt es keinen (empfehlenswerten) Weg, dies zu erreichen.

0
AdamAL