07
Extension Güvenliği
| Extension | Amaç | Risk |
| pgaudit | Audit trail | GÜVENLİ |
| pgcrypto | Kriptografik fonksiyonlar | GÜVENLİ |
| pg_stat_statements | Sorgu istatistikleri | GÜVENLİ |
| postgres_fdw / dblink | Uzak bağlantı — kimlik bilgisi sızıntısı | DİKKAT |
| adminpack / file_fdw | Sunucu dosya sistemine erişim | YÜKSEK |
| plpython3u / plperlu | Untrusted dil — OS komutu çalıştırır | YÜKSEK |
shared_preload_libraries Whitelist
# Sadece onaylı kütüphaneler — restart gerekir
shared_preload_libraries =
'pg_stat_statements,pgaudit,passwordcheck'
# Mevcut değer: SHOW shared_preload_libraries;
Kurulum & Fonksiyon Erişimi
-- Yetki kontrolü: extension'ı dedicated şemaya kur
CREATE SCHEMA ext AUTHORIZATION postgres;
CREATE EXTENSION IF NOT EXISTS pgcrypto SCHEMA ext;
-- Fonksiyonlar varsayılan olarak PUBLIC'e açıktır!
REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA ext FROM PUBLIC;
GRANT EXECUTE ON FUNCTION ext.pgp_sym_decrypt(bytea, text)
TO app_secure;
ALTER DEFAULT PRIVILEGES
REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
-- Kurulu extension envanteri
SELECT e.extname, e.extversion, n.nspname AS schema,
r.rolname AS owner
FROM pg_extension e
JOIN pg_namespace n ON n.oid = e.extnamespace
JOIN pg_roles r ON r.oid = e.extowner;
SECURITY DEFINER Fonksiyonlar
CREATE FUNCTION app.rotate_key() RETURNS void
LANGUAGE plpgsql SECURITY DEFINER
SET search_path = pg_catalog, pg_temp -- zorunlu!
AS $$ ... $$;
Trusted extensions (PG13+): trusted = true olan extension'lar, veritabanında CREATE yetkisi olan superuser olmayan kullanıcılarca kurulabilir. Daha sıkı kontrol için pgextwlist ile whitelist uygula.
⚠ Dikkat: Untrusted diller (*u) ve COPY ... PROGRAM superuser'a OS seviyesinde komut çalıştırma imkânı verir — bu yüzden superuser = OS kullanıcısı postgres demektir.
08
Güvenlik Kontrol Listesi
Go-Live Öncesi
| Kontrol Maddesi | Öncelik |
| pg_hba.conf — trust kaldırıldıpg_hba_file_rules WHERE auth_method='trust' | Kritik |
| scram-sha-256 aktif, md5 hash kalmadıSHOW password_encryption; | Kritik |
| SSL/TLS etkin, TLSv1.2+ zorunluSHOW ssl; · pg_stat_ssl | Kritik |
| Superuser sayısı ≤ 2SELECT count(*) FROM pg_roles WHERE rolsuper; | Kritik |
| public şeması kısıtlandı\dn+ public | Önemli |
| pgaudit kurulu ve aktifSHOW pgaudit.log; | Önemli |
| Parola politikası uygulandı (passwordcheck + VALID UNTIL)SHOW shared_preload_libraries; | Önemli |
| Backup şifrelemesi aktifgpg / repo1-cipher-type | Önemli |
| RLS kritik tablolarda etkinpg_class WHERE relrowsecurity | Önerilen |
| log_connections açıkSHOW log_connections; | Önerilen |
Kritikhemen düzelt Önemlibu sprint Önerilenplanla
Tek Sorguda Güvenlik Denetimi
-- dbaguide.com · security quick audit
SELECT name, setting,
CASE
WHEN name = 'ssl' AND setting = 'on' THEN '✓'
WHEN name = 'password_encryption'
AND setting = 'scram-sha-256' THEN '✓'
WHEN name IN ('log_connections',
'log_disconnections')
AND setting = 'on' THEN '✓'
WHEN name = 'shared_preload_libraries'
AND setting LIKE '%pgaudit%' THEN '✓'
WHEN name = 'listen_addresses'
AND setting <> '*' THEN '✓'
ELSE '✗ KONTROL ET'
END AS status
FROM pg_settings
WHERE name IN ('ssl', 'password_encryption',
'log_connections', 'log_disconnections',
'shared_preload_libraries', 'listen_addresses');
-- RLS kapalı kritik tablolar
SELECT relname FROM pg_class
WHERE relkind = 'r' AND NOT relrowsecurity
AND relnamespace = 'app'::regnamespace;
✓ İyi Pratik: Bu kontrolleri CI/CD veya cron ile haftalık çalıştır, sonuçları izleme sistemine gönder. Her major upgrade sonrası listeyi baştan uygula.