PostgreSQL erişim denetimi ve sorgu onayı
PostgreSQL, kimin hangi nesneleri okuyabileceğine ya da değiştirebileceğine karar verir. Gece 3’te biri tarafından yazılan bu özel ifadenin çalışıp çalışmaması gerektiğine karar vermez. QueryProxy bu kararı ekler: geliştiriciler SQL gönderir, ifade kuyruğa girmeden önce parse edilip denetlenir, bir DBA onaylar ve sonuç saklanmadan önce maskelenir. PostgreSQL parolası QueryProxy’nin kasasında kalır ve hiçbir geliştiriciye verilmez.
GRANT ve satır düzeyi güvenlik neyi kapsar?
GRANT, bir role nesneler üzerinde yetki verir: tablolar, kolonlar, şemalar,
fonksiyonlar. Bir rolün neye erişebileceğini sınırlamak için doğru araçtır ve
her üretim kurulumu onu kullanmalıdır.
Satır düzeyi güvenlik daha da ileri gider. PostgreSQL 18.6 dokümantasyonu,
satır güvenliği politikalarının
“normal sorgularla hangi satırların döndürülebileceğini ya da veri değiştirme
komutlarıyla hangi satırların eklenebileceğini, güncellenebileceğini veya
silinebileceğini” kısıtladığını söyler. Aynı sayfa, superuser’ların ve
BYPASSRLS özniteliğine sahip rollerin onu her zaman atladığını, tablo
sahiplerinin de normalde atladığını belirtir. (2026-10-13 tarihinde okundu.)
İkisinin de yapmadığı şey ifadeye bakmaktır. Bir tabloyu UPDATE edebilen rol,
WHERE cümlesiz bir UPDATE çalıştırabilir. users tablosunu SELECT
edebilen rol, içindeki her e-posta adresini maskesiz olarak bir dizüstü
bilgisayara alır. İkisinde de ikinci bir kişi yoktur. Bu boşluklar
veritabanı erişim denetiminin ne olduğu
yazısının savıdır: roller kimin işlem yapabileceğini söyler, ifadeyi inceleyemez.
WHERE’siz UPDATE ve DELETE nasıl engellenir
yazısı bu boşluğu ayrıntılı ele alır.
QueryProxy PostgreSQL’de neyi engeller?
Her gönderim onay kuyruğuna ulaşmadan önce parse edilir ve bir guard’ı çiğneyen talep, gönderim anında açık bir mesajla reddedilir. SQL korumaları referansı kuralları dialect’e göre listeler. PostgreSQL’de en önemli olanlar:
WHERE’siz ya da her zaman doğru olan birWHEREile (WHERE 1 = 1) yazılmışUPDATEveDELETEreddedilir.LIMIT’siz birSELECT’eLIMIT 1000eklenir,10000’in üzerindeki limit ise düşürülür.COPY,COPY ... TO PROGRAMdahil, engellenir.- Dosya fonksiyonları engellenir:
pg_read_file(),pg_read_binary_file(),pg_ls_dir(),lo_import()velo_export(). dblink*ilepg_terminate_backend,pg_cancel_backend,pg_reload_conf,pg_rotate_logfile,pg_promotevepg_switch_walyönetim fonksiyonları engellenir.- Kendilerine string olarak verilen SQL’i çalıştıran
query_to_xml,xpath_table,ts_statvecrosstab*gibi fonksiyonlar, guard içerideki ifadeyi okuyamadığı için engellenir. CREATE EXTENSIONada göre değerlendirilir. Güvenilmeyen prosedürel diller (plpythonu,plperluvepl...ukuralına uyan her ad) reddedilir;pgcrypto,uuid-osspya dapostgisnormal şekilde kurulur.session_preload_libraries,dynamic_library_pathya dasession_replication_rolegibi korunan bir ayarınSETile değiştirilmesi her kapsamda reddedilir.
DELETE FROM customers; -- rejected at submission
DELETE FROM customers WHERE id = 42; -- allowed, still needs a DBA
SELECT pg_read_file('/etc/passwd'); -- rejected at submission
Tablo adları örnektir; kararlar belgelenmiş kurallara göre verilir.
DO blokları nasıl ele alınır?
Bir DO bloğu, bir CREATE FUNCTION ya da bir CREATE PROCEDURE başka bir
dilde yazılmış bir gövde taşır. QueryProxy bu gövdeyi PostgreSQL’in kendi sözcük
kurallarıyla okur, engellenen fonksiyon ve korunan ayar kurallarını ona uygular
ve yalnızca plpgsql ile sql dillerini kabul eder.
DO bloğu yazma olarak sınıflandırılır ve her zaman insan onayından geçer; onay
veren kişi gövdenin tamamını görür. Dinamik SQL (EXECUTE) kullanan bir gövde,
çalıştıracağı ifade çalışma anında kurulduğu için doğrudan reddedilir. Bir
plpgsql bloğunun yapabileceği geri kalan her şeye parser değil, onay karar verir.
Bir PostgreSQL veritabanı nasıl bağlanır?
Bir DBA, veritabanını Connections altında pgsql sürücüsüyle kaydeder.
Varsayılan port 5432’dir
(DbDriver.php,
v0.2.5). Varsayılan Docker imajı pdo_pgsql ile gelir, dolayısıyla imajı
değiştirmek gerekmez; gerisini yapılandırma rehberi
anlatır. Kimlik bilgileri AES-256 ile şifrelenerek saklanır. Geliştirici
bağlantıyı yalnızca bir DBA yetki verdikten sonra görür.
Salt okunur çalışan ekipler için, yalnızca SELECT yetkisi olan bir veritabanı
kullanıcısıyla ayrı bir bağlantı kaydedin ve mümkünse onu bir replikaya
yöneltin. Üretim güvenliği rehberi bunu önerir.
Sonuca ne olur?
Satırlar, cursor’dan sonuç dosyasına akarken maskelenir; böylece maskesiz bir
kopya diskte hiç bulunmaz. Maskeleme kuralları bir kolon adıyla (*email* gibi)
ya da bir değerin içeriğiyle eşleşir; hiçbir kuralın eşleşmediği değer olduğu
gibi döner. Dinamik veri maskeleme fikri anlatır,
veri maskeleme dokümantasyonu ise kural türlerini ve
stratejileri listeler.
Maskeleme hataları da kapsar. Failing row contains (...) gibi bir PostgreSQL
hatası, kısıtı bozan satırı yankılayabilir; bu yüzden bağlantıda herhangi bir
maskeleme kuralı varsa, saklanan hata mesajında satırın tamamı maskelenir.
Gönderimden indirmeye kadar her adım değiştirilemez bir denetim günlüğüne yazılır.
PostgreSQL’de sınırlar neler?
- Yasak listesi eksiktir. Bugün bilinen tehlikeli sözdizimini adlandırır; adlandırmadığı bir yazım geçer. SQL korumaları referansı bunu kendisi söyler: bir ifadeyi yetkilendiren şey guard değil, DBA onayıdır.
- Veritabanı tarafında henüz salt okunur transaction ve statement timeout yok.
İkisi de v0.3.0 için planlananlar arasında listelenir. O zamana kadar okuma
bağlantıları için yalnızca
SELECTyetkisi olan bir veritabanı kullanıcısı kullanın. - TLS henüz yapılandırılamıyor. Bağlantı bugün
sslmode=preferkullanır ve bir TLS ayarı v0.3.0 için planlanmıştır. Aktarım katmanını kendiniz kontrol edin. - Maskeleme kural tabanlıdır. Hiçbir kuralın eşleşmediği değer olduğu gibi döner; bu yüzden QueryProxy tüm kişisel verileri maskelediğini iddia etmez.
DOgövdesi taraması yalnızca düz metni okur.plpgsqlile yazılmış birDObloğu hâlâ keyfi sunucu tarafı koddur ve gövdesinde açıkça yazılmışWHERE’siz birDELETEgeçer, çünkü bloklara onayda karar verilir.
PostgreSQL için guard’ın kararları canlı bir sunucuya karşı da denetlenir
(live-pgsql test grubu). Referans, MySQL, MariaDB ve SQL Server’ın canlı
sunuculara karşı çalıştırılmadığını belirtir.
QueryProxy’ye ne zaman ihtiyacınız yok?
Veritabanının sahibi tek kişiyse ve bağlanan yalnızca kendisiyse, onaylayacak ikinci bir
kişi yoktur; GRANT artı salt okunur bir rol yeterlidir. Gerçek veri tutmayan bir
geliştirme veritabanı için de aynısı geçerlidir. Sorununuz yalnızca uygulamaların
parolaları yapılandırma dosyalarında tutması ise, bir secrets manager ya da
IAM veritabanı kimlik doğrulaması
bunu bir onay kuyruğu olmadan çözer. QueryProxy, insanların önemli verilere
anlık erişmesi gerektiğinde ve ikinci bir çift göz ile neyin çalıştığının
kaydını istediğinizde yerini hak eder.
Bir talebin nasıl ilerlediği için onay akışına bakın ya da QueryProxy’yi bir atlama sunucusuyla karşılaştırın. MySQL ve MariaDB ekipleri MySQL ve MariaDB erişim denetimi sayfasından başlamalı.
Sık sorulanlar
- Parolayı paylaşmadan geliştiricilere üretim PostgreSQL veritabanına erişimi nasıl veririm?
- Veritabanını QueryProxy'ye bir kez kaydedin; kimlik bilgisi orada AES-256 ile şifrelenmiş olarak saklanır. Geliştiricilere parolayı değil bağlantıyı verin. SQL gönderirler, bir DBA onaylar ve bir işçi (worker) bunu saklanan kimlik bilgisiyle çalıştırır. Geliştiriciler parolayı hiç görmez.
- PostgreSQL'de kişisel verileri korumak için GRANT SELECT yeterli mi?
- Hayır. GRANT SELECT, rolün yetki verilen her kolonu, e-posta adresleri ve telefon numaraları dahil, okumasına izin verir ve bunları istemciye maskesiz döndürür. Satır düzeyi güvenlik satırları gizleyebilir ama izin verdiği satırlardaki bir kolonu maskeleyemez. Maskeleme ayrı bir katmandır ve QueryProxy bunu sonuç yazılırken uygular.
- QueryProxy COPY ... TO PROGRAM'ı engelliyor mu?
- Evet. SQL guard, PostgreSQL COPY'yi, COPY ... TO PROGRAM dahil, gönderim anında reddeder; talep hiçbir DBA'e ulaşmaz. Aynısı pg_read_file(), pg_read_binary_file(), pg_ls_dir(), lo_import() ve lo_export() için de geçerlidir.
- QueryProxy PostgreSQL'deki DO bloklarını nasıl ele alıyor?
- DO bloğu yazma olarak sınıflandırılır ve her zaman tüm gövdesini gören bir DBA'e gider. Gövde, engellenen fonksiyonlar ve korunan ayarlar için taranır; dinamik SQL (EXECUTE) kullanan bir gövde, çalıştıracağı ifade önceden okunamadığı için reddedilir.
- QueryProxy, PostgreSQL rollerinin ve satır düzeyi güvenliğin yerini alıyor mu?
- Hayır. Onların önüne bir katman ekler. QueryProxy bağlantısına yalnızca işin gerektirdiği yetkilere sahip bir veritabanı kullanıcısı verin; okuma bağlantıları için ideali yalnızca SELECT'tir, çünkü veritabanı tarafındaki salt okunur transaction ve statement timeout henüz mevcut değil.