Bagaimana saya bisa membuat pengguna readonly untuk backup di PostgreSQL?

15

Benarkah IMPOSSIBLE untuk membuat pengguna cadangan hanya baca di PostgreSQL?

Saya telah dinasihati di saluran IRC bahwa Anda tidak bisa hanya memiliki pengguna cadangan saja tanpa hak kepemilikan. Saya merasa sangat aneh jadi saya ingin memastikan saya tidak melewatkan sesuatu.

Di bawah ini adalah apa yang saya coba tetapi tidak memberi saya hasil yang saya cari. Ketika saya lakukan pg_dumpdi meja tertentu saya mendapatkan Permission denied for relation...:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;

Bantuan apa pun akan sangat dihargai!

pilin
sumber

Jawaban:

9

Tidak, itu mudah (toh sekarang).

  1. Berikan izin koneksi pada pengguna baru

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. Berikan izin pada semua objek basis data saat ini . Ini khusus skema, dan Anda harus menjalankan satu salinan untuk setiap skema yang Anda inginkan agar pengguna Anda gunakan,

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    Dari dokumen , ALL TABLESsertakan semua yang Anda inginkan.

    Ada juga opsi untuk memberikan hak istimewa pada semua objek dengan tipe yang sama dalam satu skema atau lebih. Fungsi ini saat ini hanya didukung untuk tabel, sekuens, dan fungsi (tetapi perhatikan bahwa SEMUA TABEL dianggap mencakup tampilan dan tabel asing.

  3. Kemudian ALTER DEFAULT PRIVLEGESuntuk memberikan hak istimewa di masa depan SELECT untuk objek yang belum dibuat.

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;
Evan Carroll
sumber
Saya memperhatikan bahwa ketika menjalankan ALTER DEFAULT PRIVILEGES ... myReadonlyUser, 2 baris tambahan ditambahkan ke dump: ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;. Kedengarannya seperti ini berarti root tidak akan dapat melakukan apa pun di tabel baru. Apakah ini benar?
dthor
Juga, jika tabel Anda menggunakan bigintpengguna hanya baca Anda kemungkinan juga akan perluGRANT SELECT ON ALL SEQUENCES
dthor
6

Cara sederhana dan menyenangkan adalah membuat superuser dengan izin hanya baca.

  • Login psqlsebagai postgres atau superuser lainnya.
  • Buat peran pengguna super baru dan atur hanya untuk membaca:

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • Ganti <PASS>dengan kata sandi pilihan Anda.
    • Anda dapat mengganti backadmdengan nama pengguna yang dipilih. (Saya menempatkan backadmuntuk Backup Administrator).
    • JANGAN lupa tanda kutip tunggal untuk kata sandi.

Anda sekarang dapat menggunakan peran ini untuk membuat cadangan.

Rémi B.
sumber
6
Ewww. Pengguna super untuk mencadangkan? Dia secara khusus meminta untuk membaca saja. Pengguna itu satu SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEatau ALTER USER backadm set default_transaction_read_only = off;jauh dari memiliki akses tidak terbatas ke database.
Evan Carroll
Pengguna ini masih dapat menjatuhkan tabel / skema / database terlepas dari itu transaksi hanya baca.
Igor Mukhin
4

Perhatikan bahwa blog yang dirujuk dalam jawaban yang diberikan oleh @Gyre tidak akan berfungsi untuk membuat "read-only user" aplikasi "(yaitu, untuk membuat peran hanya baca untuk aplikasi web untuk terhubung ke database), dan mungkin membuka serius kerentanan keamanan, karena mudah dielakkan, seperti dijelaskan dalam respons daftar postgresql ini . Untuk referensi, oleh klien mengesampingkan pengaturan sesi:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

Rujuk presentasi 'Mengelola hak dalam postgresql' yang ditautkan dalam wiki postgres untuk metode yang lebih terperinci, mirip dengan yang diposkan dalam pertanyaan.

sundar
sumber
Ini bukan jawaban, itu kritik terhadap jawaban lain karena merasa tidak aman yang saya salin sebagai komentar. Saya sudah menjawab pertanyaan ini dengan benar sekarang.
Evan Carroll
3

Setelah menguji kembali dengan solusi Evan Caroll saya menemukan kesalahan ini:

GALAT: izin ditolak karena relasi 'tabel'

ada satu izin lain yang hilang:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

Menambahkan izin ini memungkinkan saya melakukan pencadangan dengan pengguna hanya-baca saya.

Jean-François Godbout
sumber
2

Saya telah melakukan beberapa penelitian yang tepat dan tampaknya TIDAK ada solusi untuk ini. Saya telah menemukan posting blog ini yang dengan sempurna menjelaskan apa yang perlu dilakukan. Saya harap ini membantu orang-orang yang mencari jawaban yang sama seperti saya. Jelas - mengembalikan cadangan yang dilakukan dengan cara ini adalah pertanyaan yang berbeda.

pilin
sumber
Alih-alih hanya menautkan ke posting blog, Anda harus menambahkan beberapa detail pada jawaban Anda seandainya posting blog tersebut menderita link-rot (lihat en.wikipedia.org/wiki/Link_rot )
Max Vernon
Ide dasar dari blogpost adalah ALTER USER set default_transaction_read_only = on;, yang tidak mencegah pengguna mengubahnya.
blueyed
Ewww. Pengguna super untuk mencadangkan? Dia secara khusus meminta untuk membaca saja. Pengguna itu adalah satu SET SESI KARAKTERISTIK SEBAGAI TRANSAKSI BACA MENULIS atau MENGUBAH PENGGUNA backadm set default_transaction_read_only = off; jauh dari memiliki akses tidak terbatas ke database.
Evan Carroll