PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Concedi i privilegi per un particolare database in PostgreSQL

Concetto di base in Postgres

I ruoli sono oggetti globali che possono accedere a tutti i database in un cluster di database, dati i privilegi richiesti.

Un cluster contiene molti database , che contengono molti schemi . Gli schemi (anche con lo stesso nome) in DB diversi non sono correlati. La concessione dei privilegi per uno schema si applica solo a questo particolare schema nel DB corrente (il DB corrente al momento della concessione).

Ogni database inizia con uno schema public per impostazione predefinita. Questa è una convenzione e molte impostazioni iniziano con essa. Oltre a questo, lo schema public è solo uno schema come un altro.

Venendo da MySQL, potresti voler iniziare con un singolo schema public , ignorando completamente il livello dello schema. Uso regolarmente dozzine di schemi per database.
Gli schemi sono un po' (ma non completamente) come le directory nel file system.

Dopo aver utilizzato più schemi, assicurati di comprendere search_path impostazione:

  • In che modo il percorso_ricerca influenza la risoluzione dell'identificatore e lo "schema corrente"

Privilegi predefiniti

Per documentazione su GRANT :

PostgreSQL concede privilegi predefiniti su alcuni tipi di oggetti a PUBLIC . Nessun privilegio è concesso a PUBLIC per impostazione predefinita su tabelle, colonne, schemi o tablespace. Per altri tipi, i privilegi predefiniti concessi a PUBLIC sono i seguenti:CONNECT e CREATE TEMP TABLE per banche dati; EXECUTE privilegio per funzioni; e USAGE privilegio per le lingue.

Tutte queste impostazioni predefinite possono essere modificate con ALTER DEFAULT PRIVILEGES :

  • Concedi tutto su uno schema specifico nel db a un ruolo di gruppo in PostgreSQL

Ruolo del gruppo

Come ha commentato @Craig, è meglio GRANT privilegi a un ruolo di gruppo e quindi rendere un utente specifico membro di quel ruolo (GRANT il ruolo del gruppo al ruolo dell'utente). In questo modo è più semplice distribuire e revocare pacchetti di privilegi necessari per determinate attività.

Un ruolo di gruppo è solo un altro ruolo senza accesso. Aggiungi un login per trasformarlo in un ruolo utente. Altro:

  • Perché PostgreSQL ha unito utenti e gruppi in ruoli?

Ruoli predefiniti

Aggiornamento: Postgres 14 o successivo aggiunge i nuovi ruoli predefiniti (formalmente "ruoli predefiniti") pg_read_all_data e pg_write_all_data per semplificare alcuni dei seguenti. Vedi:

  • Concedi l'accesso a tutte le tabelle di un database

Ricetta

Supponiamo che abbiamo un nuovo database mydb , un gruppo mygrp e un utente myusr ...

Durante la connessione al database in questione come superutente (postgres per esempio):

REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp;  -- since we revoked from public

GRANT USAGE ON SCHEMA public TO mygrp;

Per assegnare "a un utente tutti i privilegi a tutte le tabelle" come hai scritto (potrei essere più restrittivo):

GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those

Per impostare i privilegi predefiniti per gli oggetti futuri, esegui per ogni ruolo che crea oggetti in questo schema:

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;

-- more roles?

Ora, concedi il gruppo all'utente:

GRANT mygrp TO myusr;

Risposta correlata:

  • PostgreSQL:l'utente DB dovrebbe essere autorizzato solo a chiamare funzioni

Impostazione alternativa (non standard)

Proveniente da MySQL e poiché desideri mantenere separati i privilegi sui database, potrebbe piacerti questa impostazione non standard db_user_namespace . Per documentazione:

Questo parametro abilita i nomi utente per database. È disattivato per impostazione predefinita.

Leggere attentamente il manuale. Non uso questa impostazione. Non annulla quanto sopra.