Ich frage mich, warum ein neu erstellter Benutzer nach dem Herstellen einer Verbindung zu einer Datenbank eine Tabelle erstellen darf. Ich habe eine Datenbank project2_core
:
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------+--------------+-----------+-------------+-------------+-------------------------------
postgres | postgres | SQL_ASCII | C | C |
project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
So weit, ist es gut. Jetzt erstelle ich einen Benutzer:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
Okay. Wenn ich versuche, eine Verbindung zur Datenbank herzustellen, darf der Benutzer dies nicht tun:
$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich:
psql: FATAL: permission denied for database "project2_core"
DETAIL: User does not have CONNECT privilege.
Das habe ich erwartet. Jetzt fängt das seltsame Zeug an. Ich erteile dem Benutzer CONNECT
:
postgres=# GRANT CONNECT ON DATABASE project2_core TO dietrich;
GRANT
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------+--------------+-----------+-------------+-------------+-------------------------------
postgres | postgres | SQL_ASCII | C | C |
project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2+
| | | | | dietrich=c/project2
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
Und ohne weitere Bewilligungen darf der Benutzer eine Tabelle erstellen:
$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich:
psql (9.2.3)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.
project2_core=> create table adsf ();
CREATE TABLE
project2_core=> \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | adsf | table | dietrich
(1 row)
Ich hätte erwartet, dass der Benutzer nichts tun darf, bevor ich explizit GRANT USAGE
das Schema und dann GRANT SELECT
die Tabellen bearbeitet habe.
Wo ist mein Fehler? Was mache ich falsch? Wie kann ich erreichen, was ich will (dass ein neuer Benutzer nichts tun darf, bevor er ihr explizit die entsprechenden Rechte gewährt?)?
Ich bin verloren und deine Hilfe wird sehr geschätzt :)
BEARBEITEN Nach dem Rat von @ daniel-verite widerrufe ich jetzt alle sofort nach dem Erstellen der Datenbank. Der Benutzer dietrich darf keine Tabelle mehr anlegen. Gut. ABER : Jetzt darf auch der Besitzer der Datenbank, project2 , keine Tabelle erstellen. Auch nach dem Ausstellen von GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
und GRANT ALL PRIVILEGES ON SCHEMA public TO project2
wird ein Fehler angezeigt. FEHLER: Es wurde kein Schema zum Erstellen ausgewählt. Wenn ich dies ausdrücklich versuche, CREATE TABLE public.WHATEVER ();
wird die Berechtigung FEHLER: für das öffentliche Schema verweigert . Was mache ich falsch?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. Warum hatte das keine Wirkung?