Come posso risolvere l'errore "impossibile rimuovere l'utente" in Amazon Redshift?

5 minuti di lettura
0

Non riesco a eliminare un utente o un gruppo in Amazon Redshift.

Breve descrizione

Quando cerchi di eliminare un utente in Amazon Redshift, potresti visualizzare uno di questi messaggi di errore:

  • ERRORE: l'utente "username" non può essere eliminato perché alcuni oggetti dipendono da esso
  • ERRORE: l'utente "username" non può essere eliminato perché ha un privilegio su alcuni oggetti
  • ERRORE: l'utente "username" non può essere eliminato perché è proprietario di qualche oggetto

Questi errori possono verificarsi quando si tenta di rimuovere questi tipi di utenti:

  • Un proprietario o utente di destinazione con autorizzazioni predefinite.
  • proprietario di qualsiasi oggetto (come database, schemi, tabelle, viste, procedure e librerie).
  • Un utente che dispone delle autorizzazioni per gli oggetti.

Per risolvere questi messaggi di errore, rimuovi innanzitutto i permessi dell'utente. Quindi trasferisci la proprietà dell'oggetto o rimuovi la proprietà degli oggetti dal gruppo.

Importante: è necessario revocare le autorizzazioni concesse all'utente e al gruppo da tutti i database del cluster Amazon Redshift.

Risoluzione

Installa gli script per creare visualizzazioni

Scarica e installa gli script v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql dal repository AWS Labs GitHub. Le viste per gli script v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql utilizzano lo schema admin nella loro definizione. Se non disponi di uno schema di amministrazione nel cluster Amazon Redshift, modifica la definizione in uno schema esistente. Oppure, crea uno schema di amministrazione.

Se sono state apportate modifiche alle colonne nella definizione della vista, eliminala prima di creare una nuova vista e una nuova definizione. Se provi a creare una nuova vista prima di eliminare quella precedente, viene visualizzato un errore di tabella non valida.

Eliminare un utente

Completa i seguenti passaggi:

  1. Cerca per utente per trovare tutte le autorizzazioni utente concesse che desideri eliminare. Quindi concedi nuovamente queste autorizzazioni come altro utente. È buona norma che questo utente sia un utente avanzato:

    select regexp_replace(ddl,grantor,'<superuser>') from v_generate_user_grant_revoke_ddl where grantor='<username>' and ddltype='grant' and objtype <>'default acl' order by objseq,grantseq;

    Nota: Per concedere nuovamente le autorizzazioni, è necessario essere un utente con autorizzazioni sull'oggetto. Questo utente deve disporre dei diritti di concessione delle autorizzazioni verso un altro utente. Se non disponi delle autorizzazioni di concessione, puoi concedere nuovamente le autorizzazioni come superutente.

  2. Trova tutte le autorizzazioni concesse all'utente e poi revocale:

    select ddl from v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='<username>' or grantor='<username>') order by objseq, grantseq desc;

    Nota: Sostituisci concedente con il nome dell'utente che concede le autorizzazioni. Sostituisci beneficiario con il nome dell'utente che riceve le autorizzazioni.
    Se la tua query non restituisce alcun record o il comando DROP USER fallisce, esegui la query seguente:

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and ddl ilike '%<user-to-be-dropped>%' order by objseq, grantseq desc;

    La query precedente elenca le autorizzazioni che è necessario revocare all'utente prima di poterlo eliminare. Revoca queste autorizzazioni prima di procedere con il passaggio successivo.

  3. Per verificare la presenza di elenchi di controllo di accesso (ACL) vuoti, esegui le seguenti query:

    select * from pg_user where usename = '<username-to-be-dropped>';
    select * from pg_default_acl where defacluser= <user-id>;
    select pg_get_iam_role_by_user('<user-name>');

    Per recuperare il nome utente e l'ID utente, trova le voci delle colonne usename e usesysid nella tabella PG_USER_INFO.
    Nota: Se nella tabella PG_DEFAULT_ACL sono presenti voci utente, non è possibile eliminare l'utente.

  4. Se l'utente dispone ancora delle autorizzazioni su alcuni oggetti, controlla se gli sono state concesse autorizzazioni assumerole:

    select pg_get_iam_role_by_user('<user-name>');

    Se l'utente dispone delle autorizzazioni assumerole, revoca prima assumerole dal pubblico. Quindi, esegui il seguente comando per revocare il nome utente:

    revoke assumerole on all from public for all;
    revoke assumerole on all from <user-name> for all;
  5. (Facoltativo) Se l'utente da rimuovere dispone ancora delle autorizzazioni su alcuni oggetti, controlla se fa parte di un altro gruppo. L'utente potrebbe disporre delle autorizzazioni concesse da quel gruppo. In alternativa, l'utente potrebbe disporre delle autorizzazioni concesse al gruppo PUBLIC o a tutti gli utenti.
    Per verificare le autorizzazioni ancora concesse all'utente, esegui le seguenti query:

    select * from pg_user where usename = '<username-to-be-dropped>';
    select * from pg_group;

    Nell'output della query pg_group, controlla se ci sono voci che elencano l'utente nella colonna grolist. Se l'utente appartiene a un altro gruppo, viene elencato il relativo ID utente. Controlla le autorizzazioni concesse a quel gruppo:

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>' ;
    select * from admin.v_generate_user_grant_revoke_ddl where objname='timecards' and schemaname='postgres' and grantee='PUBLIC' and ddltype='revoke';

    Nota: Sostituisci objname e schemaname con la tua tabella e lo schema. Per impostazione predefinita, le autorizzazioni concesse al gruppo PUBLIC vengono concesse a tutti gli utenti.

  6. Trova tutti gli oggetti di proprietà dell'utente e trasferisci la proprietà a un altro utente o amministratore:

    select ddl||'<newuser>;' as ddl from admin.v_find_dropuser_objs where objowner = '<username-to-be-dropped>';

    L'output del comando precedente elenca i comandi da utilizzare per trasferire la proprietà a un nuovo utente.

  7. Ripeti i passaggi da 2 a 7 in ogni database del cluster Amazon Redshift.

  8. Per rimuovere l'utente dal database, esegui il comando seguente:

    drop user <username-to-be-dropped>;

Eliminare un gruppo

Nota: Prima di rimuovere un gruppo, è necessario revocarne le autorizzazioni nei confronti degli oggetti.

Completa i seguenti passaggi:

  1. Trova tutte le autorizzazioni concesse all'utente e poi revocale:

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>';
  2. Ripeti il passaggio 2 in ogni database del cluster Amazon Redshift. Conferma che le autorizzazioni del gruppo sono state revocate in tutti i database.

  3. Usa il comando DROP GROUP per rimuovere il gruppo di utenti.

AWS UFFICIALE
AWS UFFICIALEAggiornata 10 mesi fa