{"id":5,"date":"2025-06-12T10:00:00","date_gmt":"2025-06-12T07:00:00","guid":{"rendered":"https:\/\/www.hasangultekin.com\/2025\/06\/12\/tenant-isolation-follows-the-data\/"},"modified":"2025-06-12T10:00:00","modified_gmt":"2025-06-12T07:00:00","slug":"tenant-isolation-follows-the-data","status":"publish","type":"post","link":"https:\/\/www.hasangultekin.com\/tr\/2025\/06\/12\/tenant-isolation-follows-the-data\/","title":{"rendered":"Kirac\u0131lar\u0131n Ayr\u0131lmas\u0131, Verilere Uygun Olmal\u0131d\u0131r"},"content":{"rendered":"<p>Her tabloya bir kirac\u0131 tan\u0131mlay\u0131c\u0131s\u0131 eklemek, i\u015fe ba\u015flamak i\u00e7in yararl\u0131 bir ad\u0131md\u0131r. Ancak bu, tek ba\u015f\u0131na bir SaaS uygulamas\u0131n\u0131 izole etmeye yetmez. Veriler ayr\u0131ca \u00f6nbellek giri\u015fleri, i\u015fleyici mesajlar\u0131, arama dizinleri, nesne depolama ve y\u00f6netim ekranlar\u0131 \u00fczerinden de aktar\u0131l\u0131r.<\/p>\n<p>\u0130zolasyonu, istek b\u00fct\u00fcn\u00fcn\u00fcn ve onun sonraki a\u015famalar\u0131n\u0131n bir \u00f6zelli\u011fi olarak ele al\u0131yorum. Her s\u0131n\u0131rda, sistem hangi verilere i\u015fleme koydu\u011funu ve mevcut i\u015flemin bu verileri i\u015fleme yetkisine neden sahip oldu\u011funu bilmelidir.<\/p>\n<h2>Sunucuda kirac\u0131 ba\u011flam\u0131n\u0131 olu\u015fturun<\/h2>\n<p>Taray\u0131c\u0131 taraf\u0131ndan sa\u011flanan bir kirac\u0131 kimli\u011fi, talep edilen bir kapsamd\u0131r; \u00fcyelik kan\u0131t\u0131 de\u011fildir. Uygulama, i\u015f verilerini y\u00fcklemeden \u00f6nce kimlik do\u011frulamas\u0131 yap\u0131lm\u0131\u015f kullan\u0131c\u0131y\u0131 tan\u0131mlamal\u0131, s\u00f6z konusu kirac\u0131ya eri\u015fimi do\u011frulamal\u0131 ve bir yetkilendirme ba\u011flam\u0131 olu\u015fturmal\u0131d\u0131r.<\/p>\n<p>Bu ba\u011flam, hizmet s\u0131n\u0131rlar\u0131nda a\u00e7\u0131k\u00e7a belirtilmelidir. Gizli k\u00fcresel durum, zamanlanm\u0131\u015f g\u00f6revler ve e\u015fzamanl\u0131 istekler hakk\u0131nda mant\u0131kl\u0131 \u00e7\u0131kar\u0131mlarda bulunmay\u0131 zorla\u015ft\u0131r\u0131r. Bir i\u015fleyici, orijinal HTTP iste\u011finden varsay\u0131mlar\u0131 devralmak yerine, kendi yetkilendirilmi\u015f kapsam\u0131n\u0131 belirleyebilecek kadar yeterli bilgi almal\u0131d\u0131r.<\/p>\n<p>Veritaban\u0131 sorgular\u0131 bu kapsam\u0131 yans\u0131tmal\u0131d\u0131r. Bir sohbeti y\u00fcklerken, sorgunun hem kimli\u011fini hem de kirac\u0131s\u0131n\u0131 s\u0131n\u0131rlamas\u0131n\u0131 istiyorum. Bir kayd\u0131 genel olarak getirip sahipli\u011fini daha sonra kontrol etmek, ba\u015fka bir kod yolunun bunu yanl\u0131\u015fl\u0131kla \u00f6nce kullanma olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h2>Veritaban\u0131n\u0131 ba\u015fka bir s\u0131n\u0131r olarak kullan\u0131n<\/h2>\n<p>PostgreSQL, sat\u0131r d\u00fczeyinde g\u00fcvenlik ilkelerini destekler; buna, sat\u0131r g\u00fcvenli\u011fi etkinle\u015ftirildi\u011finde ve eri\u015fime izin veren ge\u00e7erli bir ilke bulunmad\u0131\u011f\u0131nda varsay\u0131lan olarak eri\u015fimin reddedilmesi de dahildir. Bu <a href=\"https:\/\/www.postgresql.org\/docs\/16\/ddl-rowsecurity.html\" target=\"_blank\" rel=\"noopener\">belgeler<\/a> ayr\u0131ca \u00f6nemli bir ayr\u0131m yapar: s\u00fcper kullan\u0131c\u0131lar ve atlama ayr\u0131cal\u0131klar\u0131na sahip roller herhangi bir k\u0131s\u0131tlamaya tabi de\u011fildir; ayr\u0131ca tablo sahipleri genellikle ilkeleri atlar.<\/p>\n<p>Bu, ikna edici bir politika tan\u0131mlamas\u0131n\u0131n tasar\u0131m\u0131n yaln\u0131zca bir par\u00e7as\u0131 oldu\u011fu anlam\u0131na gelir. Uygulaman\u0131n veritaban\u0131ndaki ger\u00e7ek rol\u00fc, veri ta\u015f\u0131ma rol\u00fc, ba\u011flant\u0131 havuzu ve i\u015flem davran\u0131\u015f\u0131; hepsi \u00f6nemlidir. \u00c7al\u0131\u015fan uygulamayla ayn\u0131 ayr\u0131cal\u0131klar\u0131 kullanarak bu politikay\u0131 do\u011frulard\u0131m.<\/p>\n<p>Kirac\u0131 ba\u011flam\u0131 ba\u011flant\u0131 ayarlar\u0131 arac\u0131l\u0131\u011f\u0131yla aktar\u0131l\u0131yorsa, havuzlanm\u0131\u015f ba\u011flant\u0131lara \u00f6zel dikkat g\u00f6sterilmesi gerekir. Ba\u011flam, g\u00fcvenilir bir yol \u00fczerinden belirlenmeli, uygun \u015fekilde s\u0131n\u0131rland\u0131r\u0131lmal\u0131 ve bir sonraki iste\u011fe s\u0131zmamal\u0131d\u0131r. Sat\u0131r d\u00fczeyinde g\u00fcvenlik, ba\u011flant\u0131 ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc anlaman\u0131n yerine ge\u00e7meyen ek bir koruma \u00f6nlemidir.<\/p>\n<h2>SQL d\u0131\u015f\u0131ndaki yerleri de dahil edin<\/h2>\n<p>\u015eu t\u00fcr bir \u00f6nbellek anahtar\u0131: <code>sohbet:123<\/code> bu, tan\u0131mlay\u0131c\u0131n\u0131n k\u00fcresel olarak benzersiz oldu\u011funu ve her \u00e7a\u011fr\u0131 yapan\u0131n ayn\u0131 eri\u015fim kurallar\u0131n\u0131 uygulad\u0131\u011f\u0131n\u0131 varsayar. A\u00e7\u0131k\u00e7a belirtilmi\u015f bir kirac\u0131 bile\u015feni, sahiplik s\u0131n\u0131r\u0131n\u0131 g\u00f6r\u00fcn\u00fcr k\u0131lar ve kazara \u00e7ak\u0131\u015fmalar\u0131 azalt\u0131r.<\/p>\n<p>Arama ve sonu\u00e7 alma i\u015flemleri ayn\u0131 disiplin gerektirir. Kullan\u0131c\u0131 ve eri\u015fim filtreleri, aday se\u00e7imi a\u015famas\u0131na aittir. Genel bir \u201ctop-k\u201d aramas\u0131n\u0131n ard\u0131ndan filtreleme yapmak, ge\u00e7erli adaylar\u0131n g\u00f6zden ka\u00e7mas\u0131na neden olabilir; ayr\u0131ca, yetkisiz metinlerin yeniden s\u0131ralama s\u00fcrecine veya model ba\u011flam\u0131na dahil edilmesine izin vermek, zaten bir bilgi if\u015fas\u0131 anlam\u0131na gelir.<\/p>\n<p>Nesne depolama yollar\u0131, d\u0131\u015fa aktarma i\u015fleri, kullan\u0131m saya\u00e7lar\u0131 ve bildirim kuyruklar\u0131 da kirac\u0131 ba\u011flam\u0131n\u0131 i\u00e7ermelidir. Bir uygulama, etkile\u015fimli ekranlar\u0131n\u0131 g\u00fcvenli hale getirse bile arka planda ger\u00e7ekle\u015ftirilen bir CSV d\u0131\u015fa aktarma i\u015flemi yoluyla veri s\u0131z\u0131nt\u0131s\u0131na neden olabilir.<\/p>\n<h2>Kas\u0131tl\u0131 olarak benzer kirac\u0131larla test yap\u0131n<\/h2>\n<p>Adlar\u0131 birbiriyle \u00f6rt\u00fc\u015fen, benzer belgelere sahip ve d\u0131\u015f tan\u0131mlay\u0131c\u0131lar\u0131 e\u015fle\u015fen iki kirac\u0131 kullanan izolasyon testlerini tercih ederim. Bu, her de\u011ferin birbirinden net bir \u015fekilde farkl\u0131 oldu\u011fu bir veri k\u00fcmesine k\u0131yasla, kazara yap\u0131lan genel aramalar\u0131n ortaya \u00e7\u0131kmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<ul>\n<li>Ba\u015fka bir kirac\u0131n\u0131n kayd\u0131n\u0131 do\u011frudan kimlik numaras\u0131yla isteyin.<\/li>\n<li>Yaln\u0131zca di\u011fer kirac\u0131n\u0131n bilgi bankas\u0131nda yer alan ifadeleri aray\u0131n.<\/li>\n<li>Yetkili \u00e7al\u0131\u015fma alanlar\u0131 aras\u0131nda ge\u00e7i\u015f yapt\u0131ktan sonra \u00f6nbelle\u011fe al\u0131nm\u0131\u015f bir yan\u0131t\u0131 yeniden kullan\u0131n.<\/li>\n<li>Sahiplik meta verileri uyu\u015fmayan bir i\u015f\u00e7i mesaj\u0131n\u0131 yeniden oynat.<\/li>\n<li>Eri\u015fimi s\u0131n\u0131rl\u0131 bir rol arac\u0131l\u0131\u011f\u0131yla d\u0131\u015fa aktarma i\u015flemini deneyin.<\/li>\n<\/ul>\n<p>Ayr\u0131ca destek ara\u00e7lar\u0131n\u0131 da test ediyorum. \u0130dari kolayl\u0131k genellikle \u00fcr\u00fcnde en geni\u015f izinlerin verilmesine yol a\u00e7t\u0131\u011f\u0131 i\u00e7in, kirac\u0131lar aras\u0131 eri\u015fim kas\u0131tl\u0131, k\u0131s\u0131tl\u0131 ve denetlenebilir olmal\u0131d\u0131r.<\/p>\n<p>Bir kirac\u0131 s\u0131n\u0131r\u0131, hem normal i\u015fleyi\u015f s\u00fcre\u00e7lerinde hem de kurtarma s\u00fcre\u00e7lerinde ge\u00e7erlili\u011fini korudu\u011fu takdirde g\u00fcvenilir say\u0131l\u0131r. Buradaki mesele, yaln\u0131zca ana API\u2019nin kapsam\u0131n\u0131n do\u011fru bir \u015fekilde belirlenip belirlenmedi\u011fi de\u011fil, ayn\u0131 zamanda verilerin daha sonraki her kopyalama ve kullan\u0131m\u0131nda bu kapsam\u0131n korunup korunmad\u0131\u011f\u0131d\u0131r.<\/p>\n<p class=\"hg-editorial-note\"><small>25 Eyl\u00fcl 2026 tarihinde g\u00fcncellenmi\u015ftir.<\/small><\/p>","protected":false},"excerpt":{"rendered":"<p>Bir SaaS uygulamas\u0131nda kirac\u0131 izolasyonunun neden veritaban\u0131 sorgular\u0131, \u00f6nbellekler, arka plan i\u015fleri, veri alma i\u015flemleri ve destek ara\u00e7lar\u0131n\u0131 da kapsamas\u0131 gerekti\u011fi.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"footnotes":""},"categories":[149],"tags":[176,181,189],"class_list":["post-5","post","type-post","status-publish","format-standard","hentry","category-backend-architecture","tag-multi-tenancy","tag-postgresql","tag-security"],"_links":{"self":[{"href":"https:\/\/www.hasangultekin.com\/tr\/wp-json\/wp\/v2\/posts\/5","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hasangultekin.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hasangultekin.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hasangultekin.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hasangultekin.com\/tr\/wp-json\/wp\/v2\/comments?post=5"}],"version-history":[{"count":0,"href":"https:\/\/www.hasangultekin.com\/tr\/wp-json\/wp\/v2\/posts\/5\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.hasangultekin.com\/tr\/wp-json\/wp\/v2\/media?parent=5"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hasangultekin.com\/tr\/wp-json\/wp\/v2\/categories?post=5"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hasangultekin.com\/tr\/wp-json\/wp\/v2\/tags?post=5"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}