Yükleniyor...

PostgreSQL Güvenlik Rehberi: Veritabanı Güvenliği İçin Adım Adım Rehber

Yazar: Burak Balkı | Kategori: Security | Okuma Süresi: 9 dk

PostgreSQL veritabanı güvenliğini sağlamak için kimlik doğrulama, yetkilendirme, ağ yapılandırması ve veri şifreleme tekniklerini içeren kapsamlı teknik rehber.

## PostgreSQL Güvenlik Stratejilerine Giriş Günümüzün veri odaklı dünyasında, veritabanı güvenliği yalnızca bir tercih değil, kurumsal sürdürülebilirlik için bir zorunluluktur. **PostgreSQL**, sunduğu gelişmiş güvenlik mekanizmalarıyla endüstri standartlarını belirlemektedir. Bu rehberde, bir PostgreSQL sunucusunun sıfırdan nasıl güvenli hale getirileceğini, yetkilendirme modellerini ve veri şifreleme tekniklerini adım adım inceleyeceğiz. ## Temel Güvenlik Kavramları ve Tanımları PostgreSQL güvenliğini anlamak için dört temel sütunu kavramak gerekir: 1. **Kimlik Doğrulama (Authentication):** Kullanıcının kim olduğunun doğrulanması (Örn: Şifre, Sertifika). 2. **Yetkilendirme (Authorization):** Doğrulanmış kullanıcının hangi verilere erişebileceğinin belirlenmesi (RBAC). 3. **Ağ Güvenliği:** Veritabanına fiziksel ve mantıksal erişimin kısıtlanması. 4. **Veri Bütünlüğü ve Şifreleme:** Verinin hem iletim sırasında (Transit) hem de depolama sırasında (At Rest) korunması. ## Adım 1: İlk Kurulum ve İşletim Sistemi Seviyesinde Güvenlik PostgreSQL kurulumu sonrası ilk yapılması gereken, veritabanı servisinin kısıtlı haklara sahip bir işletim sistemi kullanıcısı tarafından çalıştırıldığından emin olmaktır. Asla `root` kullanıcısı ile veritabanı servisini çalıştırmayın. ```bash # PostgreSQL servisinin durumunu ve çalışan kullanıcıyı kontrol edin ps aux | grep postgres ``` Veri dizininin izinlerini sadece `postgres` kullanıcısına özel olacak şekilde kısıtlayın: ```bash chmod 700 /var/lib/postgresql/data ``` ## Adım 2: Ağ Erişimi ve pg_hba.conf Yapılandırması PostgreSQL, bağlantı isteklerini `pg_hba.conf` (Host-Based Authentication) dosyası üzerinden yönetir. Varsayılan olarak tüm bağlantılara izin vermek yerine, sadece belirli IP adreslerine ve yöntemlere izin verilmelidir. `pg_hba.conf` dosyasını düzenleyerek en güvenli yöntem olan `scram-sha-256` kullanımını zorunlu kılın: ```text # TYPE DATABASE USER ADDRESS METHOD # Yerel bağlantılar local all all scram-sha-256 # Belirli bir uygulama sunucusundan gelen bağlantılar host app_db app_user 192.168.1.50/32 scram-sha-256 # Tüm diğer bağlantıları reddet host all all 0.0.0.0/0 reject ``` ## Adım 3: Güçlü Kimlik Doğrulama ve Şifre Politikaları Eski `md5` yöntemi yerine modern ve daha güvenli olan `scram-sha-256` yöntemini tercih edin. `postgresql.conf` dosyasında şu ayarı yapın: ```sql -- Şifreleme yöntemini değiştirin SET password_encryption = 'scram-sha-256'; -- Bir kullanıcının şifresini güncelleyin ALTER USER admin_user WITH PASSWORD 'CokGucluSifre123!'; ``` ## Adım 4: Rol Tabanlı Erişim Kontrolü (RBAC) Uygulaması Veritabanında **Principle of Least Privilege** (En Az Yetki İlkesi) uygulanmalıdır. Uygulamalarınız için asla `superuser` yetkisine sahip hesaplar kullanmayın. ```sql -- Salt okunur bir rol oluşturma CREATE ROLE read_only_role; GRANT CONNECT ON DATABASE kurumsal_db TO read_only_role; GRANT USAGE ON SCHEMA public TO read_only_role; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only_role; -- Uygulama kullanıcısı oluşturma ve rol atama CREATE USER app_backend WITH PASSWORD 'AppPassword2024'; GRANT read_only_role TO app_backend; ``` ## Adım 5: Şema İzolasyonu ve Yetki Yönetimi `public` şeması varsayılan olarak tüm kullanıcıların nesne oluşturmasına izin verebilir. Bu bir güvenlik açığıdır. Bu yetkiyi geri alın: ```sql -- Public şemasındaki varsayılan yetkileri kaldırın REVOKE CREATE ON SCHEMA public FROM PUBLIC; REVOKE ALL ON DATABASE postgres FROM PUBLIC; -- Yeni bir şema oluşturup yetkilendirin CREATE SCHEMA app_data; ALTER SCHEMA app_data OWNER TO admin_user; ``` ## Adım 6: Satır Bazlı Güvenlik (Row Level Security - RLS) RLS, aynı tabloda bulunan verilerin kullanıcı bazlı filtrelenmesini sağlar. Örneğin, bir satış temsilcisi sadece kendi bölgesindeki müşterileri görebilir. ```sql -- RLS'yi etkinleştirin ALTER TABLE satislar ENABLE ROW LEVEL SECURITY; -- Bir politika oluşturun CREATE POLICY satis_temsilcisi_politikasi ON satislar USING (temsilci_id = current_user); -- Politikayı belirli bir role atayın GRANT SELECT ON satislar TO satis_ekibi; ``` ## Adım 7: SSL/TLS ile Veri İletim Güvenliği İstemci ve sunucu arasındaki trafiğin dinlenmesini önlemek için SSL sertifikası kullanımı zorunludur. `postgresql.conf` dosyasında şu parametreleri aktif edin: ```ini ssl = on ssl_cert_file = 'server.crt' ssl_key_file = 'server.key' ssl_ca_file = 'root.crt' ``` Bağlantıların SSL üzerinden gelmesini zorunlu tutmak için `pg_hba.conf` dosyasında `hostssl` kullanın: ```text hostssl all all 0.0.0.0/0 scram-sha-256 ``` ## Adım 8: Veritabanı Denetimi ve İzleme (Auditing) Kim, ne zaman, hangi veriye erişti? Bu sorunun cevabı için `pgaudit` eklentisini kullanın. Bu eklenti, yasal uyumluluk (KVKK, GDPR) için kritiktir. ```sql -- pgaudit kurulumu (İşletim sistemine yüklendikten sonra) CREATE EXTENSION pgaudit; -- Tüm DDL ve ROLE işlemlerini loglayın SET pgaudit.log = 'role, ddl'; ``` ## Adım 9: Güvenlik Duvarı ve Bağlantı Sınırlandırma DoS saldırılarını önlemek ve kaynak tüketimini kontrol etmek için maksimum bağlantı sayısını ve zaman aşımı sürelerini yapılandırın: ```sql -- Maksimum bağlantı sayısını sınırlandırın ALTER SYSTEM SET max_connections = 100; -- Boştaki bağlantıların otomatik kesilmesi ALTER SYSTEM SET idle_in_transaction_session_timeout = '30s'; ``` ## PostgreSQL Güvenliği İçin Best Practices | Kategori | Öneri | Önem Derecesi | | :--- | :--- | :--- | | **Kullanıcı Yönetimi** | Superuser kullanımını sadece bakım işlemleriyle sınırlayın. | Kritik | | **Güncellemeler** | Güvenlik yamalarını (Minor versions) aksatmadan uygulayın. | Kritik | | **Port Yönetimi** | Varsayılan 5432 portunu değiştirmeyi değerlendirin. | Orta | | **Yedekleme** | Yedeklerinizi şifreleyin ve farklı bir lokasyonda saklayın. | Yüksek | | **Bağlantı Havuzu** | PgBouncer gibi araçlar kullanarak yetkisiz erişim yüzeyini azaltın. | Orta | ## Sık Yapılan Güvenlik Hataları - **Trust Authentication Kullanımı:** `pg_hba.conf` içinde `trust` metodunu kullanmak, şifresiz girişe izin verir ve büyük bir risk teşkil eder. - **Log Dosyalarında Hassas Veri:** SQL sorgularındaki hassas verilerin loglara düşmesini engellemek için `log_statement` ayarını dikkatli yapılandırın. - **Zayıf Şifreler:** Sözlük saldırılarına açık basit şifrelerin kullanılması. - **Gereksiz Eklentiler:** Kullanılmayan veritabanı eklentileri potansiyel saldırı vektörü oluşturur. ## Sık Sorulan Sorular (SSS) **1. PostgreSQL'de verileri disk üzerinde nasıl şifreleyebilirim?** PostgreSQL çekirdeğinde yerleşik TDE (Transparent Data Encryption) bulunmaz. Ancak `pgcrypto` eklentisi ile belirli sütunları şifreleyebilir veya dosya sistemi seviyesinde (LUKS, AWS EBS Encryption) şifreleme kullanabilirsiniz. **2. Superuser yetkisi olmadan veritabanı nasıl yönetilir?** PostgreSQL 14+ ile gelen `pg_read_all_data` ve `pg_write_all_data` gibi önceden tanımlanmış roller sayesinde, tam yetki vermeden geniş erişim yetkileri tanımlayabilirsiniz. **3. public şemasını silmek güvenli mi?** Silmek yerine, `PUBLIC` rolünün bu şema üzerindeki `CREATE` yetkisini kaldırmak daha standart bir yaklaşımdır. **4. pg_hba.conf dosyasındaki değişiklikler ne zaman aktif olur?** Dosyayı kaydettikten sonra `SELECT pg_reload_conf();` komutunu çalıştırarak sunucuyu yeniden başlatmadan değişiklikleri uygulayabilirsiniz. **5. Veritabanı bağlantılarını nasıl kısıtlayabilirim?** `ALTER ROLE username CONNECTION LIMIT 5;` komutu ile kullanıcı bazlı bağlantı sınırı koyabilirsiniz. ## Özet ve Sonuç PostgreSQL güvenliği, katmanlı bir savunma stratejisi gerektirir. Ağ seviyesinden başlayarak, kimlik doğrulama protokolleri, rol tabanlı erişim kontrolleri ve satır bazlı güvenlik politikalarıyla verilerinizi koruma altına alabilirsiniz. Unutmayın ki güvenlik dinamik bir süreçtir; düzenli denetimler ve güncellemeler ile sisteminizi güncel tehditlere karşı korumalısınız.