Tüm Ürünler
Search
Belge Merkezi

ApsaraDB RDS:Best practices for permission management in ApsaraDB RDS for PostgreSQL

Son Güncelleme:Oct 03, 2026

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_readwrite izinlerini ve oturum açma özelliğini devralır

  • rdspg_readonly — rdspg_role_readonly izinlerini 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ın public şemasında CREATE ve USAGE izni bulunur.

Ön koşullar

Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:

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_readwrite ve rdspg_readonly kullanı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.

Run the \du command to query permissions

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)

Sonraki adımlar