PostgreSQL: come eliminare rapidamente un utente con privilegi esistenti


122

Sto cercando di creare utenti DB limitati per l'app su cui sto lavorando e desidero eliminare l'utente del database Postgres che sto utilizzando per la sperimentazione. Esiste un modo per abbandonare l'utente senza dover prima revocare manualmente tutti i suoi diritti o revocare tutte le concessioni di cui dispone un utente?

Risposte:


144

Che ne dite di

DROP USER <username>

Questo è in realtà un alias per DROP ROLE.

Devi eliminare esplicitamente tutti i privilegi associati a quell'utente, anche per trasferirne la proprietà ad altri ruoli (o rilasciare l'oggetto).

Il modo migliore per farlo è

REASSIGN OWNED BY <olduser> TO <newuser>

e

DROP OWNED BY <olduser>

Quest'ultimo rimuoverà tutti i privilegi concessi all'utente.

Vedi i documenti di postgres per DROP ROLE e la descrizione più dettagliata di questo.


aggiunta:

Apparentemente, provare a eliminare un utente utilizzando i comandi menzionati qui funzionerà solo se li stai eseguendo mentre sei connesso allo stesso database da cui sono stati creati i GRANTS originali, come discusso qui:

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


11
Fare: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser ha dato i messaggi di errore: ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo. Tuttavia, ha DROP OWNED BY testuserfatto il trucco, a quanto pare Postgres considera le sovvenzioni come oggetti rilasciabili.
millimoose

1
Per favore, chiarisci, @Tim Kane e millimoose: Non voglio davvero che le tabelle originali vengano eliminate se ACCONSENTO LA SELEZIONE SU FOO A TESTUSER e poi ELIMINA LA PROPRIETÀ DI TESTUSER. Penso che tu stia dicendo che DROP OWNED BY sta solo abbandonando le sovvenzioni ma non lascerà cadere l'oggetto per cui è stata fatta la sovvenzione. Corretta?
Andrew Wolfe

1
Andrew, meglio leggere la documentazione per chiarimenti. GOCCIA DI PROPRIETÀ DI sarà eliminare tabelle di proprietà di quell'utente. REASSIGN OWNED BY riassegnerà quelle tabelle a un utente diverso. Scegline uno.
Tim Kane

3
Se sei preoccupato che DROP OWNED BY possa eliminare troppo dopo aver eseguito REASSIGN OWNED quando ci sono ancora privilegi, puoi REVOCARE TUTTO SU TUTTE LE [TABELLE | SEQUENZE | ...] IN SCHEMA [nome schema] DA [ruolo]
jla

In effetti, il comando DROP OWNED BY è un po 'ambiguo nel suo significato e nei suoi effetti. Ho dovuto leggere attentamente il documento per farlo bene. Grazie per i post, ragazzi.
Sébastien Clément

49

La risposta accettata ha provocato errori per me durante il tentativo di REASSIGN OWNED BY o DROP OWNED BY. Quanto segue ha funzionato per me:

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'utente potrebbe avere privilegi in altri schemi, nel qual caso dovrai eseguire la riga REVOKE appropriata con "public" sostituita dallo schema corretto. Per mostrare tutti gli schemi e i tipi di privilegi per un utente, ho modificato il comando \ dp per fare questa query:

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

Non sono sicuro di quali tipi di privilegi corrispondano alla revoca su TABELLE, SEQUENZE o FUNZIONI, ma penso che tutti rientrino in uno dei tre.


12
Ho dovuto aggiungere anche questo:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas

3
Anche i privilegi dello schema.
greatvovan

2
Per i privilegi dello schema:revoke USAGE on SCHEMA some_schema from username;
Alphaaa

Ho provato questo ma il problema persiste nel mio caso. L'ho pubblicato come domanda separata in stackoverflow.com/questions/61168608/…
Andrus

17

Nota inoltre, se hai esplicitamente concesso:

CONNECT ON DATABASE xxx TO GROUP ,

dovrai revocarlo separatamente da DROP OWNED BY, utilizzando:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


Avevo provato tutto quanto sopra e non funzionava ancora per me, finché non ho fatto scorrere un po 'più in basso, quindi ora mi sono rimasti dei capelli. Alcuni. : D grazie !!
Mitch Kent

6

Ho dovuto aggiungere un'altra riga a REVOKE ...

Dopo l'esecuzione:

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;

Ricevo ancora l'errore: il nome utente non può essere eliminato perché alcuni oggetti dipendono da esso DETTAGLI: privilegi per lo schema pubblico

Mi mancava questo:

REVOKE USAGE ON SCHEMA public FROM username;

Poi ho potuto abbandonare il ruolo.

DROP USER username;

Potrebbe anche essere necessario revocare i privilegi per "SCHEMA pg_catalog" se, ad esempio, è stato creato un utente per pg_rewind che dispone di privilegi su funzioni come pg_read_binary_file.
GreenReaper

5

Ecco cosa ha finalmente funzionato per me:

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 ;

2

Non c'è REVOKE ALL PRIVILEGES ON ALL VIEWS, quindi ho concluso con:

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

e al solito:

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

affinché quanto segue abbia successo:

drop role "XUSER";

0

Nella riga di comando, è dropuserdisponibile un comando per eliminare l'utente da postgres.

$ dropuser someuser

-19

Ho affrontato lo stesso problema e ora ho trovato un modo per risolverlo. Per prima cosa devi eliminare il database dell'utente che desideri eliminare. Quindi l'utente può essere facilmente eliminato.

Ho creato un utente denominato "msf" e ho faticato un po 'per eliminare l'utente e ricrearlo. Ho seguito i passaggi seguenti e ci sono riuscito.

1) Elimina il database

dropdb msf

2) rilascia l'utente

dropuser msf

Ora ho eliminato l'utente con successo.


2
Questo è un approccio incredibilmente slash-and-burn, poiché mi avrebbe richiesto di ricreare lo schema del database per ogni iterazione del mio lavoro. (Il che implicava disporre di autorizzazioni granulari su uno schema di database esistente; cioè è meglio se lo schema del database rimane intatto.)
millimoose
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.