Mi chiedo perché un utente appena creato sia autorizzato a creare una tabella dopo essersi connesso a un database. Ho un database 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)
Fin qui tutto bene. Ora creo un utente:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
Va bene. Quando provo a connettermi al database, l'utente non è autorizzato a farlo:
$ 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.
Questo è quello che mi aspettavo. Ora inizia la strana roba. Concedo all'utente 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)
E senza ulteriori sovvenzioni, l'utente è autorizzato a creare una tabella:
$ 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)
Mi sarei aspettato che l'utente non fosse autorizzato a fare nulla prima di fare esplicitamente GRANT USAGE
sullo schema e quindi GRANT SELECT
sulle tabelle.
Dov'è il mio errore? Che cosa sto facendo di sbagliato? Come posso ottenere ciò che voglio (che un nuovo utente non è autorizzato a fare nulla prima di concederle esplicitamente i diritti appropriati.
Mi sono perso e il tuo aiuto è molto apprezzato :)
MODIFICA Seguendo i consigli di @ daniel-verite, ora ho revocato tutto immediatamente dopo aver creato il database. L'utente dietrich non può più creare una tabella. Buono. MA : Ora, anche il proprietario del database, project2 , non è autorizzato a creare una tabella. Anche dopo l'emissione GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
e GRANT ALL PRIVILEGES ON SCHEMA public TO project2
, viene visualizzato un errore ERRORE: nessuno schema è stato selezionato per la creazione e, quando provo in modo specifico CREATE TABLE public.WHATEVER ();
, ottengo ERRORE: autorizzazione negata per lo schema pubblico . Che cosa sto facendo di sbagliato?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. perché questo non ha avuto alcun effetto?