Introduzione
PostgreSQL utilizza vari meccanismi per implementare l'autenticazione, l'autorizzazione e la proprietà degli oggetti all'interno dei cluster di database. Il fulcro di questi è il concetto di ruoli.
I ruoli PostgreSQL sono una combinazione delle idee di utenti e gruppi in un'unica entità flessibile. Sono la persona che l'utente adotta all'interno del sistema di database, sono l'entità mediante la quale il sistema di autenticazione accetta o rifiuta le connessioni e l'oggetto delle regole di gestione dei privilegi di tutti gli ambiti.
Questa guida tratterà quali sono i ruoli e come gestirli all'interno di un cluster di database PostgreSQL. Più specificamente, questa guida tratterà la gestione dei ruoli in relazione agli attributi dei ruoli. Per una panoramica più ampia di come i ruoli si inseriscono nel quadro più ampio, dai un'occhiata alla guida introduttiva all'autenticazione e all'autorizzazione. Per informazioni su come modificare i privilegi di ruolo su oggetti database specifici, consulta la nostra guida sulle concessioni di ruolo.
Cosa sono i ruoli?
In PostgreSQL, un ruolo è un raggruppamento di un insieme specifico di capacità, autorizzazioni ed entità "di proprietà". Invece di avere concetti distinti di "utenti" e "gruppi", PostgreSQL usa i ruoli per rappresentare entrambe queste idee. Un ruolo può corrispondere a una singola persona nel mondo reale, oppure può operare come un gruppo con un certo accesso di cui altri ruoli possono diventare membri.
I ruoli sono il punto di ancoraggio all'interno di PostgreSQL che determina a chi si applicano le politiche di autenticazione e autorizzazione. Qualsiasi politica che non si applica universalmente richiede una nozione di identità per definire chi limitare e chi consentire. In PostgreSQL, questa identità è rappresentata dai ruoli.
Il sistema di autenticazione di PostgreSQL ha diversi componenti, ognuno dei quali è legato a ruoli. Per essere utilizzati per la connessione iniziale al cluster di database, i ruoli devono prima avere il LOGIN
insieme di attributi. Le regole di autenticazione stesse sono definite nel file di configurazione basato sull'host chiamato pg_hba.conf
. Ciascuna regola definisce i metodi di autenticazione che possono avere come ambito il singolo ruolo. Per i ruoli configurati per l'autenticazione tramite password, è necessario disporre di un attributo password impostato in modo che il sistema possa convalidare la password utente fornita.
In termini di autorizzazione, i ruoli sono definiti a livello di cluster di database, che in PostgreSQL significa che sono condivisi tra database. Poiché i ruoli si estendono nei database, il sistema di autorizzazione controlla il livello di accesso di ciascun ruolo a ciascuna entità del database. Poiché i ruoli possono rappresentare gruppi di persone, c'è una grande flessibilità nel modo in cui è possibile configurare l'accesso.
I ruoli sono anche essenziali per il concetto di proprietà degli oggetti all'interno di PostgreSQL. Ogni database e tabella, ad esempio, ha esattamente un ruolo configurato come proprietario. Altro che superusers
, il ruolo di proprietario è l'unico ruolo che può modificare o eliminare l'oggetto effettivo.
In sintesi, i ruoli sono al centro delle operazioni di database più pratiche. La loro flessibilità consente loro di agire sia come identificatori utente che come classi utente. Ogni azione all'interno del cluster di database viene verificata rispetto ai privilegi del ruolo e il successo di ogni connessione al cluster di database è determinato dal ruolo in cui ci si autentica. È importante avere una buona padronanza della gestione dei ruoli a causa della sua importanza all'interno di così tante operazioni principali.
Attributi del ruolo
Gli attributi del ruolo sono flag sul ruolo stesso che determinano alcuni dei privilegi principali di cui dispone a livello di cluster di database. Questi possono essere impostati al momento della creazione iniziale del ruolo o modificati in qualsiasi momento da qualsiasi ruolo con gli attributi appropriati (SUPERUSER
o CREATEROLE
in questo caso).
Gli attributi che possono essere applicati a un ruolo includono:
LOGIN
:consente agli utenti di connettersi inizialmente al cluster di database utilizzando questo ruolo. IlCREATE USER
comando aggiunge automaticamente questo attributo, mentreCREATE ROLE
il comando non lo fa.SUPERUSER
:consente al ruolo di ignorare tutti i controlli di autorizzazione tranne il diritto di accesso. Solo altriSUPERUSER
i ruoli possono creare ruoli con questo attributo.CREATEDB
:consente al ruolo di creare nuovi database.CREATEROLE
:consente al ruolo di creare, modificare ed eliminare altri ruoli. Questo attributo consente inoltre al ruolo di assegnare o modificare l'appartenenza al ruolo. Un'eccezione è che un ruolo conCREATEROLE
l'attributo non può alterareSUPERUSER
ruoli senza avere anche ilSUPERUSER
attributo.REPLICATION
:consente al ruolo di avviare la replica in streaming. I ruoli con questo attributo devono inoltre avere ilLOGIN
attributo.PASSWORD
:Assegna una password al ruolo che verrà utilizzato conpassword
omd5
meccanismi di autenticazione. Questo attributo accetta una password tra virgolette come argomento subito dopo la parola chiave dell'attributo.INHERIT
:determina se il ruolo eredita i privilegi dei ruoli di cui è membro. Senza ilINHERIT
, i membri devono utilizzareSET ROLE
passare all'altro ruolo per accedere a quei privilegi esclusivi. Questo attributo è impostato per i nuovi ruoli per impostazione predefinita.
Puoi scoprire di più sugli attributi dei ruoli consultando la documentazione di PostgreSQL sugli attributi dei ruoli e CREATE ROLE
comando.
Cos'è un superuser
ruolo?
Come accennato in precedenza, un privilegio speciale chiamato superuser
consente l'accesso amministrativo illimitato al cluster di database. Questo è simile alla root
account in sistemi operativi simili a Linux e Unix, ma a livello di database.
Deve esserci sempre almeno un ruolo con superuser
privilegi in ogni cluster di database. Il superuser
iniziale l'account viene creato durante il processo di installazione. Il nome del superuser
iniziale l'account può variare a seconda del processo di installazione, ma il più delle volte questo account è chiamato postgres
.
Non è consigliabile svolgere il lavoro quotidiano utilizzando un account con superuser
privilegi, sia per il suo potenziale di azioni distruttive sia per ridurre al minimo la possibilità di compromettere un account con ampio accesso. Invece, la maggior parte delle volte, gli utenti dovrebbero utilizzare account dedicati alle funzioni specifiche o agli oggetti dati con cui stanno lavorando, usando solo il superuser
account quando è richiesto un accesso più potente.
Verifica degli attributi del ruolo esistenti
Ora che hai un'idea generale di cosa sono gli attributi del ruolo e quali tipi di privilegi consentono, dovresti imparare come trovare gli attributi applicati ai ruoli in PostgreSQL. Questa sezione ti mostrerà alcuni comandi per aiutarti a trovare gli attributi impostati sui ruoli in generale e sul tuo ruolo attuale nello specifico.
Elencare tutti i ruoli del database e i relativi attributi
Esistono diversi modi per controllare gli attributi applicati ai ruoli nel sistema.
Se stai usando psql
client della riga di comando, puoi sfruttare alcuni utili meta-comandi che ti consentono di ottenere informazioni sugli attributi del ruolo senza una query.
Il \du
il meta-comando mostra tutti i ruoli e i loro attributi:
\du
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
In questo caso, il postgres
role è il ruolo predefinito con superuser
privilegi configurati per questo cluster di database.
L'equivalente SQL per elencare i ruoli (rilevabile passando il -E
o --echo-hidden
flag all'avvio di psql
) è:
SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolconnlimit, r.rolvaliduntil, ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) as memberof, r.rolreplication, r.rolbypassrlsFROM pg_catalog.pg_roles rWHERE r.rolname !~ '^pg_'ORDER BY 1;
Di seguito è riportata una query simile che fornisce informazioni sull'attributo del ruolo (senza il componente di appartenenza al ruolo). Usiamo il psql
meta-comando \x on
per emettere i risultati verticalmente per una migliore leggibilità qui:
-- turn on vertical display\x onSELECT * FROM pg_roles WHERE rolname !~ '^pg_';-- turn off vertical display\x off
-[ RECORD 1 ]--+---------rolname | postgresrolsuper | trolinherit | trolcreaterole | trolcreatedb | trolcanlogin | trolreplication | trolconnlimit | -1rolpassword | ********rolvaliduntil | rolbypassrls | trolconfig | oid | 10
Se sei interessato solo a vedere quali ruoli hanno il superuser
attributo, puoi chiedere esplicitamente un elenco:
SELECT rolname FROM pg_roles WHERE rolsuper;
rolname---------- postgres(1 row)
In alternativa, puoi elencare tutti gli utenti e il loro superuser
stato per un quadro più completo:
SELECT usename,usesuper FROM pg_user;
usename | usesuper----------+---------- postgres | t user1 | f(2 rows)
Le stesse informazioni possono essere recuperate utilizzando il paradigma del "ruolo" di PostgreSQL invece della sua (a volte ambigua) sovrapposizione "utente" con questa query leggermente più lunga:
SELECT rolname,rolsuper FROM pg_roles WHERE rolname !~ '^pg_';
rolname | rolsuper----------+---------- postgres | t user1 | f(2 rows)
Elencare i tuoi attributi
Se vuoi trovare gli attributi del ruolo che stai attualmente utilizzando, puoi facilmente filtrare l'output.
Quando si utilizza psql
meta-comandi, puoi usare il USER
variabile, che verrà sostituita con il ruolo connesso corrente. psql
usa i due punti (:
) per interpolare variabili:
\du :USER
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
Per ottenere un elenco che mostri i valori di tutti i possibili attributi del ruolo, puoi utilizzare una query confrontando il nome del ruolo con il valore restituito da CURRENT_ROLE
funzione PostgreSQL. Ancora una volta, stiamo usando l'output verticale per la leggibilità:
-- First, turn on vertical output\x onSELECT * FROM pg_roles WHERE rolename = CURRENT_ROLE;-- Change back to normal output\x off
-[ RECORD 1 ]--+---------rolname | postgresrolsuper | trolinherit | trolcreaterole | trolcreatedb | trolcanlogin | trolreplication | trolconnlimit | -1rolpassword | ********rolvaliduntil |rolbypassrls | trolconfig |oid | 10
Per verificare semplicemente se il tuo ruolo attuale ha superuser
privilegi, puoi digitare:
SHOW is_superuser;
is_superuser-------------- on(1 row)
Verifica se disponi dei privilegi di gestione dei ruoli
Per creare, modificare o eliminare ruoli, devi avere un superuser
o CREATEROLE
privilegi.
Per verificare quali ruoli all'interno del sistema dispongono dei privilegi di gestione dei ruoli, digitare:
SELECT rolname as "Users who can manage roles" FROM pg_roles WHERE rolsuper OR rolcreaterole;
Users who can manage roles---------------------------- postgres(1 rows)
Se vuoi solo sapere se il tuo ruolo attuale dispone dei privilegi di gestione dei ruoli, puoi invece utilizzare:
SELECT 'Yes' AS "Can I manage roles?" FROM pg_roles WHERE rolname = :'USER' AND (rolsuper OR rolcreaterole);
Can I manage roles?--------------------- Yes(1 row)
Creazione di ruoli
Dopo aver verificato di disporre dei privilegi di gestione dei ruoli, puoi iniziare a creare, modificare o rimuovere ruoli all'interno di PostgreSQL.
Un'opzione per impostare gli attributi del ruolo consiste nel dichiararli al momento della creazione del ruolo. Ciò consente di impostare le condizioni iniziali per il ruolo, ma è comunque possibile modificarle in seguito se si desidera modificare il livello di accesso del ruolo. Puoi trovare maggiori informazioni su CREATE ROLE
comando che useremo per familiarizzare con la sintassi di base.
Un modo per creare un ruolo è dalla riga di comando. PostgreSQL include un createuser
comando che creerà un ruolo all'interno del cluster di database con LOGIN
privilegi.
La sintassi generale è:
createuser <options> <rolename>
Ad esempio, per creare un ruolo denominato admin
con superuser
privilegi durante la richiesta di una password, puoi digitare:
createuser --superuser admin
Sarai quindi in grado di accedere utilizzando l'admin
account secondo i metodi di autenticazione descritti in pg_hba.conf
file.
Per creare ruoli utilizzando SQL
, la sintassi generale è simile alla seguente:
CREATE ROLE <role>;
Gli attributi possono essere definiti specificandoli dopo il nome del ruolo utilizzando WITH
:
CREATE ROLE <role> WITH <options>;
Ad esempio, per creare un ruolo denominato user1
che può accedere con la password secretpassword
, puoi digitare:
CREATE ROLE "user1" WITH LOGIN PASSWORD 'secretpassword';
Per creare invece un ruolo con superuser
privilegi (devi anche essere un superuser
per eseguire correttamente questo comando) che non può login (l'utente deve utilizzare SET ROLE
per passare a questo ruolo), puoi digitare:
CREATE ROLE "user2" WITH SUPERUSER;
Cambiare i ruoli esistenti
Per modificare gli attributi dei ruoli esistenti, puoi utilizzare il ALTER ROLE
comando invece. Come per la creazione del ruolo, anche il tuo ruolo attuale deve avere uno dei due superuser
o CREATEROLE
privilegi. Gli utenti che non dispongono di tali privilegi possono utilizzare solo il ALTER ROLE
comando per modificare la propria password.
La modifica dei ruoli consente di modificare gli attributi assegnati a un ruolo dopo la creazione. Gli stessi attributi menzionati nella sezione di creazione del ruolo possono essere utilizzati con ALTER ROLE
sintassi. Una differenza è che ogni tipo di attributo può essere negato aggiungendo il NO
prefisso. Ad esempio, per consentire a un ruolo di accedere al cluster di database, puoi assegnargli il LOGIN
attributo. Per rimuovere tale capacità, devi modificare il ruolo specificando NOLOGIN
.
Il ALTER ROLE
comando cambia solo gli attributi sono quelli esplicitamente menzionati. In altre parole, il ALTER ROLE
il comando specifica modifiche agli attributi, non un set completo di nuovi attributi.
Per consentire a user2
ruolo per accedere al cluster di database, puoi digitare:
ALTER ROLE "user2" WITH LOGIN;
Tieni presente che mentre ciò consente la possibilità di accedere, i metodi di autenticazione consentiti sono comunque controllati da pg_hba.conf
file.
Se vuoi user2
per poter accedere, creare ruoli e creare database invece, puoi specificare questi tre attributi, separati da spazi:
ALTER ROLE "user2" WITH LOGIN CREATEROLE CREATEDB;
Per revocare superuser
status da un ruolo (puoi eseguire questo comando solo usando un altro superuser
ruolo), digitare:
ALTER ROLE "user2" WITH NOSUPERUSER;
Per modificare la password per un ruolo, puoi digitare quanto segue (tutti i ruoli dovrebbero essere in grado di eseguire questo comando nel proprio ruolo, indipendentemente da CREATEROLE
o superuser
privilegi):
ALTER ROLE <role> WITH PASSWORD '<password>';
Sebbene il comando sopra funzioni, se possibile, è un'idea migliore usare psql
metacomando per cambiare le password. Il psql
Il comando richiede automaticamente una password e la crittografa prima di inviarla al server. Questo aiuta a evitare la perdita di dati sensibili nei log.
Puoi modificare la password di un ruolo con psql
digitando quanto segue
-- To change your own password\password-- To change the password for another role\password <role>
Puoi anche usare il ALTER ROLE
comando per rinominare un ruolo:
ALTER ROLE <role> RENAME TO <newrole>
Tieni presente che non puoi rinominare il tuo ruolo di sessione corrente.
Eliminazione ruoli
L'eliminazione di un ruolo esistente segue uno schema simile ai comandi precedenti. Ancora una volta, devi avere CREATEROLE
o superuser
privilegi per eseguire questi comandi.
Un fattore complicante è che i ruoli non possono essere rimossi se sono ancora referenziati da oggetti all'interno del database. Ciò significa che è necessario eliminare o trasferire la proprietà di tutti gli oggetti di cui è proprietario il ruolo. Successivamente, devi anche revocare eventuali privilegi aggiuntivi che il ruolo ha sugli oggetti del database.
Una spiegazione dettagliata di come riassegnare e rilasciare i privilegi in modo appropriato è fornita da Erwin Brandstetter sul sito Database Administrators Stack Exchange. Questo stesso processo viene utilizzato di seguito.
Innanzitutto, puoi riassegnare tutti gli oggetti di proprietà del ruolo utilizzando REASSIGNED OWNED
comando. Ad esempio, se ti stai preparando a eliminare user2
ruolo, puoi assegnare i suoi oggetti al postgres
ruolo digitando:
REASSIGN OWNED BY "user2" TO "postgres";
Ora gli oggetti sono di proprietà di postgres
, possiamo usare il DROP OWNED
comando per revocare tutti gli altri privilegi che ci sono stati concessi sugli oggetti. Questo comando cancella anche tutti gli oggetti che possediamo, ma poiché li abbiamo appena trasferiti nel postgres
ruolo, il user2
il ruolo non ha più oggetti di proprietà. Per questo motivo, il comando revocherà solo i privilegi aggiuntivi del ruolo:
DROP OWNED BY "user2";
Senza il DROP OWNED
scorciatoia sopra, dovresti eseguire REVOKE ALL PRIVILEGES
su ogni singolo oggetto o tipo di oggetto su cui il ruolo ha i privilegi.
Dopo aver revocato tutti i privilegi associati, puoi rimuovere il ruolo digitando:
DROP ROLE "user2";
Accesso utilizzando psql
Dopo aver configurato un nuovo ruolo e aver configurato i dettagli di autenticazione utilizzando pg_hba.conf
file, puoi accedere al cluster di database usando il tuo nuovo ruolo. Il psql
il client della riga di comando fornisce un modo semplice per farlo.
Per impostazione predefinita, psql
presuppone che tu voglia connetterti utilizzando un ruolo che corrisponda al nome utente del tuo sistema operativo. Quindi, se hai effettuato l'accesso al tuo computer come john
, psql
presumerà che tu voglia provare a connetterti al database usando un ruolo chiamato anche john
.
Per ignorare questo comportamento, puoi passare il -U
o --username=
opzione. Ad esempio, se vuoi accedere a un ruolo chiamato kerry
, puoi digitare:
psql -U kerry
Il successo di psql
il comando dipenderà dall'esistenza del kerry
ruolo, l'accessibilità del server a cui stai tentando di connetterti e le regole di autenticazione definite sul server.
Passare a un ruolo diverso durante una sessione
A volte, potresti voler adottare temporaneamente i privilegi e l'identità di un altro ruolo a cui hai accesso. Ad esempio, questo è necessario se vuoi ottenere i privilegi di un ruolo di cui sei membro se il tuo ruolo attuale non ha il INHERIT
attributo.
Per capire come funziona, devi conoscere la terminologia utilizzata da PostgreSQL per classificare i ruoli attivi:
- Ruolo della sessione :Un ruolo di sessione è il ruolo con cui hai effettuato l'accesso durante la connessione iniziale al cluster di database PostgreSQL. Imposta i tuoi privilegi iniziali e determina il tuo accesso al sistema. Questo ruolo deve avere il
LOGIN
attributo. - Ruolo attuale :Al contrario, il ruolo attuale è il ruolo che stai attualmente interpretando. I privilegi associati al ruolo corrente, siano essi impostati direttamente o ereditati da altri ruoli, determinano le azioni che puoi eseguire e gli oggetti a cui hai accesso.
Puoi visualizzare i valori della tua sessione e del ruolo corrente digitando:
SELECT SESSION_USER, CURRENT_USER;
current_user | session_user--------------+-------------- postgres | postgres(1 row)
Sebbene l'unico modo per modificare il ruolo della sessione sia avviare una nuova connessione utilizzando un ruolo diverso, puoi modificare il ruolo attuale utilizzando il SET ROLE
comando. Il SET ROLE
comando viene utilizzato per agire temporaneamente come un ruolo diverso. Il comando accetta facoltativamente anche i seguenti modificatori:
SESSION
:L'impostazione predefinita. Ciò provoca ilSET ROLE
comando per influenzare l'intera sessione del database.LOCAL
:Questo modificatore farà cambiare il ruolo al comando solo per la transazione corrente.
Per cambiare il ruolo corrente in user2
ruolo (per il resto della sessione), digitare:
SET ROLE "user2";
Se controlli la tua sessione e i valori del ruolo corrente, vedrai che il valore del ruolo corrente è cambiato:
SELECT SESSION_USER, CURRENT_USER;
current_user | session_user--------------+-------------- user2 | postgres(1 row)
Tutte le tue azioni ora utilizzeranno user2
ruolo come contesto.
Per tornare al ruolo di sessione che avevi utilizzato in precedenza, puoi digitare:
SET ROLE NONE;
Un'alternativa che ottiene lo stesso risultato è:
RESET ROLE;
Conclusione
Il sistema di ruoli, attributi di ruolo, concessioni e autenticazione di PostgreSQL crea un sistema flessibile che consente agli amministratori di gestire in modo efficace le autorizzazioni e l'accesso al database. Questa guida ha descritto cosa sono esattamente i ruoli e come comprendono un'ampia gamma di casi d'uso. Ha inoltre spiegato come creare, modificare ed eliminare ruoli e gestire gli attributi del ruolo che ne determinano le capacità globali. Comprendere come gestire queste identità è necessario per proteggere i tuoi database e fornire un accesso utilizzabile ai tuoi utenti legittimi.