Comment résoudre l'erreur « Impossible de supprimer l'utilisateur » dans Amazon Redshift ?

Lecture de 6 minute(s)
0

Je ne parviens pas à supprimer un utilisateur ou un groupe dans Amazon Redshift.

Brève description

Lorsque vous essayez de supprimer un utilisateur dans Amazon Redshift, l'un des messages d'erreur suivants peut s'afficher :

  • ERREUR : le « nom d'utilisateur » de l'utilisateur ne peut pas être supprimé car certains objets en dépendent
  • ERREUR : le « nom d'utilisateur » de l'utilisateur ne peut pas être supprimé car l'utilisateur a un privilège sur un objet
  • ERREUR : le « nom d'utilisateur » de l'utilisateur ne peut pas être supprimé car l'utilisateur possède un objet

Ces erreurs peuvent se produire lorsque vous essayez de supprimer les types d'utilisateurs suivants :

  • Le propriétaire ou l'utilisateur cible dispose des privilèges par défaut précédemment accordés.
  • Le propriétaire de tout objet (comme les bases de données, schémas, tableaux, vues, procédures et bibliothèques).
  • Un utilisateur qui possède des privilèges sur les objets mentionnés précédemment.

Pour résoudre ces messages d'erreur, supprimez d'abord toutes les autorisations utilisateur. Transférez ensuite la propriété des objets ou supprimez la propriété collective des objets.

Important : Vous devez révoquer les autorisations des utilisateurs et des groupes sur toutes les bases de données du cluster Amazon Redshift.

Résolution

Supprimer un utilisateur

Important : Avant de supprimer un utilisateur, révoquez toutes les autorisations utilisateur. Transférez ensuite la propriété de tous les objets de base de données appartenant à l'utilisateur.

1.    Téléchargez et installez les scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql depuis le référentiel GitHub d'AWS Labs. Ces scripts créent des vues dans Amazon Redshift qui sont utilisées pour les deux étapes suivantes.

Remarque : Les vues des scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql utilisent le schéma administrateur dans leur définition. Si aucun schéma administrateur n'est créé sur le cluster Amazon Redshift, créez ces vues dans n'importe quel autre schéma existant. Pour créer ces vues dans un autre schéma, modifiez la définition ou créez un schéma administrateur. En cas de modification de colonne dans la définition de votre vue, supprimez votre vue avant de créer une nouvelle vue et une nouvelle définition. Si une vue existe déjà et que vous essayez d'en créer une nouvelle avant de supprimer l'ancienne vue,vous recevez le message d'erreur « non valid table » (table non valide).

2.    Recherchez toutes les autorisations utilisateur accordées par utilisateur qui doivent être supprimées. Accordez ensuite à nouveau ces autorisations en tant qu'autre utilisateur. Il est recommandé que cet utilisateur soit un super-utilisateur.

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;

Remarque : L'utilisateur qui rétablit les autorisations doit être un utilisateur disposant d'autorisations sur l'objet. Cet utilisateur doit avoir des droits de réoctroyer des autorisations à un autre utilisateur. Si aucun autre utilisateur n'est autorisé à réoctroyer des autorisations, vous pouvez les réoctroyer en tant que super-utilisateur.

3.    Trouvez toutes les autorisations accordées à l'utilisateur, puis révoquez-les :

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

Remarque : Remplacez « grantor » (concédant) et « grantee » (bénéficiaire) par les noms d'utilisateur qui peuvent accorder et recevoir des autorisations, respectivement.

Si votre requête ne renvoie aucun enregistrement ou si la commande « drop user » (supprimer l’utilisateur) échoue, exécutez cette requête :

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 requête répertorie les autorisations qui doivent être révoquées pour que l'utilisateur puisse être supprimé. Révoquez ces autorisations avant de passer à l'étape suivante.

4.    Exécutez ces requêtes pour vérifier la présence de listes de contrôle d'accès (ACL, Access Control List) vides :

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

Pour récupérer le nom et l’identifiant de l’utilisateur, recherchez les entrées des colonnes usename et usesysid dans le tableau PG_USER.
Remarque : Vous ne pouvez pas supprimer un utilisateur s'il existe des entrées utilisateur dans la table PG_DEFAULT_ACL.

5.    Si l'utilisateur possède toujours des autorisations sur certains objets, vérifiez s'il a obtenu des autorisations d'assumer le rôle. Pour vérifier cela, exécutez cette requête :

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

Si vous voyez des autorisations assumerole pour supprimer l'utilisateur, révoquez-les à l'aide de cette commande :

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

6.    (Facultatif) Si l'utilisateur à supprimer possède toujours des autorisations sur certains objets, vérifiez s'il fait partie d'un autre groupe. L'utilisateur peut avoir des autorisations accordées par ce groupe. Il se peut également que l'utilisateur dispose d'autorisations accordées au groupe PUBLIC ou à tous les utilisateurs.

Pour confirmer les autorisations qui sont toujours accordées à l'utilisateur, exécutez les requêtes suivantes :

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

Dans le résultat de la deuxième requête, vérifiez la colonne grolist. Vérifiez s'il existe des entrées répertoriant l'utilisateur à supprimer. Si l'utilisateur à supprimer appartient à un autre groupe, son ID utilisateur est répertorié.

Si votre colonne grolist indique que l'utilisateur fait partie d'un groupe, vérifiez les autorisations accordées à ce groupe :

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

Assurez-vous de remplacer objname et schemaname par votre tableau et votre schéma respectifs.

Remarque : Par défaut, les autorisations accordées au groupe PUBLIC sont accordées à tous les utilisateurs.

7.    Recherchez tous les objets appartenant à l'utilisateur, puis transférez la propriété de l'utilisateur que vous souhaitez révoquer à un autre utilisateur ou administrateur :

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

Ce résultat répertorie les commandes que vous pouvez utiliser pour transférer la propriété à un nouvel utilisateur. Assurez-vous d'exécuter les commandes indiquées.

8.    Répétez les étapes 2 à 7 dans chaque base de données du cluster Amazon Redshift.

9.    Utilisez la commande DROP USER pour supprimer l'utilisateur de la base de données :

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

Supprimer un groupe

Remarque : Avant de supprimer un groupe, vous devez révoquer toutes les autorisations que le groupe possède pour les objets.

1.     Téléchargez et installez les scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql depuis le référentiel GitHub d'AWS Labs. Ces scripts créent des vues dans Amazon Redshift qui sont utiles pour l'étape suivante.

Remarque : Les vues des scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql utilisent le schéma administrateur dans leur définition. Si aucun schéma administrateur n'a été créé sur le cluster Amazon Redshift, vous pouvez créer ces vues dans n'importe quel autre schéma existant. Pour créer ces vues dans un autre schéma, modifiez la définition ou créez un schéma administrateur.

2.    Trouvez toutes les autorisations accordées au groupe, puis révoquez-les, comme indiqué dans cet exemple :

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

3.    Répétez l'étape 2 dans chaque base de données du cluster Amazon Redshift. Confirmez que les autorisations du groupe sont révoquées dans toutes les bases de données.

4.    Utilisez la commande DROP GROUP pour supprimer le groupe d'utilisateurs.

Informations connexes

Notes d'utilisation de la commande DROP USER

Exemple de commande DROP GROUP

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 9 mois