Como resolvo o erro “o usuário não pode ser descartado” no Amazon Redshift?

6 minuto de leitura
0

Não consigo descartar um usuário ou grupo no Amazon Redshift.

Breve descrição

Ao tentar descartar um usuário no Amazon Redshift, você pode ver uma destas mensagens de erro:

  • ERRO: o usuário "username" não pode ser descartado porque alguns objetos dependem dele
  • ERRO: o usuário "username" não pode ser descartado porque o usuário tem um privilégio em algum objeto
  • ERRO: o usuário "username" não pode ser descartado porque o usuário possui algum objeto

Esses erros podem ocorrer quando você tenta descartar os seguintes tipos de usuários:

  • O proprietário ou usuário-alvo dos privilégios padrão que foram concedidos anteriormente.
  • O proprietário de qualquer objeto (como bancos de dados, esquemas, tabelas, visualizações, procedimentos e bibliotecas).
  • Um usuário que tem privilégios nos objetos mencionados anteriormente.

Para resolver essas mensagens de erro, primeiro remova todas as permissões de usuário. Em seguida, transfira a propriedade do objeto ou remova a propriedade de grupo dos objetos.

Importante: você deve revogar as permissões de usuário e grupo de todos os bancos de dados no cluster do Amazon Redshift.

Resolução

Descartar um usuário

Importante: antes de descartar um usuário, revogue todas as permissões dele. Em seguida, transfira a propriedade de qualquer objeto do banco de dados pertencente ao usuário.

1.    Baixe e instale os scripts v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql do repositório do GitHub do AWS Labs. Esses scripts criam visualizações no Amazon Redshift que são usadas nas próximas duas etapas.

Observação: as visualizações dos scripts v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql usam o esquema de admin na sua definição. Se você não tiver um esquema de admin criado no cluster do Amazon Redshift, crie essas visualizações em qualquer outro esquema existente. Para criar essas visualizações em outro esquema, modifique a definição ou crie um esquema de admin. Se houver alguma alteração na coluna em sua definição de visualização, descarte-a antes de criar uma nova visualização e definição. Se uma visualização já existir e você tentar criar uma nova antes de descartar a antiga, receberá um erro de "tabela inválida".

2.    Encontre todas as permissões de usuário concedidas por usuário que deve ser descartado. Em seguida, volte a conceder essas permissões como outro usuário. É uma prática recomendada que esse usuário seja um superusuário.

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;

Observação: o usuário que concede novamente as permissões deve ter permissões no objeto. Ele deve conceder direitos de permissão a outro usuário. Se não houver outros usuários com essas permissões, você poderá conceder novamente as permissões como superusuário.

3.    Encontre todas as permissões concedidas ao usuário e, em seguida, revogue-as:

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

Observação: substitua concessor e beneficiário pelos nomes de usuário que podem conceder e receber permissões, respectivamente.

Se a sua consulta não retornar registros ou se o comando de descarte de usuário falhar, execute esta consulta:

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;

A consulta lista as permissões que devem ser revogadas do usuário antes que ele possa ser descartado. Revogue essas permissões antes de passar para a próxima etapa.

4.    Execute estas consultas para verificar se há listas de controle de acesso (ACLs) vazias:

select \* from pg\_user where usename = '<username-to-be-dropped>'; select \* from pg\_default\_acl where defacluser= <user-id>;

Para recuperar o nome e o ID do usuário, localize as entradas das colunas usename e usesysid na tabela PG_USER.
Observação: não será possível descartar um usuário se houver alguma entrada de usuário na tabela PG_DEFAULT_ACL.

5.    Se o usuário ainda tiver permissões em alguns objetos, verifique se ele recebeu permissões de assumir perfil. Para verificar isso, execute esta consulta:

select pg\_get\_iam\_role\_by\_user('<user-name>');

Se você vir permissões assumerole para o usuário a ser descartado, revogue-as com este comando:

revoke assumerole on all from <user-name> for all;

6.    (Opcional) Se o usuário a ser descartado ainda tiver permissões em alguns objetos, verifique se ele faz parte de outro grupo. O usuário pode ter permissões concedidas por esse grupo. Ou o usuário pode ter permissões concedidas ao grupo PUBLIC ou a todos os usuários.

Para confirmar as permissões que ainda estão concedidas ao usuário, execute estas consultas:

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

Na saída da segunda consulta, verifique a coluna grolist. Verifique se há alguma entrada que liste o usuário a ser descartado. Se o usuário a ser descartado pertencer a outro grupo, a ID desse usuário estará listada.

Se a coluna grolist indicar que o usuário faz parte de um grupo, verifique as permissões concedidas a esse grupo:

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';

Certifique-se de substituir objname e schemaname pela respectiva tabela e esquema.

Observação: por padrão, as permissões concedidas ao grupo PUBLIC são concedidas a todos os usuários.

7.    Localize todos os objetos pertencentes ao usuário e, em seguida, transfira a propriedade do usuário que você deseja descartar para outro usuário ou administrador:

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

Essa saída lista os comandos que você pode usar para transferir a propriedade para um novo usuário. Certifique-se de executar os comandos listados.

8.    Repita as etapas de 2 a 7 em cada banco de dados no cluster do Amazon Redshift.

9.    Use o comando DROP USER para remover o usuário do banco de dados:

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

Descartar um grupo

Observação: antes de descartar um grupo, você deve revogar todas as permissões que ele tem para objetos.

1.     Baixe e instale os scripts v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql do repositório do GitHub do AWS Labs. Esses scripts criam visualizações no Amazon Redshift que são úteis para a próxima etapa.

Observação: as visualizações dos scripts v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql usam o esquema de admin na sua definição. Se você não tiver um esquema de admin criado no cluster do Amazon Redshift, poderá criar essas visualizações em qualquer outro esquema existente. Para criar essas visualizações em outro esquema, modifique a definição ou crie um esquema de admin.

2.    Encontre todas as permissões concedidas ao grupo e, em seguida, revogue-as, conforme mostrado neste exemplo:

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>';

3.    Repita a etapa 2 em cada banco de dados no cluster do Amazon Redshift. Confirme se as permissões do grupo foram revogadas em todos os bancos de dados.

4.    Use o comando DROP GROUP para remover o grupo de usuários.

Informações relacionadas

Notas de uso do DROP USER

Exemplo do DROP GROUP

AWS OFICIAL
AWS OFICIALAtualizada há 9 meses