L'utente creato può accedere a tutti i database in PostgreSQL senza alcuna concessione


44

Mi manca qualcosa per quanto riguarda l'installazione di PostgreSQL. Quello che mi piacerebbe fare è creare più database e utenti che sono isolati l'uno dall'altro in modo che un utente specifico abbia accesso solo ai database da me specificati. Tuttavia, da quello che posso determinare, qualsiasi utente creato ha accesso a tutti i database senza concedere specifiche sovvenzioni.

Ecco cosa faccio su un Ubuntu Server 12.04:

  1. apt-get install postgresql
  2. sudo -u postgres createuser -DRSP mike1 (Specifica della password per il nuovo utente)
  3. sudo -u postgres Createdb data1
  4. psql -h localhost -U mike1 data1 (Specifica della password per l'utente mike1 per il login)

Sembra che il nuovo utente "mike1" non abbia problemi a connettersi al database "data1" e creare tabelle ecc. E questo senza eseguire alcun comando GRANT (e il proprietario di "data1" è "postgres" poiché non ho specificato un proprietario al passaggio 3). È davvero così che dovrebbe funzionare?

Quello che mi piacerebbe fare è garantire a mike1 il pieno accesso ai dati1 e quindi ripeterlo per più utenti e database, assicurandomi che gli utenti abbiano accesso solo a uno (o forse più) database di mia scelta.


1
Tieni presente che anche se un utente è limitato a un solo database, può comunque interrogare le tabelle globali, il che consentirà loro di visualizzare l'elenco dei nomi del database e l'elenco degli utenti.
kgrittn,

Risposte:


47

A livello di SQL, ogni utente può effettivamente connettersi a un database appena creato, fino a quando non viene emesso il seguente comando SQL:

REVOKE connect ON DATABASE database_name FROM PUBLIC;

Una volta fatto, ogni utente o ruolo che dovrebbe essere in grado di connettersi deve ottenere esplicitamente il privilegio di connessione:

GRANT connect ON DATABASE database_name TO rolename;

Modifica: in uno scenario multi-tenant, più del semplice connectprivilegio verrebbe rimosso. Per suggerimenti multi-tenancy e best practice, potresti voler leggere sul wiki pubblico di postgresql: hosting di database condiviso e gestione dei diritti in PostgreSQL .


L'impostazione predefinita avrebbe dovuto essere il contrario. Voglio creare un utente con una password generata casualmente e concedergli l'accesso a un singolo DB, sapendo che postgrespuò accedere a tutti i database.
TheRealChx101,

24

PUBLIC ha accesso al database per impostazione predefinita, ma non può accedere ai dati. Puoi RIVENDERE il PUBBLICO:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

Se si desidera questa impostazione per tutti i database futuri, revocare CONNECT sul database template1 (database dei modelli predefinito per la creazione di un nuovo database):

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

Vedo. Ora ha più senso. Suppongo che non dovrei venire qui come nuovo arrivato in PostgreSQL e contestare che forse PUBLIC non dovrebbe avere il privilegio CONNECT su template1 come predefinito :) Ma ora vedo anche che i dati non sono mai stati a rischio. Grazie!
mikeplate

1
Sei più che benvenuto come nuovo arrivato, anche per contestare le impostazioni. Tutti possono imparare da quello!
Frank Heikens,

1
In realtà, quel privilegio CONNECT non viene passato dal modello al nuovo database, quindi revocarlo su template1 non ha l'effetto menzionato.
Daniel Vérité,

2
@ DanielVérité vedo. Quindi immagino che la soluzione sia sempre ricordare e fare REVOKE CONNECT durante la creazione di un nuovo database. È davvero così che viene fatto di solito dagli amministratori di PostgreSQL o non dovrei preoccuparmene così tanto dato che i dati non sono comunque accessibili? Tuttavia, penso che un elenco di tabelle possa fornire informazioni non necessarie per attacchi futuri, anche se solo tra utenti già autorizzati in un ambiente multi-tenant. Inoltre: ho appena capito che il pubblico può anche creare le proprie tabelle in qualsiasi database che non sia stato REVOKE CONNECT. È un po 'strano avere come impostazione predefinita, devo dire.
mikeplate,

1
Sì. Sto aggiungendo collegamenti correlati alla mia risposta, potresti voler leggere un altro paio di documenti a riguardo.
Daniel Vérité,

4

Oltre a revocare i privilegi di connessione da PUBLIC per impostazione predefinita e concederli come desiderato in modo specifico, l'altro livello a cui è possibile controllare l'accesso è tramite il file pg_hba.conf.

Puoi trovare dove è archiviato il file con:

SHOW hba_file;

Se scegli di utilizzare questo meccanismo, ci sono commenti incorporati che potrebbero essere sufficienti per iniziare. I documenti sono qui:

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


Grazie! Ho guardato il file pg_hba.conf ma avevo l'impressione che governa solo il modo in cui un utente si autentica quando si connette a un database e non quali privilegi l'utente ha in quello stesso database.
mikeplate

1
Un utente può connettersi ai database solo come consentito da pg_hba.conf. Ciò include non solo la combinazione di utente e database, ma anche l'host da cui si connettono e il metodo di autenticazione consentito. Se non hai bisogno di quella granularità di controllo, la tecnica GRANT/ REVOKEdiscussa in altre risposte è probabilmente più semplice. Per prima cosa, hai solo bisogno di una connessione al database superutente per questo, rispetto alla necessità di un accesso al sistema operativo che può modificare il file.
kgrittn,

0

Mi sono imbattuto in questo thread alla ricerca di un modo per impedire agli utenti di elencare anche gli altri nomi di database. Questo REVOKE CONNECTnon impedisce questo.

Secondo le risposte a questa domanda SO non esiste un modo (raccomandabile) per raggiungerlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.