Topik ini menjelaskan praktik terbaik untuk memberikan izin di Hologres menggunakan model otorisasi PostgreSQL standar (juga dikenal sebagai model izin ahli). Praktik ini membantu menyederhanakan operasi izin dan memungkinkan pengelolaan izin detail halus.
Informasi latar belakang
Hologres kompatibel dengan ekosistem PostgreSQL dan mendukung model izin PostgreSQL standar (disebut juga model izin ahli). Hologres juga menyediakan simple permission model (SPM) untuk otorisasi. Untuk detailnya, lihat Simple permission model (SPM).
Simple permission model menggunakan izin coarse-grained dan tidak cocok untuk skenario yang memerlukan kontrol izin detail halus. Model otorisasi PostgreSQL standar menawarkan granularitas izin yang lebih rinci. Jika Anda memerlukan pengelolaan izin detail halus, ikuti praktik terbaik dalam topik ini.
Pengenalan model izin PostgreSQL
Model otorisasi PostgreSQL standar menyediakan sistem pengelolaan izin yang rinci. Untuk informasi lebih lanjut, lihat PostgreSQL authorization.
Otorisasi PostgreSQL memiliki keterbatasan berikut:
-
Otorisasi PostgreSQL hanya berlaku untuk objek yang sudah ada dan tidak memengaruhi objek yang dibuat di masa depan. Contoh berikut mengilustrasikan perilaku ini.
-
User1 menjalankan pernyataan
GRANT SELECT ON ALL TABLES IN SCHEMA public TO User2;untuk memberikan izin SELECT kepada User2 pada semua tabel di skema public. -
User1 membuat tabel baru bernama table_new di skema public.
-
Ketika User2 menjalankan pernyataan
SELECT * FROM table_new, sistem mengembalikan errorPermission denied.Error tersebut terjadi karena saat User1 memberikan izin SELECT kepada User2, pemberian izin tersebut hanya mencakup tabel-tabel yang sudah ada di skema public pada saat pemberian izin, dan tidak mencakup tabel yang dibuat setelahnya di skema public.
-
-
Anda dapat menggunakan pernyataan
ALTER DEFAULT PRIVILEGESuntuk mengatur izin default untuk objek yang akan datang. Untuk detailnya, lihat ALTER DEFAULT PRIVILEGES. Izin ini hanya berlaku untuk objek yang akan datang. Contoh berikut menunjukkan cara menggunakan pernyataan ini.ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC; -- Memberikan izin baca pada tabel yang baru dibuat di skema public kepada pengguna saat ini.Anda juga dapat menggunakan pernyataan
ALTER DEFAULT PRIVILEGES FOR ROLE xxxuntuk membuat izin default bagi role lain. Anda hanya dapat berhasil mengatur izin default jika pengguna saat ini dan xxx memenuhi kondisi berikut:-
Pengguna saat ini adalah anggota dari kelompok xxx.
-
Pengguna saat ini adalah superuser, dan xxx adalah pengguna atau kelompok.
Anda dapat menggunakan perintah psql
\ddp(yang melakukan query pada tabel sistempg_catalog.pg_default_acl) untuk memverifikasi apakahALTER DEFAULT PRIVILEGEStelah dikonfigurasi dengan benar.ALTER DEFAULT PRIVILEGESbekerja seperti Pemicu. Saat tabel baru dibuat, Hologres memeriksa tabel sistempg_catalog.pg_default_acluntuk mencari aturan yang sesuai berdasarkan pengguna saat ini dan skema. Jika ditemukan kecocokan, sistem secara otomatis menerapkan aturan tersebut.Catatan-
Pencocokan hanya menggunakan pengguna saat ini, bukan kelompok pengguna tersebut.
-
Aturan
alter default privilegeshanya dievaluasi saat tabel dibuat. Mengubah pemilik tabel kemudian (menggunakanalter table tablename owner to) tidak memicualter default privileges.
Sebagai contoh, misalkan User1 termasuk dalam Group1, dan Anda ingin memberikan izin penuh pada tabel yang akan datang kepada Group1. Pertimbangkan kasus berikut:
-
Jika pengguna saat ini adalah User1, tidak ada aturan yang cocok saat pembuatan tabel.
-
Jika Anda menjalankan
set session role group1;sebelum membuat tabel untuk mengganti pengguna saat ini menjadi Group1, aturan tersebut cocok, dan sistem secara otomatis memberikan izin pada tabel baru.
-
-
Hanya pemilik tabel yang dapat menghapus tabel tersebut.
Dalam otorisasi PostgreSQL standar, penentuan apakah suatu role dapat menghapus tabel didasarkan pada kepemilikan. Role berikut dapat menghapus tabel:
-
Pemilik tabel (pengguna yang membuat tabel).
-
Pemilik skema.
-
Superuser.
-
-
Di PostgreSQL, sistem secara otomatis menetapkan kepemilikan tabel yang baru dibuat kepada pengguna yang membuatnya, yang kemudian memiliki semua izin pada tabel tersebut, termasuk kemampuan untuk menghapusnya.
Untuk mengubah pemilik tabel, gunakan pernyataan seperti berikut:
ALTER TABLE <tablename> OWNER TO user2; // Mengubah pemilik tabel dari User1 ke User2. ALTER TABLE <tablename> OWNER TO group1;// Mengubah pemilik tabel ke Group1.Mengubah pemilik tabel tunduk pada batasan berikut:
-
User1 harus merupakan pemilik tabel saat ini.
-
User1 harus merupakan anggota langsung atau tidak langsung dari Group1.
Sebagai contoh, User1 adalah anggota langsung Group1 atau anggota subkelompok dalam Group1.
-
Group1 harus memiliki izin CREATE pada skema yang berisi tabel tersebut.
-
Superuser dapat mengubah pemilik tabel apa pun.
-
Perencanaan untuk model izin PostgreSQL
Model PostgreSQL standar (model izin ahli) menyediakan izin detail halus. Sebelum menggunakannya, rencanakan izin untuk objek instans Anda sebagai berikut:
-
Berapa banyak grup izin yang ada secara total?
-
Apa tujuan masing-masing kelompok?
-
Pengguna mana yang termasuk dalam setiap kelompok?
-
Role mana yang dapat menghapus tabel, dan kapan?
-
Di skema mana setiap kelompok bekerja?
Kami merekomendasikan langkah-langkah berikut untuk merencanakan objek instans Anda:
-
Tentukan grup izin dan tujuannya.
Grup izin terbagi menjadi jenis-jenis berikut:
-
XX_DEV_GROUP: Pemilik tabel dengan izin penuh pada tabel.
-
XX_WRITE_GROUP: Izin tulis untuk memasukkan data ke tabel tertentu.
-
XX_VIEW_GROUP: Izin baca untuk melihat data di tabel tertentu.
XX merepresentasikan proyek. Misalnya, proyek PROJ1 mencakup kelompok PROJ1_DEV_GROUP, PROJ1_WRITE_GROUP, dan PROJ1_VIEW_GROUP.
CatatanKonvensi penamaan untuk kelompok hanya merupakan rekomendasi dan tidak wajib.
-
-
Tentukan skema untuk setiap grup izin.
Kami merekomendasikan menetapkan satu skema per proyek.
DEV_GROUP dapat memiliki beberapa tabel, tetapi setiap tabel hanya dimiliki oleh satu DEV_GROUP. Misalnya, jika TABLE1 dimiliki oleh PROJ1_DEV_GROUP, maka tidak dapat dimiliki oleh PROJ2_DEV_GROUP.
Seorang pengguna dapat menjadi anggota beberapa DEV_GROUP. Misalnya, User1 dapat menjadi anggota PROJ1_DEV_GROUP dan PROJ2_DEV_GROUP sekaligus.
Praktik terbaik model izin ahli Hologres 1
Praktik ini menggunakan tabel sebagai contoh. Pendekatan yang sama dapat diterapkan pada objek lain.
Pemilik tabel adalah XXX_DEV_GROUP yang sesuai. Oleh karena itu, setiap anggota DEV_GROUP dapat mengelola atau menghapus tabel tersebut.
Sebagai contoh, setelah pengguna ditambahkan ke PROJ1_DEV_GROUP, mereka memperoleh izin untuk mengelola atau menghapus tabel di proyek PROJ1. Ikuti langkah-langkah berikut:
-
Buat kelompok pengguna.
Berdasarkan kebutuhan bisnis Anda, bagi izin dan mintalah superuser membuat kelompok yang diperlukan. Untuk proyek PROJ1, jalankan pernyataan berikut:
CREATE ROLE PROJ1_DEV_GROUP; // Pemilik tabel dengan izin penuh pada tabel. CREATE ROLE PROJ1_WRITE_GROUP; // Izin tulis untuk memasukkan data ke tabel tertentu. CREATE ROLE PROJ1_VIEW_GROUP; // Izin baca untuk melihat data di tabel tertentu. -
Berikan izin skema kepada kelompok pengguna.
Berikan izin pada skema kepada kelompok yang baru dibuat. Misalnya, jika PROJ1 bekerja di SCHEMA1, jalankan pernyataan berikut:
-- Berikan izin terkait di SCHEMA1 kepada PROJ1. GRANT CREATE,usage ON schema SCHEMA1 TO PROJ1_DEV_GROUP; GRANT usage ON schema SCHEMA1 TO PROJ1_WRITE_GROUP; GRANT usage ON schema SCHEMA1 TO PROJ1_VIEW_GROUP;Catatan-
Satu proyek dapat berkorespondensi dengan beberapa skema, dan satu skema dapat berkorespondensi dengan beberapa proyek.
-
Secara default, semua pengguna memiliki izin CREATE dan USAGE di skema public.
-
-
Buat pengguna dan kelola kelompok pengguna.
Setelah memberikan izin skema, superuser harus membuat pengguna dan menambahkannya ke kelompok yang sesuai. Jalankan pernyataan berikut:
CREATE USER "USER1"; GRANT PROJ1_DEV_GROUP TO "USER1"; CREATE USER "USER2"; GRANT PROJ1_VIEW_GROUP TO "USER2"; -
Buat tabel dan berikan izin.
Saat membuat tabel atau objek lain, pembuat (yang harus merupakan anggota PROJ1_DEV_GROUP) atau superuser menjalankan pernyataan grant yang diperlukan. Asumsikan tabel baru bernama TABLE1. Jalankan pernyataan berikut:
GRANT ALL ON TABLE SCHEMA1.TABLE1 TO PROJ1_WRITE_GROUP; // Memberikan izin tulis PROJ1_WRITE_GROUP pada TABLE1. GRANT SELECT ON TABLE SCHEMA1.TABLE1 TO PROJ1_VIEW_GROUP; // Memberikan izin SELECT PROJ1_VIEW_GROUP pada TABLE1. ALTER TABLE SCHEMA1.TABLE1 owner TO PROJ1_DEV_GROUP; // Mengubah pemilik TABLE1 menjadi PROJ1_DEV_GROUP.
Praktik terbaik model izin ahli Hologres 2
Praktik ini menggunakan pernyataan ALTER DEFAULT PRIVILEGES untuk menyederhanakan otorisasi per tabel.
Tentukan terlebih dahulu proyek mana yang dimiliki oleh tabel yang baru dibuat. Ikuti langkah-langkah berikut:
-
Buat kelompok pengguna.
Berdasarkan kebutuhan bisnis Anda, bagi izin dan mintalah superuser membuat kelompok yang diperlukan. Untuk proyek PROJ1, jalankan pernyataan berikut:
CREATE ROLE PROJ1_DEV_GROUP; // Pemilik tabel dengan izin penuh pada tabel. CREATE ROLE PROJ1_WRITE_GROUP; // Izin tulis untuk memasukkan data ke tabel tertentu. CREATE ROLE PROJ1_VIEW_GROUP; // Izin baca untuk melihat data di tabel tertentu. -
Berikan izin skema kepada kelompok pengguna.
Berikan izin pada skema kepada kelompok yang baru dibuat. Misalnya, jika PROJ1 bekerja di SCHEMA1, jalankan pernyataan berikut:
-- Berikan izin terkait di SCHEMA1 kepada PROJ1. GRANT CREATE,USAGE ON SCHEMA SCHEMA1 TO PROJ1_DEV_GROUP; GRANT USAGE ON SCHEMA SCHEMA1 TO PROJ1_WRITE_GROUP; GRANT USAGE ON SCHEMA SCHEMA1 TO PROJ1_VIEW_GROUP;Catatan-
Satu proyek dapat berkorespondensi dengan beberapa skema, dan satu skema dapat berkorespondensi dengan beberapa proyek.
-
Secara default, semua pengguna memiliki izin CREATE dan USAGE di skema public.
-
-
Buat pengguna dan atur izin default.
Setelah memberikan izin skema, superuser membuat pengguna, menambahkannya ke kelompok yang sesuai, dan mengatur izin default untuk tabel yang mereka buat.
Tabel yang dibuat oleh USER1 secara default dimiliki oleh PROJ1_DEV_GROUP, dan USER1 adalah Akun Alibaba Cloud yang valid. Jalankan pernyataan berikut:
CREATE USER "USER1"; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT ALL ON TABLES TO PROJ1_DEV_GROUP; // Secara default memberikan izin baca dan tulis PROJ1_DEV_GROUP pada tabel yang dibuat oleh USER1. ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT ALL ON TABLES TO PROJ1_WRITE_GROUP; // Secara default memberikan izin baca dan tulis PROJ1_WRITE_GROUP pada tabel yang dibuat oleh USER1. ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT SELECT ON TABLES TO PROJ1_VIEW_GROUP; // Secara default memberikan izin baca PROJ1_VIEW_GROUP pada tabel yang dibuat oleh USER1. GRANT PROJ1_DEV_GROUP TO "USER1"; // Menambahkan USER1 ke PROJ1_DEV_GROUP. -
Ubah pemilik tabel.
Jika anggota lain dari DEV_GROUP perlu mengelola atau menghapus tabel, ubah pemilik tabel menjadi DEV_GROUP proyek tersebut (misalnya, PROJ1_DEV_GROUP).
Hanya pembuat tabel atau superuser yang dapat menjalankan pernyataan untuk mengubah pemilik tabel. Dalam contoh ini, pembuat harus merupakan anggota PROJ1_DEV_GROUP. Asumsikan tabel baru bernama TABLE1. Jalankan pernyataan berikut:
ALTER TABLE SCHEMA1.TABLE1 OWNER TO PROJ1_DEV_GROUP; // Mengubah pemilik TABLE1 menjadi PROJ1_DEV_GROUP.Anda dapat mengubah pemilik tabel dalam situasi berikut:
-
Superuser secara berkala mengubah pemilik tabel yang baru dibuat.
-
Anda mengubah pemilik sebelum mengelola atau menghapus tabel.
CatatanJika Anda tahu bahwa hanya pembuat tabel atau superuser yang akan mengelola atau menghapus tabel, Anda dapat melewati langkah ini.
-
-
Ubah proyek default pengguna.
Untuk mengubah proyek default pengguna, superuser atau pengguna menjalankan perintah
alter default privilegesuntuk mencabut izin default yang ada, lalu membuat izin default baru menggunakan pernyataanalter default privilegesyang baru.Untuk mengubah proyek default USER1 dari PROJ1 ke PROJ2 (tanpa memengaruhi tabel yang sudah ada), jalankan pernyataan berikut:
-- Cabut izin default yang ada. ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" REVOKE ALL ON TABLES FROM PROJ1_DEV_GROUP; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" REVOKE ALL ON TABLES FROM PROJ1_WRITE_GROUP; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" REVOKE SELECT ON TABLES FROM PROJ1_VIEW_GROUP; -- Buat izin default baru. ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT ALL ON TABLES TO PROJ2_DEV_GROUP; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT ALL ON TABLES TO PROJ2_WRITE_GROUP; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT SELECT ON TABLES TO PROJ2_VIEW_GROUP;