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.
sumber
ALTER
. Kapan kamu melakukannya? Untuk tabel yang ada, Anda harus memilikiGRANT
hak.Skema publik seharusnya terlihat oleh semua pengguna. Anda tidak boleh membatasi hak skema publik hanya untuk satu grup.
Jadi, jika Anda tidak menggunakan:
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:
Bukan sebaliknya saat Anda mencoba melakukannya.
sumber
GRANT
seharusnya 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 kepublic
skema tidak berarti Anda dapat menggunakan tabel di dalamnya.