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

6 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:

  • Il proprietario o l'utente destinatario di privilegi predefiniti precedentemente concessi.
  • Il proprietario di qualsiasi oggetto (come database, schemi, tabelle, viste, procedure e librerie).
  • L'utente dispone di privilegi sugli oggetti menzionati in precedenza.

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

Eliminare un utente

Importante: prima di eliminare un utente, revoca le sue eventuali autorizzazioni. Quindi trasferisci la proprietà di tutti gli oggetti del database di proprietà dell'utente.

  1. Scarica e installa gli script v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql dal repository AWS Labs GitHub. Questi script creano viste in Amazon Redshift utili per i prossimi due passaggi.
    Nota: 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 hai creato uno schema admin nel cluster Amazon Redshift, crea queste viste in qualsiasi altro schema esistente. Per creare queste viste in un altro schema, modifica la definizione o crea uno schema admin. Se sono state apportate modifiche alle colonne nella definizione della vista, eliminala prima di creare una nuova vista e una nuova definizione. Se esiste già una vista e si tenta di crearne una nuova prima di eliminare quella precedente, verrà visualizzato l'errore "tabella non valida".

  2. Trova tutte le autorizzazioni concesse dall'utente che devono essere eliminate. 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: l'utente che concede nuovamente le autorizzazioni deve avere autorizzazioni sull'oggetto. Questo utente deve disporre dei diritti di concessione delle autorizzazioni verso un altro utente. Se non ci sono altri utenti autorizzati alla nuova concessione, puoi riconcedere le autorizzazioni come utente avanzato.

  3. 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 grantor e grantee rispettivamente con i nomi degli utenti che possono concedere e ricevere i permessi.
    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;

    Questa query elenca le autorizzazioni che devono essere revocate all'utente prima di poterlo rimuovere. Revoca queste autorizzazioni prima di procedere con il passaggio successivo.

  4. Esegui queste query per verificare la presenza di eventuali liste di controllo degli accessi (ACL) vuote:

    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.
    Nota: non puoi rimuovere un utente se ci sono voci utente nella tabella PG_DEFAULT_ACL.

  5. Se l'utente dispone ancora delle autorizzazioni su alcuni oggetti, controlla se gli sono state concesse autorizzazioni assume-role. Per verificarlo, esegui questa query:

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

    Se vedi autorizzazioni assumerole per l'utente da eliminare, revocale con questo comando:

    revoke assumerole on all from <user-name> for all;
  6. (Opzionale) Se l'utente da eliminare ha ancora le 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 queste query:

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

    Nell'output della seconda query, controlla la colonna grolist. Verifica se ci sono voci che elencano l'utente da eliminare. Se l'utente da rimuovere appartiene a un altro gruppo, verrà elencato l'ID utente. Se la colonna grolist indica che l'utente fa parte di un gruppo, 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';

    Assicurati di sostituire objname e schemaname con la tua rispettiva tabella e il tuo schema.
    Nota: per impostazione predefinita, le autorizzazioni concesse al gruppo PUBLIC vengono concesse a tutti gli utenti.

  7. Trova tutti gli oggetti di proprietà dell'utente, quindi trasferisci la proprietà dall'utente da rimuovere a un altro utente o amministratore:

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

    Questo output elenca i comandi che è possibile utilizzare per trasferire la proprietà a un nuovo utente. Assicurati di eseguire i comandi elencati.

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

  9. Usa il comando DROP USER per rimuovere l'utente dal database:

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

Eliminare un gruppo

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

  1. Scarica e installa gli script v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql dal repository AWS Labs GitHub. Questi script creano viste in Amazon Redshift utili per il prossimo passaggio.
    Nota: 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 hai creato uno schema admin nel cluster Amazon Redshift, puoi creare queste viste in qualsiasi altro schema esistente. Per creare queste viste in un altro schema, modifica la definizione o crea uno schema admin.

  2. Trova tutte le autorizzazioni concesse al gruppo, quindi revocale come mostrato in questo esempio:

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

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

Informazioni correlate

Note per l'utilizzo di DROP USER

Esempio di DROP GROUP

AWS UFFICIALE
AWS UFFICIALEAggiornata 6 mesi fa