Come posso concedere autorizzazioni ai nuovi oggetti creati in Amazon Redshift?

4 minuti di lettura
0

Il mio utente ha ricevuto un errore di autorizzazione negata per un nuovo oggetto creato. Come posso concedere all'utente le autorizzazioni necessarie per accedere ai nuovi oggetti creati nello schema?

Breve descrizione

Affinché un utente possa accedere ai nuovi oggetti creati nello schema, i privilegi per l'accesso agli oggetti devono essere concessi da un utente con privilegi avanzati.

Quando un utente non è in grado di accedere ai nuovi oggetti creati nello schema, potrebbe ricevere il seguente errore:

ERROR: permission denied for relation “objectname”.

Questo errore si verifica quando l'accesso è concesso solo agli oggetti correnti presenti in uno schema al momento della concessione dell'accesso. Per impostazione predefinita, l'accesso non viene concesso automaticamente agli oggetti creati ulteriormente nello schema.

Per risolvere questo problema, concedi i privilegi di accesso all'utente utilizzando il comando ALTER DEFAULT PRIVILEGES.

Risoluzione

Per concedere le autorizzazioni per le tabelle attuali e create ulteriormente nello schema, esegui le seguenti operazioni come utente con privilegi avanzati:

1.    Per concedere l'accesso all'utilizzo sullo schema e l'accesso SELECT su tutte le tabelle attualmente presenti nello schema, esegui i seguenti comandi:
Nota: sostituisci newtestschema con il nome del tuo schema e newtestuser con il nome dell'utente.

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

2.    Per concedere all'utente l'accesso SELECT alle tabelle create ulteriormente nello schema, esegui il seguente comando: Nota: sostituisci awsuser con il nome utente utilizzato per creare ulteriori oggetti all'interno dello schema, newtestschema con il nome dello schema e newtestuser con il nome utente che richiede l'accesso agli oggetti ulteriori.

alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

Nota: i privilegi predefiniti si applicano solo ai nuovi oggetti. L'esecuzione di ALTER DEFAULT PRIVILEGES non modifica i privilegi sugli oggetti esistenti.

3.    Per verificare che i privilegi predefiniti siano stati concessi all'utente, esegui la seguente query come utente con privilegi avanzati:

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

Se l'accesso è stato concesso, vedrai una voce per l'utente nella colonna default_privileges.

Ora, quando l'utente con privilegi avanzati crea un nuovo oggetto nello schema, l'utente avrà accesso SELECT sulla tabella.

Esempio

L'esempio seguente inizia con questa configurazione:

  • Un utente chiamato newtestuser che non è un utente con privilegi avanzati.
  • Uno schema denominato newtestschema e una tabella denominata newtesttable1 nello schema con alcuni record.

L'utente con privilegi avanzati denominato awsuser concede a newtestuser l'accesso allo schema newtestschema e a tutte le tabelle attualmente presenti nello schema, utilizzando il seguente comando di esempio:

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

Il comando precedente concede a newtestuser l'accesso SELECT alle tabelle correnti presenti in newtestschema. Attualmente, solo la tabella newtesttable1 è presente in newtestschema. La tabella newtesttable1 è accessibile a newtestuser.

Successivamente, awsuser crea un'altra tabella denominata newtesttable2 in newtestschema. Se newtestuser esegue una query SELECT sulla tabella newtestschema.newtesttable2, viene visualizzato il seguente errore:

ERROR: permission denied for relation newtesttable2.

Per risolvere l'errore, l'utente awsuser effettua le seguenti operazioni:

1.    Concede l'accesso alla tabella newtesttable2, eseguendo il seguente comando di esempio:

grant select on table newtestschema.newtesttable2 to newtestuser;

2.    Concede a newtestuser l'accesso a qualsiasi tabella creata ulteriormente da awsuser in newtestschema eseguendo il seguente comando di esempio:

alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

Ora, quando awsuser crea un'altra nuova tabella denominata newtesttable3 in newtestschema, newtestuser avrà accesso SELECT a newtesttable3.

3.    Per verificare che i privilegi predefiniti siano stati concessi a newtestuser, l'utente awsuser esegue la seguente query:

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

L'output della query precedente è simile al seguente:

user    | schema    | object_type    | default_privileges
awsuser | newtestschema    | tables    | newtestuser=r/awsuser

L'output mostra che awsuser concede i privilegi SELECT a newtestuser per tutte le nuove tabelle create da awsuser in newtestschema.


Informazioni correlate

PG_DEFAULT_ACL

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa