PostgreSQL - cara cepat menjatuhkan pengguna dengan hak istimewa yang ada

122

Saya mencoba membuat pengguna DB terbatas untuk aplikasi yang saya kerjakan, dan saya ingin menghapus pengguna database Postgres yang saya gunakan untuk bereksperimen. Apakah ada cara untuk menghentikan pengguna tanpa harus mencabut semua haknya secara manual terlebih dahulu, atau mencabut semua hibah yang dimiliki pengguna?

millimoose.dll
sumber

Jawaban:

144

Bagaimana tentang

DROP USER <username>

Ini sebenarnya adalah alias untuk DROP ROLE.

Anda harus secara jelas melepaskan hak istimewa yang terkait dengan pengguna tersebut, juga untuk memindahkan kepemilikannya ke peran lain (atau melepaskan objek).

Ini paling baik dicapai oleh

REASSIGN OWNED BY <olduser> TO <newuser>

dan

DROP OWNED BY <olduser>

Yang terakhir akan menghapus hak istimewa yang diberikan kepada pengguna.

Lihat dokumen postgres untuk DROP ROLE dan penjelasan lebih rinci tentang ini.


Tambahan:

Rupanya, mencoba untuk menjatuhkan pengguna dengan menggunakan perintah yang disebutkan di sini hanya akan berfungsi jika Anda menjalankannya saat terhubung ke database yang sama dengan mana GRANTS asli dibuat, seperti yang dibahas di sini:

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

Tim Kane
sumber
11
Melakukan: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser memberikan pesan kesalahan: ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo. Namun, setelah DROP OWNED BY testusermelakukan triknya, ternyata Postgres menganggap hibah sebagai objek yang bisa dijatuhkan.
millimoose
1
Mohon klarifikasi, @Tim Kane dan millimoose: Saya benar-benar tidak ingin tabel asli dihapus jika SAYA BERIKAN PILIHAN PADA FOO UNTUK PENGUJI dan kemudian DROP Milik Penguji. Saya pikir Anda mengatakan bahwa DROP OWNED BY hanya menjatuhkan hibah tetapi tidak akan menjatuhkan objek yang telah menerima hibah. Benar?
Andrew Wolfe
1
Andrew, sebaiknya baca dokumentasi untuk klarifikasi. DROP OWNED BY akan menghapus tabel milik pengguna tersebut. REASSIGN OWNED BY akan menetapkan ulang tabel tersebut ke pengguna lain. Pilih satu.
Tim Kane
3
Jika Anda khawatir tentang DROP OWNED BY mengambil terlalu banyak setelah melakukan REASSIGN OWNED ketika ada hak istimewa yang masih ditahan, Anda dapat MENCABUT SEMUA DI SEMUA [TABLES | URUTAN | ...] DALAM SKEMA [nama skema] DARI [peran]
jla
Memang, perintah DROP OWNED BY agak ambigu dalam arti dan efeknya. Saya harus membaca dokumen dengan cermat untuk melakukannya dengan benar. Terima kasih untuk kirimannya guys.
Sébastien Clément
49

Jawaban yang diterima mengakibatkan kesalahan bagi saya saat mencoba REASSIGN OWNED BY atau DROP OWNED BY. Yang berikut berhasil untuk saya:

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;

Pengguna mungkin memiliki hak istimewa di skema lain, dalam hal ini Anda harus menjalankan baris REVOKE yang sesuai dengan "publik" diganti dengan skema yang benar. Untuk menampilkan semua skema dan jenis hak istimewa untuk pengguna, saya mengedit perintah \ dp untuk membuat kueri ini:

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

Saya tidak yakin jenis hak istimewa mana yang sesuai dengan pencabutan di TABEL, URUTAN, atau FUNGSI, tapi menurut saya semuanya termasuk dalam salah satu dari tiga.

Sasha Kondrashov
sumber
12
Saya harus menambahkan yang ini juga:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas
3
Juga hak istimewa skema.
greatvovan
2
Untuk hak skema:revoke USAGE on SCHEMA some_schema from username;
Alphaaa
Saya mencoba ini tetapi masalah tetap ada dalam kasus saya. Saya mempostingnya sebagai pertanyaan terpisah di stackoverflow.com/questions/61168608/…
Andrus
17

Perhatikan juga, jika Anda telah secara eksplisit memberikan:

CONNECT ON DATABASE xxx TO GROUP ,

Anda harus mencabut ini secara terpisah dari DROP OWNED BY, menggunakan:

REVOKE CONNECT ON DATABASE xxx FROM GROUP

Eric E
sumber
Saya telah mencoba semua hal di atas dan tetap saja tidak berhasil untuk saya, sampai saya menggulir ke bawah sedikit lebih jauh, jadi sekarang saya memiliki beberapa rambut tersisa. Beberapa. : D terima kasih !!
Mitch Kent
6

Saya harus menambahkan satu baris lagi ke REVOKE ...

Setelah berlari:

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;

Saya masih menerima kesalahan: nama pengguna tidak dapat dihapus karena beberapa objek bergantung padanya DETAIL: hak istimewa untuk skema publik

Saya melewatkan ini:

REVOKE USAGE ON SCHEMA public FROM username;

Kemudian saya bisa menghentikan peran itu.

DROP USER username;
CD4
sumber
Anda mungkin juga perlu mencabut hak istimewa untuk 'SCHEMA pg_catalog' jika Anda, misalnya, telah membuat pengguna untuk pg_rewind yang memiliki hak istimewa atas fungsi seperti pg_read_binary_file.
GreenReaper
5

Inilah yang akhirnya berhasil untuk saya:

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
sumber
2

Tidak ada REVOKE ALL PRIVILEGES ON ALL VIEWS, jadi saya akhiri dengan:

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

dan biasa:

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

agar berikut ini berhasil:

drop role "XUSER";
gavenkoa.dll
sumber
0

Di baris perintah, ada perintah yang dropusertersedia untuk melakukan drop user dari postgres.

$ dropuser someuser
SuperNova
sumber
-19

Saya menghadapi masalah yang sama dan sekarang menemukan cara untuk menyelesaikannya. Pertama, Anda harus menghapus database pengguna yang ingin Anda hapus. Kemudian pengguna dapat dengan mudah dihapus.

Saya membuat pengguna bernama "msf" dan berjuang beberapa saat untuk menghapus pengguna dan membuatnya kembali. Saya mengikuti langkah-langkah di bawah ini dan berhasil.

1) Jatuhkan database

dropdb msf

2) jatuhkan pengguna

dropuser msf

Sekarang saya berhasil menjatuhkan pengguna.

Meshach Marimuthu
sumber
2
Ini adalah pendekatan tebang-dan-bakar yang luar biasa, karena saya harus membuat ulang skema database untuk setiap iterasi pekerjaan saya. (Yang melibatkan memiliki izin mendetail pada skema database yang ada; yaitu yang terbaik jika skema database tetap tidak tersentuh.)
millimoose