Topik ini menjelaskan cara mengelola izin dalam instance ApsaraDB RDS for PostgreSQL.
Prinsip pengelolaan izin
Peran dibuat sebagai kumpulan izin dan digunakan untuk mengelola izin pada tingkat yang lebih rinci. Peran tidak memiliki izin masuk, tetapi Anda dapat membuat pengguna dengan izin masuk. Model pengelolaan ApsaraDB RDS for PostgreSQL menetapkan bahwa izin seorang pengguna terdiri dari izin peran yang terkait dengan pengguna tersebut dan izin masuk. Izin pengguna bervariasi berdasarkan izin peran yang dimiliki.
Model pengelolaan izin
Model pengelolaan ApsaraDB RDS for PostgreSQL dirancang untuk kemudahan penggunaan, efektivitas, dan cocok untuk sebagian besar skenario bisnis.
Akun istimewa dapat dibuat untuk instance RDS Anda. Akun ini memiliki semua izin pada instance RDS dan hanya digunakan oleh beberapa administrator basis data.
Anda dapat membuat satu pemilik dan dua peran bernama {project}_role_readwrite dan {project}_role_readonly untuk mengelola tim atau proyek.
CatatanUntuk pengelolaan izin yang lebih rinci, Anda dapat membuat peran tambahan sesuai kebutuhan bisnis.
Anda dapat membuat pengguna. Izin pengguna
terdiri dari izin peran yang terkait dengan pengguna tersebut dan izin masuk.Beberapa skema dapat didefinisikan untuk tim atau proyek. Kami merekomendasikan pemberian izin pada tingkat skema atau tingkat peran.
Jangan tempatkan tabel di skema bernama
public. Secara default, semua pengguna memiliki izin CREATE dan izin USAGE pada skemapublic.
Contoh pengelolaan izin
Bagian ini memberikan contoh pengelolaan izin pada tingkat proyek. Langkah-langkah ini juga dapat diterapkan untuk pengelolaan izin pada tingkat tim.
Administrator basis data dapat menggunakan akun istimewa bernama dbsuperuser dari instance RDS Anda.
Proyek Anda bernama rdspg, dan dua skema bernama rdspg dan rdspg_1 telah dibuat.
Tabel berikut menjelaskan izin pemilik dan peran yang Anda buat dalam proyek Anda.
Pemilik atau Peran | Izin pada tabel | Izin pada prosedur tersimpan |
Pemilik bernama rdspg_owner |
|
|
Peran bernama rdspg_role_readwrite |
| DQL: izin untuk melakukan operasi SELECT dan izin untuk memanggil prosedur tersimpan. Jika operasi DDL ditemukan dalam prosedur tersimpan, pesan kesalahan terkait izin akan ditampilkan. |
Peran bernama rdspg_role_readonly | DQL: izin untuk melakukan operasi SELECT. | DQL: izin untuk melakukan operasi SELECT dan izin untuk memanggil prosedur tersimpan. Jika operasi DDL ditemukan dalam prosedur tersimpan, pesan kesalahan terkait izin akan ditampilkan. |
Anda dapat memberikan izin kepada pengguna yang Anda buat sesuai kebutuhan bisnis.
Izin pengguna rdspg_readwrite terdiri dari izin peran rdspg_role_readwrite dan izin masuk.
Izin pengguna rdspg_readonly terdiri dari izin peran rdspg_role_readonly dan izin masuk.
Prosedur
Buat pemilik bernama rdspg_owner dan dua peran bernama rdspg_role_readwrite dan rdspg_role_readonly untuk proyek Anda.
Gunakan akun istimewa bernama dbsuperuser dari instance RDS Anda sebagai administrator basis data untuk melakukan operasi berikut:
--- rdspg_owner adalah nama pengguna pemilik. Kata sandi dalam contoh ini hanya untuk referensi. Ganti kata sandi dengan kata sandi sebenarnya dari pemilik. CREATE USER rdspg_owner WITH LOGIN PASSWORD 'asdfy181BASDfadasdbfas'; CREATE ROLE rdspg_role_readwrite; CREATE ROLE rdspg_role_readonly; --- Berikan izin untuk melakukan operasi DQL SELECT dan DML UPDATE, INSERT, dan DELETE pada tabel yang dibuat menggunakan kredensial pemilik rdspg_owner kepada peran rdspg_role_readwrite. ALTER DEFAULT PRIVILEGES FOR ROLE rdspg_owner GRANT ALL ON TABLES TO rdspg_role_readwrite; --- Berikan izin untuk melakukan operasi DQL SELECT dan DML UPDATE, INSERT, dan DELETE pada urutan yang dibuat menggunakan kredensial pemilik rdspg_owner kepada peran rdspg_role_readwrite. ALTER DEFAULT PRIVILEGES FOR ROLE rdspg_owner GRANT ALL ON SEQUENCES TO rdspg_role_readwrite; --- Berikan izin untuk melakukan operasi DQL SELECT pada tabel yang dibuat menggunakan kredensial pemilik rdspg_owner kepada peran rdspg_role_readonly. ALTER DEFAULT PRIVILEGES FOR ROLE rdspg_owner GRANT SELECT ON TABLES TO rdspg_role_readonly;Buat dua pengguna bernama rdspg_readwrite dan rdspg_readonly.
Gunakan akun istimewa bernama dbsuperuser dari instance RDS Anda sebagai administrator basis data untuk melakukan operasi berikut:
--- Berikan izin untuk melakukan operasi DQL SELECT dan DML UPDATE, INSERT, dan DELETE kepada pengguna rdspg_readwrite. CREATE USER rdspg_readwrite WITH LOGIN PASSWORD 'dfandfnapSDhf23hbEfabf'; GRANT rdspg_role_readwrite TO rdspg_readwrite; --- Berikan izin untuk melakukan operasi DQL SELECT kepada pengguna rdspg_readonly. CREATE USER rdspg_readonly WITH LOGIN PASSWORD 'F89h912badSHfadsd01zlk'; GRANT rdspg_role_readonly TO rdspg_readonly;Buat skema bernama rdspg dan berikan izin pada skema tersebut kepada peran rdspg_role_readwrite dan rdspg_role_readonly.
Gunakan akun istimewa bernama dbsuperuser dari instance RDS Anda sebagai administrator basis data untuk melakukan operasi berikut:
--- Tentukan pemilik rdspg_owner sebagai pemilik skema rdspg. CREATE SCHEMA rdspg AUTHORIZATION rdspg_owner; --- Berikan izin pada skema rdspg kepada peran rdspg_role_readwrite dan rdspg_role_readonly. GRANT USAGE ON SCHEMA rdspg TO rdspg_role_readwrite; GRANT USAGE ON SCHEMA rdspg TO rdspg_role_readonly;CatatanPengguna rdspg_readwrite dan rdspg_readonly mewarisi perubahan pada izin peran terkait mereka. Anda tidak perlu memberikan izin secara langsung kepada pengguna ini.
Skenario
Skenario 1: Gunakan pemilik rdspg_owner untuk melakukan operasi DDL CREATE, DROP, dan ALTER pada tabel dalam skema rdspg
CREATE TABLE rdspg.test(id bigserial primary key, name text);
CREATE INDEX idx_test_name on rdspg.test(name);Skenario 2: Gunakan pengguna rdspg_readwrite atau rdspg_readonly untuk pengembangan bisnis
Pengguna yang digunakan untuk manajemen bisnis mengikuti prinsip hak istimewa minimal (PoLP). Kami merekomendasikan penggunaan pengguna rdspg_readonly untuk manajemen bisnis. Gunakan pengguna rdspg_readwrite hanya saat Anda harus melakukan operasi DML. PoLP memfasilitasi pemisahan baca/tulis pada lapisan bisnis.
Pemisahan baca/tulis pada lapisan bisnis membantu mengurangi biaya tambahan dan penurunan kinerja yang disebabkan oleh pemisahan baca/tulis otomatis yang dilakukan oleh middleware proxy.
Jika tidak ada instance RDS baca-saja yang terpasang pada instance RDS Anda, kami merekomendasikan pemberian izin baca kepada satu klien dan izin baca-tulis kepada klien lainnya. Konfigurasi ini mendukung pembuatan instance RDS baca-saja. Kami juga merekomendasikan penggunaan pengguna rdspg_readonly untuk klien yang diberikan izin baca.
Gunakan pengguna rdspg_readonly untuk klien yang diberikan izin baca dan atur URL Java Database Connectivity (JDBC) ke
titik akhir instance RDS baca-saja 1,titik akhir instance RDS baca-saja 2,titik akhir instance RDS Anda.Gunakan pengguna rdspg_readwrite untuk klien yang diberikan izin baca dan tulis dan atur URL JDBC ke
titik akhir instance RDS Anda.
Gunakan pengguna rdspg_readwrite untuk melakukan operasi DQL SELECT dan DML UPDATE, INSERT, dan DELETE pada tabel dalam skema rdspg.
INSERT INTO rdspg.test (name) VALUES('name0'),('name1'); SELECT id,name FROM rdspg.test LIMIT 1; --- Pengguna rdspg_readwrite tidak memiliki izin untuk melakukan operasi DDL CREATE, DROP, dan ALTER. CREATE TABLE rdspg.test2(id int); ERROR: permission denied for schema rdspg LINE 1: create table rdspg.test2(id int); DROP TABLE rdspg.test; ERROR: must be owner of table test ALTER TABLE rdspg.test ADD id2 int; ERROR: must be owner of table test CREATE INDEX idx_test_name on rdspg.test(name); ERROR: must be owner of table testGunakan pengguna rdspg_readonly untuk melakukan operasi DQL SELECT pada tabel dalam skema rdspg.
INSERT INTO rdspg.test (name) VALUES('name0'),('name1'); ERROR: permission denied for table test SELECT id,name FROM rdspg.test LIMIT 1; id | name ----+------- 1 | name0 (1 row)
Skenario 3: Berikan izin pada proyek kepada proyek lain
Anda dapat memberikan izin baca pada tabel proyek rdspg kepada pengguna employee_readwrite yang termasuk dalam proyek employee. Gunakan akun istimewa bernama dbsuperuser dari instance RDS Anda sebagai administrator basis data untuk melakukan operasi berikut:
--- Berikan izin peran rdspg_role_readonly kepada pengguna employee_readwrite.
GRANT rdspg_role_readonly TO employee_readwrite;Skenario 4: Buat skema bernama rdspg_1 dan berikan izin pada skema rdspg_2 kepada peran
Pengguna rdspg_readwrite, rdspg_readonly, dan employee_readwrite mewarisi perubahan pada izin peran terkait mereka. Anda tidak perlu memberikan izin secara langsung kepada pengguna ini. Gunakan akun istimewa bernama dbsuperuser dari instance RDS Anda sebagai administrator basis data untuk melakukan operasi berikut:
CREATE SCHEMA rdspg_1 AUTHORIZATION rdspg_owner;
--- Berikan izin akses pada skema rdspg_2 kepada peran.
--- Berikan izin untuk melakukan operasi DDL CREATE, DROP, dan ALTER pada tabel dalam skema rdspg_1.
GRANT USAGE ON SCHEMA rdspg_1 TO rdspg_role_readwrite;
GRANT USAGE ON SCHEMA rdspg_1 TO rdspg_role_readonly;Kueri pada izin
Jika Anda menggunakan model pengelolaan yang dijelaskan dalam topik ini, gunakan salah satu metode berikut untuk menanyakan izin pengguna dalam instance RDS Anda:
Gunakan alat baris perintah untuk terhubung ke instance RDS Anda. Untuk informasi lebih lanjut, lihat Terhubung ke Instance ApsaraDB RDS for PostgreSQL. Kemudian jalankan perintah
\du.
Keluaran perintah pada gambar di atas menunjukkan bahwa
rdspg_role_readonly,employee_role_readwriteditampilkan di kolom Member of untuk pengguna employee_readwrite. Oleh karena itu, izin operasi DQL dan DML diberikan kepada pengguna employee_readwrite dan izin operasi DQL diberikan kepada tabel dalam proyek rdspg.Gunakan SQL untuk menanyakan izin.
SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolconnlimit, r.rolvaliduntil, ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) as memberof , r.rolreplication , r.rolbypassrls FROM pg_catalog.pg_roles r WHERE r.rolname !~ '^pg_' ORDER BY 1;