Bir VDS üzerinde PostgreSQL kullanımı sırasında veritabanına erişebilecek kullanıcılar ile bu kullanıcıların tablo bazında hangi işlemleri gerçekleştirebileceği, yönetici tarafından yapılandırılan rol ve izin modeli tarafından kontrol edilir.
Bu bölümde PostgreSQL’de kullanıcı oluşturma sürecini, rol kullanımını ve tablo–şema izinlerinin nasıl yapılandırıldığını uygulamalı olarak anlatacağız.
VDS Üzerinden PostgreSQL Bağlantısı
Başlangıçta veritabanı servisinin sorunsuz çalıştığını kontrol edelim. VDS’e SSH ile giriş yaptıktan sonra komutları girelim.
sudo systemctl start postgresql.service
sudo systemctl status postgresql.serviceÇıktıda active ibaresini görüyorsan servis hazır demektir. Yönetim işleri için çoğu zaman postgres sistem kullanıcısına geçip psql kabuğuna girmek işimizi kolaylaştırır:
sudo -i -u postgres
psqlİstemde aşağıya benzer bir ifade göreceksiniz.
postgres=#Bu noktadan sonra hem SQL komutlarını hem de \ ile başlayan psql kısayollarını kullanabilirsiniz.
VDS Üzerinde Tanımlı Rollerin Listesini İnceleme
Sistemde hangi rollerin olduğunu ve hangi özelliklere sahip olduklarını görmek için komutu çalıştıralım.
\du- Rol adlarını
- LOGIN, SUPERUSER gibi öznitelikleri
- Hangi rolün hangi gruba üye olduğunu tek tabloda görebilirsiniz.
☝️Yeni kurulu bir PostgreSQL örneğinde çoğunlukla yalnızca postgres rolü görünür. Zamanla uygulama hesapları, grup rolleri ve diğer yardımcı roller listeye eklenecektir.
PostgreSQL İçinde Grup Rolü Tanımlama
VDS üzerinde yetkileri tek tek kullanıcılara vermek yerine, önce grup roller tanımlayıp sonra kullanıcıları bu gruplara üye yapmak yönetimi çok daha kolaylaştırır. Basit bir grup rolü şu şekilde oluşturmak için komutu girelim.
CREATE ROLE rapor_ekibi;Bu rol varsayılan hâliyle veritabanına bağlanamaz. Yani LOGIN yetkisi yoktur. Amaç, bu role okuma yetkilerini atamak ve rapor kullanıcılarını bu role üye yapmaktır.
\du rapor_ekibiKomut Satırı Üzerinden Kullanıcı Rolü Oluşturma
psql kabuğu yerine doğrudan shell üzerinden çalışmak istersen, PostgreSQL’in sunduğu createuser aracı iş görecektir.
\q # psql'den çık
sudo -i -u postgres
createuser --interactive
Komut seni etkileşimli bir sihirbaz gibi yönlendirir.
- Rol adı →
uygulama_kullanici - Süper kullanıcı olsun mu →
n - Veritabanı oluşturabilsin mi →
n - Rol oluşturabilsin mi →
n
Mevcut Rolün Özelliklerini Güncelleme
Zaman içinde bir rolün yetkilerini değiştirmek, parolasını yenilemek ya da geçici olarak devre dışı bırakmak gerekebilir.
ALTER ROLE rapor_kullanici WITH CREATEDB;
ALTER ROLE rapor_kullanici WITH PASSWORD 'YeniParolaBurada';
ALTER ROLE rapor_kullanici WITH NOLOGIN;Bir Rolü Sistemden Kaldırma
Bir rolün tamamını silmek istediğinde aşağıdaki komut yeterlidir. Eğer rol herhangi bir tablonun, herhangi bir sequence’in ya da başka bir nesnenin sahibi ise PostgreSQL doğrudan silmeye izin vermez
DROP ROLE fazlalik_rol;Sahipliği devretmek gerekir bunun için aşağıdaki komut girilmelidir.
ALTER TABLE siparisler OWNER TO yeni_sahip;<br>
ALTER SEQUENCE siparisler_id_seq OWNER TO yeni_sahip;Birden fazla nesnenin sahipliğini toplu olarak el değiştirmek için de bunu komut kullanılır.
REASSIGN OWNED BY fazlalik_rol TO yeni_sahip;Tablo seviyesinde daha kontrollü yetkilendirme yapmak istediğinde, belirli kullanıcıya özel izinler vermek için şu komutlar kullanılır.
GRANT SELECT ON tablo_adi TO rapor_kullanici;<br>
GRANT INSERT, UPDATE ON tablo_adi TO api_kullanici;- Rapor kullanıcıları yalnızca SELECT izni alır.
- Web uygulamaları genellikle SELECT, INSERT ve UPDATE yetkilerine ihtiyaç duyar. Gerekiyorsa DELETE de eklenebilir.
- Yönetici roller ALTER veya DROP gibi yapısal izinlere sahiptir.
Salt Okunur Raporlama Hesabı Tasarlama
VDS üzerinde raporlama yapan ekipler için yalnızca veriyi okuyabilen ama değiştiremeyen bir hesap oluşturmak yaygın bir ihtiyaçtır. Önce terminale geçip rolümüzü oluşturalım.
CREATE ROLE report_ro<br> WITH LOGIN PASSWORD 'RaporIcınGuv3nliParola';Bu hesabın veritabanına bağlanmasını sağlamak için terminalde şu komutu yazalım.
GRANT CONNECT ON DATABASE vds_uygulama TO report_ro;Ardından public şemasını kullanma izni verelim.
GRANT USAGE ON SCHEMA public TO report_ro;Tablolardaki veriyi okuyabilmesi için tablo seviyesinde SELECT yetkisini ekleyelim.
GRANT SELECT ON ALL TABLES IN SCHEMA public TO report_ro;İleride oluşturacağımız tablolarda da otomatik SELECT yetkisi tanımlansın istiyorsak terminalde şu komutu çalıştıralım.
ALTER DEFAULT PRIVILEGES IN SCHEMA public<br> GRANT SELECT ON TABLES TO report_ro;Bu yapı sayesinde report_ro veritabanına bağlanabilir, public altındaki tüm tablolardan veri okuyabilir ve oluşturacağımız yeni tablolarda da otomatik olarak SELECT hakkına sahip olur.
VDS Üzerinde Güvenli PostgreSQL Erişimi
PostgreSQL’i daha güvenli hâle getirmek için önce kimlik doğrulama dosyasını kontrol edelim. Bu dosyayı açıp hangi IP’den, hangi kullanıcıların bağlanacağını görelim.
sudo -u postgres cat /etc/postgresql/*/main/pg_hba.confParola ile giriş yapan kullanıcılar için güvenli yöntemi ayarlayalım ve scram-sha-256 kullanacak şekilde satırı düzenleyelim.
host all all 127.0.0.1/32 scram-sha-256Değişikliği yaptıktan sonra ayarları yeniden yükleyelim.
sudo systemctl reload postgresqlŞimdi rollerin parolasını güçlendirelim. Bu işlemi doğrudan terminalden yapalım.
ALTER ROLE webapp WITH PASSWORD 'Guclu_Parola!';Parolayı görünmeden değiştirmek istersen psql içinde etkileşimli komutu kullanalım.
\password webappPostgreSQL üzerinde parola yönetimi tamamlandıktan sonra bağlantı denemelerini, port trafiğini ve servis durumunu gerçek zamanlı izlemek istersen, tüm bu veriyi anlık olarak takip etmek için Ubuntu Server’da Prometheus ve Grafana İzleme rehberine de göz atabilirsiniz.
Ardından PostgreSQL’in hangi adreste dinlediğini kontrol edelim.
sudo netstat -plnt | grep postgresUzak bağlantı gerekiyorsa postgresql.conf dosyasını açalım ve dinleme adresini güncelleyelim.
listen_addresses = '192.168.20.10'Eğer tüm arayüzleri dinlemek zorunda kalırsak güvenlik duvarına IP kısıtlaması ekleyelim.
sudo ufw allow from 203.0.113.10 to any port 5432Bu sayede PostgreSQL’i yapılandırıp erişimi daraltmış oluruz. Sadece izin verdiğimiz istemciler bağlanabilir.
Bu noktada port güvenliğini sağlamak için ek önlem almak istersen, saldırı tespit ve engelleme sistemleriyle ilgili olan Fail2ban-Regex Kullanarak Özel Log Filtreleri Oluştur yazısı VDS güvenlik katmanı için çok iyi bir tamamlayıcı olur.
Ayrıca, bu yazıda anlattığımız GRANT, REVOKE ve rol hiyerarşisi gibi detayları daha net kavramak istersen, PostgreSQL izin yapısını anlatan eğitim videoları da oldukça faydalı oluyor.