ApsaraDB RDS for PostgreSQL, veritabanı izinlerini yönetmek için role dayalı erişim kontrolü (RBAC) modelini kullanır. Bu konu, proje veya ekip düzeyindeki erişim yönetimine uygun olan üç aşamalı bir izin modeli — sahip, okuma-yazma rolü ve salt okunur rolü — kurulumunu adım adım açıklar.
Çalışma mantığı
PostgreSQL'de roller ve kullanıcılar aynı nesne türüdür. Aradaki fark işlevseldir:
Roller, izinleri tutar ancak oturum açamaz.
Kullanıcılar,
WITH LOGINözniteliğine sahip rollerdir. Etkili izinleri, kendi oturum açma izni ile kendilerine verilen tüm rollerin izinlerinin toplamına eşittir.
Bir rolün izinlerini güncellediğinizde, bu role atanmış tüm kullanıcılar değişikliği otomatik olarak devralır. Yeniden izin ataması yapmanız gerekmez.
Her RDS örneği, dbsuperuser adlı ayrıcalıklı bir hesap içerir. Bu hesap, örnek üzerinde tam izinlere sahiptir ve yalnızca veritabanı yöneticileri tarafından kullanılmak üzere tasarlanmıştır.
İzin modeli
Bir proje veya ekip için önerilen üç aşamalı model aşağıdaki varlıkları kullanır:
| Varlık | Tür | Tablolar üzerindeki izinler | Saklı yordamlar üzerindeki izinler |
|---|---|---|---|
rdspg_owner |
Sahip (tam DDL yetkisine sahip kullanıcı) | DDL (CREATE, DROP, ALTER) + DQL (SELECT) + DML (UPDATE, INSERT, DELETE) | DDL (CREATE, DROP, ALTER) + DQL (SELECT) + saklı yordam çağırma |
rdspg_role_readwrite |
Rol | DQL (SELECT) + DML (UPDATE, INSERT, DELETE) | DQL (SELECT) + saklı yordam çağırma; saklı yordamlar içindeki DDL işlemleri izin hatası döndürür |
rdspg_role_readonly |
Rol | Yalnızca DQL (SELECT) | DQL (SELECT) + saklı yordam çağırma; saklı yordamlar içindeki DDL işlemleri izin hatası döndürür |
Uygulama kullanıcıları, rol ataması yoluyla izinleri devralır:
rdspg_readwrite—rdspg_role_readwriteizinlerini ve oturum açma özelliğini devralırrdspg_readonly—rdspg_role_readonlyizinlerini ve oturum açma özelliğini devralır
Daha ayrıntılı kontrol için gereksinimlerinize göre ek roller oluşturun.
Tablolarıpublicşemasına yerleştirmeyin. Varsayılan olarak, tüm kullanıcılarınpublicşemasında CREATE ve USAGE izni bulunur.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Bir ApsaraDB RDS for PostgreSQL örneği
dbsuperuserayrıcalıklı hesabına erişimÖrneğe bir komut satırı aracı üzerinden bağlantı (bkz. ApsaraDB RDS for PostgreSQL örneğine bağlanma)
Bir proje için izinleri ayarlama
Aşağıdaki örnek, rdspg adlı bir proje için iki şema ile izinleri ayarlar: rdspg ve rdspg_1. Tüm komutları dbsuperuser olarak çalıştırın.
Adım 1: Sahibi ve rolleri oluşturma
-- Create the owner. Replace the password with a strong password.
CREATE USER rdspg_owner WITH LOGIN PASSWORD 'asdfy181BASDfadasdbfas';
-- Create the read-write and read-only roles (no login).
CREATE ROLE rdspg_role_readwrite;
CREATE ROLE rdspg_role_readonly;
-- Grant DQL + DML permissions on tables created by rdspg_owner to rdspg_role_readwrite.
ALTER DEFAULT PRIVILEGES FOR ROLE rdspg_owner GRANT ALL ON TABLES TO rdspg_role_readwrite;
-- Grant DQL + DML permissions on sequences created by rdspg_owner to rdspg_role_readwrite.
ALTER DEFAULT PRIVILEGES FOR ROLE rdspg_owner GRANT ALL ON SEQUENCES TO rdspg_role_readwrite;
-- Grant DQL-only permission on tables created by rdspg_owner to rdspg_role_readonly.
ALTER DEFAULT PRIVILEGES FOR ROLE rdspg_owner GRANT SELECT ON TABLES TO rdspg_role_readonly;
ALTER DEFAULT PRIVILEGES komutu, rdspg_owner tarafından gelecekte oluşturulacak tüm nesnelere uygulanır. Mevcut nesneler için ayrı bir GRANT komutu gerekir.
Adım 2: Uygulama kullanıcılarını oluşturma
-- Read-write user: inherits DQL + DML permissions from rdspg_role_readwrite.
CREATE USER rdspg_readwrite WITH LOGIN PASSWORD 'dfandfnapSDhf23hbEfabf';
GRANT rdspg_role_readwrite TO rdspg_readwrite;
-- Read-only user: inherits DQL-only permission from rdspg_role_readonly.
CREATE USER rdspg_readonly WITH LOGIN PASSWORD 'F89h912badSHfadsd01zlk';
GRANT rdspg_role_readonly TO rdspg_readonly;
Adım 3: Şema oluşturma ve erişim izni verme
-- Set rdspg_owner as the owner of the rdspg schema.
CREATE SCHEMA rdspg AUTHORIZATION rdspg_owner;
-- Grant schema access to both roles.
GRANT USAGE ON SCHEMA rdspg TO rdspg_role_readwrite;
GRANT USAGE ON SCHEMA rdspg TO rdspg_role_readonly;
rdspg_readwriteverdspg_readonlykullanıcıları, şema erişimini rolleri aracılığıyla devralır. Bu kullanıcılara doğrudan izin verilmesine gerek yoktur.
En az ayrıcalık ilkesini uygulama
Uygulama bağlantıları için varsayılan kullanıcı olarak rdspg_readonly kullanın. Yalnızca yazma işlemi gerektiğinde rdspg_readwrite hesabına geçiş yapın. Bu yaklaşım, proxy ara katman ek yükü olmadan uygulama katmanında okuma/yazma ayrıştırmasını etkinleştirir.
RDS örneğinize bağlı herhangi bir salt okunur RDS örneği yoksa, bir istemciye okuma izinleri vermenizi ve diğer istemciye okuma ve yazma izinleri vermenizi öneririz. Java Database Connectivity (JDBC) bağlantılarınızı aşağıdaki gibi yapılandırın:
| İstemci | Kullanıcı | JDBC URL |
|---|---|---|
| Salt okunur istemci | rdspg_readonly |
the endpoint of read-only RDS instance 1,the endpoint of read-only RDS instance 2,the endpoint of your RDS instance |
| Okuma-yazma istemcisi | rdspg_readwrite |
the endpoint of your RDS instance |
İzin modelini genişletme
Daha fazla şema ekleme
Aynı projeye ikinci bir şema (rdspg_1) eklemek için:
CREATE SCHEMA rdspg_1 AUTHORIZATION rdspg_owner;
-- Grant the access permission on the rdspg_2 schema to roles.
-- Grant the permissions to perform DDL CREATE, DROP, and ALTER operations on tables in the rdspg_1 schema.
GRANT USAGE ON SCHEMA rdspg_1 TO rdspg_role_readwrite;
GRANT USAGE ON SCHEMA rdspg_1 TO rdspg_role_readonly;
Bu rollere atanmış tüm kullanıcılar, yeni şema erişimini otomatik olarak devralır.
Proje arasında erişim izni verme
employee_readwrite (employee projesindeki bir kullanıcı) kullanıcısına rdspg projesine okuma erişimi vermek için:
-- Grant rdspg_role_readonly permissions to employee_readwrite.
GRANT rdspg_role_readonly TO employee_readwrite;
İzinleri doğrulama
\du kullanımı
Örneğinize bağlanın ve roller ile rol üyeliklerini listelemek için \du komutunu çalıştırın:
postgres=> \du
List of roles
Role name | Attributes | Member of
------------------------+---------------+----------------------------------------------
rdspg_owner | ... | {}
rdspg_role_readwrite | Cannot login | {}
rdspg_role_readonly | Cannot login | {}
rdspg_readwrite | ... | {rdspg_role_readwrite}
rdspg_readonly | ... | {rdspg_role_readonly}
employee_readwrite | ... | {rdspg_role_readonly,employee_role_readwrite}
employee_readwrite için Member of sütunu hem rdspg_role_readonly hem de employee_role_readwrite değerlerini gösterir; bu da proje arasında okuma erişiminin etkin olduğunu doğrular.

SQL kullanımı
Tüm rollerin ve üyeliklerinin tam denetimi için:
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;
İzin örnekleri
rdspg_owner tarafından DDL işlemleri
rdspg_owner sahibi olduğu herhangi bir şemada tam DDL izinlerine sahiptir:
CREATE TABLE rdspg.test(id bigserial primary key, name text);
CREATE INDEX idx_test_name on rdspg.test(name);
rdspg_readwrite tarafından DML ve DQL işlemleri
rdspg_readwrite verileri okuyabilir ve yazabilir ancak şemayı değiştiremez:
INSERT INTO rdspg.test (name) VALUES('name0'),('name1');
SELECT id,name FROM rdspg.test LIMIT 1;
-- DDL is blocked:
CREATE TABLE rdspg.test2(id int);
ERROR: permission denied for schema rdspg
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 test
rdspg_readonly tarafından yalnızca DQL işlemleri
rdspg_readonly sorgulama yapabilir ancak verileri değiştiremez:
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)