Hak istimewa untuk pemilik basis data; pengguna aplikasi

15

Versi cepat:

Perintah apa yang harus saya keluarkan untuk memungkinkan pemilik database mengizinkannya mengakses tabel dalam database ini dan dapatkah ini dilakukan dari akun pemilik itu?


Versi yang lebih panjang:

Saya membuat database di RDS. Saya memiliki pengguna 'root' yang telah saya konfigurasikan dengan Amazon.

Amazon secara otomatis membuat peran grup 'rds_superuser' yang sangat istimewa, tetapi sebenarnya bukan superuser.

Saya membuat basis data dan pengguna untuk aplikasi sebagai berikut:

create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;

\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;

Saya memperbarui skrip ini untuk mencerminkan saran oleh Craig Ringer mengenai bagaimana saya seharusnya menangani ini.

Ketika aplikasi terhubung (dengan kredensial master_application) itu membuat (dan karena itu memiliki) tabel.

Masalah saya adalah bahwa saya tidak dapat menggunakan login administratif (rootish) saya untuk menjalankan kueri karena pengguna itu tidak memiliki hak istimewa di atas meja.

Saya sudah bisa menyelesaikan ini sebelumnya dengan menjalankan yang berikut dari akun aplikasi:

GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;

Tetapi tampaknya hacky untuk memiliki privat hibah bawahan kembali ke pengguna administratif.

Jadi ... Apakah ada perintah yang bisa saya jalankan sebelum atau setelah saya membuat tabel dari aplikasi yang akan memastikan bahwa pemilik database dapat mengakses tabel dalam database?


perbarui setelah mencoba ulang perubahan hak istimewa default ...

Ini masih tidak memberikan akses ke tabel; Saya melihatnya disarankan di tempat lain dan itu masuk akal, tetapi tidak berhasil untuk saya. Dari shell psql:

master_integration=> \ddp
                           Default access privileges
      Owner       | Schema | Type  |             Access privileges             
------------------+--------+-------+-------------------------------------------
 integration_root |        | table | integration_root=arwdDxt/integration_root+
                  |        |       | rds_superuser=arwdDxt/integration_root
(1 row)

master_integration=> \dp users
                           Access privileges
 Schema | Name  | Type  | Access privileges | Column access privileges 
--------+-------+-------+-------------------+--------------------------
 public | users | table |                   | 
(1 row)

Integration_root adalah pengguna superuser-ish saya dan pengguna adalah tabel di dalam basis data saya.


Memperbarui

Saya mendapat respons yang tidak berguna dari seseorang di Amazon.

Mereka meminta saya untuk memanggil ALTER DEFAULT PRIVILEGES dari login master_application. Walaupun ini mungkin akan berhasil, itu tidak akan menjawab pertanyaan saya (yang bagaimana saya membuat ini terjadi hanya dari akun rds_superuser).

Saya meminta mereka untuk mengklarifikasi ini dan mereka pergi.

Andy Davis
sumber

Jawaban:

9

Kamu ingin ALTER DEFAULT PRIVILEGES.

Berikan rds_superuserhak akses default ke semua tabel baru.

Ini hanya memengaruhi tabel yang dibuat setelah ALTER. Untuk tabel yang ada, Anda harus memiliki GRANThak.

Craig Ringer
sumber
Saya sudah mencoba melakukan ini. Saya mengatakan ini dengan buruk dalam pertanyaan awal, saya telah mengeditnya untuk menunjukkan dengan tepat perintah yang saya jalankan. Apakah saya melakukan kesalahan?
Andy Davis
Hanya mempengaruhi tabel yang dibuat setelah itu ALTER. Kapan kamu melakukannya? Untuk tabel yang ada, Anda harus memiliki GRANThak.
Craig Ringer
Saya mengubah privs default, lalu membuat tabel. Saya akan mencobanya lagi, mungkin saya membuat kesalahan.
Andy Davis
Masih tidak beruntung dengan ini, meskipun sepertinya benar-benar seperti perintah yang harus menyelesaikan masalah. Saya memperbarui perintah untuk memasukkan output dari \ ddp dan \ dp dari salah satu tabel.
Andy Davis
Sangat aneh. Bisakah Anda mereproduksi masalah dalam PostgreSQL biasa (non-RDS)?
Craig Ringer
0

Skema publik seharusnya terlihat oleh semua pengguna. Anda tidak boleh membatasi hak skema publik hanya untuk satu grup.

Jadi, jika Anda tidak menggunakan:

GRANT ALL ON SCHEMA public TO GROUP rds_superuser WITH GRANT OPTION;

Anda dapat bekerja dengan aman dengan skema publik dengan semua akun.

Jika Anda tidak ingin akun tertentu mengacaukan tabel skema publik Anda, maka buat peran baru (untuk pengguna aplikasi Anda) dan cabut hak dari peran khusus ini di dalam skema publik. Sesuatu seperti:

CREATE USER mywebuser WITH PASSWORD '*****';
REVOKE ALL PRIVILEGES ON SCHEMA public FROM mywebuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mywebuser; (or whatever rights you need to provide)

Bukan sebaliknya saat Anda mencoba melakukannya.

Alexandros
sumber
Hah? A GRANTseharusnya tidak pernah dapat mengurangi hak akses. Saya tidak yakin. Perhatikan bahwa hak pada skema tidak diwarisi oleh tabel baru dalam skema itu, jadi, memiliki akses ke publicskema tidak berarti Anda dapat menggunakan tabel di dalamnya.
Craig Ringer
Saya akhirnya bisa mencoba ini dan itu tidak membantu situasi.
Andy Davis
Saya telah mengedit pertanyaan untuk menghilangkan Hibah yang dirujuk oleh @Aleandros. Tampaknya bukan masalah, tetapi saya pikir itu adalah gangguan.
Andy Davis