En az yetki ilkesiyle rol hiyerarşisi kur (GRANT + ALTER DEFAULT PRIVILEGES)
PostgreSQLGüvenlikKomut
-- Grup rolleri (NOLOGIN): nesne sahibi, salt okur, okur-yazar
CREATE ROLE app_owner NOLOGIN;
CREATE ROLE app_readonly NOLOGIN;
CREATE ROLE app_readwrite NOLOGIN;
GRANT app_readonly TO app_readwrite;
CREATE SCHEMA app AUTHORIZATION app_owner;
-- PUBLIC'in varsayılan haklarını kıs
REVOKE ALL ON DATABASE veritabani FROM PUBLIC;
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
-- Mevcut nesneler
GRANT CONNECT ON DATABASE veritabani TO app_readonly;
GRANT USAGE ON SCHEMA app TO app_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA app TO app_readonly;
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app TO app_readwrite;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA app TO app_readwrite;
-- app_owner'ın İLERİDE oluşturacağı nesneler
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app GRANT SELECT ON TABLES TO app_readonly;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app GRANT INSERT, UPDATE, DELETE ON TABLES TO app_readwrite;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app GRANT USAGE, SELECT ON SEQUENCES TO app_readwrite;
-- Giriş yapan kullanıcılar yetkiyi yalnızca grup üyeliğiyle alır
CREATE ROLE web_app LOGIN PASSWORD 'Degistir#2026' IN ROLE app_readwrite;
CREATE ROLE report_app LOGIN PASSWORD 'Degistir#2026' IN ROLE app_readonly;
-- Tanımlı default privileges (psql: \ddp)
SELECT pg_get_userbyid(d.defaclrole) AS owner_role,
n.nspname AS schema_name,
d.defaclobjtype AS object_type,
d.defaclacl
FROM pg_default_acl d
LEFT JOIN pg_namespace n ON n.oid = d.defaclnamespace
ORDER BY 1, 2, 3;Ne yapar?
Nesne sahibi, salt okur ve okur-yazar grup rollerinden oluşan bir hiyerarşi kurar; mevcut ve gelecekte oluşturulacak tablo/sequence'lere doğru hakları verir, uygulama kullanıcılarını yalnızca grup üyeliğiyle yetkilendirir.
Ne zaman kullanılır?
Yeni uygulama şeması kurarken, superuser veya tablo sahibi olarak bağlanan uygulamaları düzeltirken ve denetim (audit) öncesi yetki sadeleştirmesinde.
Dikkat
ALTER DEFAULT PRIVILEGES yalnızca FOR ROLE ile belirtilen rolün SONRADAN oluşturduğu nesnelere uygulanır; migration aracı tabloları başka bir kullanıcıyla oluşturursa haklar gelmez, DDL'i SET ROLE app_owner ile çalıştır. GRANT ... ON ALL TABLES yalnızca o an var olan nesneleri kapsar. PG15+ ile oluşturulan veritabanlarında public şemasında CREATE hakkı PUBLIC'e zaten verilmez; eski sürümden yükseltilenlerde REVOKE gerekir. REVOKE ALL ON DATABASE ... FROM PUBLIC, CONNECT ve TEMP haklarını da alır; gereken diğer rollere ayrıca ver. Parolayı komut satırında vermek yerine psql \password kullan (log ve history'e düşmez).