PostgreSQL - comment supprimer rapidement un utilisateur avec des privilèges existants

122

J'essaie de créer des utilisateurs de base de données restreints pour l'application sur laquelle je travaille et je souhaite supprimer l'utilisateur de la base de données Postgres que j'utilise pour expérimenter. Existe-t-il un moyen de supprimer l'utilisateur sans avoir à révoquer tous ses droits manuellement au préalable, ou de révoquer toutes les subventions d'un utilisateur?

millimoose
la source

Réponses:

144

Que diriez-vous

DROP USER <username>

Il s'agit en fait d'un alias pour DROP ROLE.

Vous devez explicitement supprimer tous les privilèges associés à cet utilisateur, ainsi que déplacer sa propriété vers d'autres rôles (ou supprimer l'objet).

Ceci est mieux réalisé par

REASSIGN OWNED BY <olduser> TO <newuser>

et

DROP OWNED BY <olduser>

Ce dernier supprimera tous les privilèges accordés à l'utilisateur.

Voir la documentation postgres pour DROP ROLE et la description plus détaillée de ceci.


Une addition:

Apparemment, essayer de supprimer un utilisateur en utilisant les commandes mentionnées ici ne fonctionnera que si vous les exécutez tout en étant connecté à la même base de données à partir de laquelle les GRANTS d'origine ont été créés, comme indiqué ici:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local

Tim Kane
la source
11
Faire: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser a donné les messages d'erreur: ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo. Cependant, a DROP OWNED BY testuserfait l'affaire, apparemment Postgres considère les subventions comme des objets déposables.
millimoose
1
Veuillez clarifier, @Tim Kane et millimoose: Je ne veux vraiment pas que les tables d'origine soient supprimées si JE DONNE SELECT ON FOO TO TESTUSER, puis DROP OWNED BY TESTUSER. Je pense que vous dites que DROP OWNED BY ne fait que supprimer les subventions, mais ne laissera pas tomber l'objet auquel la subvention a été accordée. Correct?
Andrew Wolfe
1
Andrew, mieux vaut lire la documentation pour clarification. DROP APPARTIENT va supprimer des tables appartenant à cet utilisateur. REASSIGN OWNED BY réaffectera ces tables à un autre utilisateur. Choisissez-en un.
Tim Kane
3
Si vous vous inquiétez de la suppression excessive de DROP OWNED BY après avoir effectué REASSIGN OWNED alors que des privilèges sont toujours conservés, vous pouvez REVOKE ALL ON ALL [TABLES | SEQUENCES | ...] IN SCHEMA [schema name] FROM [role]
jla
En effet, la commande DROP OWNED BY est un peu ambiguë dans sa signification et ses effets. J'ai dû lire attentivement la documentation pour bien faire les choses. Merci pour les messages les gars.
Sébastien Clément
49

La réponse acceptée a entraîné des erreurs pour moi lors de ma tentative de réattribution de propriété ou de suppression de propriété. Ce qui suit a fonctionné pour moi:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

L'utilisateur peut avoir des privilèges dans d'autres schémas, auquel cas vous devrez exécuter la ligne REVOKE appropriée avec «public» remplacé par le schéma correct. Pour afficher tous les schémas et types de privilèges pour un utilisateur, j'ai modifié la commande \ dp pour effectuer cette requête:

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

Je ne sais pas quels types de privilèges correspondent à la révocation sur TABLES, SEQUENCES ou FUNCTIONS, mais je pense que tous relèvent de l'un des trois.

Sasha Kondrashov
la source
12
Je devais aussi ajouter celui-ci:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas
3
Aussi privilèges de schéma.
greatvovan
2
Pour les privilèges de schéma:revoke USAGE on SCHEMA some_schema from username;
Alphaaa le
J'ai essayé cela mais le problème persiste dans mon cas. Je l'ai posté en tant que question distincte dans stackoverflow.com/questions/61168608/...
Andrus le
17

Notez également, si vous avez explicitement accordé:

CONNECT ON DATABASE xxx TO GROUP ,

vous devrez le révoquer séparément de DROP OWNED BY, en utilisant:

REVOKE CONNECT ON DATABASE xxx FROM GROUP

Eric E
la source
J'avais tout essayé ci-dessus et cela ne fonctionnait toujours pas pour moi, jusqu'à ce que je descende un peu plus loin, alors maintenant il me reste quelques cheveux. Certains. : D merci !!
Mitch Kent
6

J'ai dû ajouter une ligne de plus à REVOKE ...

Après avoir couru:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

Je recevais toujours l'erreur: le nom d'utilisateur ne peut pas être supprimé car certains objets en dépendent DÉTAIL: privilèges pour le schéma public

Je manquais ceci:

REVOKE USAGE ON SCHEMA public FROM username;

Ensuite, j'ai pu abandonner le rôle.

DROP USER username;
CD4
la source
Vous devrez peut-être également révoquer les privilèges pour 'SCHEMA pg_catalog' si vous avez, par exemple, créé un utilisateur pour pg_rewind qui a des privilèges sur des fonctions comme pg_read_binary_file.
GreenReaper le
5

Voici ce qui a finalement fonctionné pour moi:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;
Preti
la source
2

Il n'y a pas REVOKE ALL PRIVILEGES ON ALL VIEWS, alors j'ai fini par:

do $$
DECLARE r record;
begin
  for r in select * from pg_views where schemaname = 'myschem'
  loop
    execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
  end loop;
end $$;

et habituel:

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

pour que ce qui suit réussisse:

drop role "XUSER";
gavenkoa
la source
0

En ligne de commande, il existe une commande dropuserdisponible pour supprimer l'utilisateur de postgres.

$ dropuser someuser
SuperNova
la source
-19

J'ai fait face au même problème et j'ai maintenant trouvé un moyen de le résoudre. Vous devez d'abord supprimer la base de données de l'utilisateur que vous souhaitez supprimer. Ensuite, l'utilisateur peut être facilement supprimé.

J'ai créé un utilisateur nommé "msf" et j'ai eu du mal à supprimer l'utilisateur et à le recréer. J'ai suivi les étapes ci-dessous et j'ai réussi.

1) Supprimer la base de données

dropdb msf

2) Déposez l'utilisateur

dropuser msf

Maintenant, j'ai réussi à supprimer l'utilisateur.

Meshach Marimuthu
la source
2
C'est une approche incroyablement slash-and-burn, car elle m'aurait obligé à recréer le schéma de base de données pour chaque itération de mon travail. (Ce qui impliquait d'avoir des autorisations affinées sur un schéma de base de données existant; c'est-à-dire qu'il est préférable que le schéma de base de données reste intact.)
millimoose