Çok kiracılı bir SaaS'ta onlarca işletme aynı veritabanını paylaşır. Bir işletmenin başka birinin verisini görmesi yalnızca bir hata değil; şirketi bitirebilecek bir güven ihlalidir. Bu yüzden hiçbir zaman tek bir önleme güvenmeyiz; her biri tek başına sızıntıyı yakalayabilecek beş bağımsız katmanı üst üste koyarız.
Katman 1 — Mimari
Kiracı verisi tutan her tablo bir tenant_id sütunu taşır ve bu sütun her foreign key'in parçasıdır. Farklı kiracıların satırlarını sessizce karıştıran "ortak" bir tablo yoktur. Şemanın kendisi, kiracılar arası veriyi fiziksel olarak tanımlanabilir ve dolayısıyla denetlenebilir kılar.
Katman 2 — Sorgu
Her sorgu, aktif tenant_id'yi otomatik ekleyen tek bir veri erişim katmanından geçer. Geliştiriciler her çağrıda elle WHERE tenant_id = ? yazmaz — unutulan bir şart klasik sızıntıdır. Bir sorgu kiracı kapsamı olmadan veritabanına ulaşırsa, çalışmadan hata fırlatır.
"En güvenli şart, geliştiricinin yazmayı asla unutamayacağı şarttır." — RESWONS DNA
Katman 3 — Oturum & Yetki
Kiracı bağlamı, istemcinin değiştirebileceği bir istek parametresinden değil, sunucudaki kimliği doğrulanmış oturumdan türetilir. URL'deki bir id'yi değiştirmek size başka birinin faturasını değil, bir 403 getirir.
Katman 4 — Testler
Otomatik izolasyon testleri iki kiracı oluşturur, her biri adına veri yazar, sonra hiçbir uç noktadan diğerinin satırlarını okuyamadıklarını doğrular. Bunlar her pull request'te çalışır; bir sızıntı, üretime ulaşmadan derlemeyi düşürür.
Katman 5 — Audit
Kritik aksiyonlar; kim, ne zaman ve hangi kiracı bilgisiyle loglanır. Olağandışı kiracılar arası erişim desenleri bir uyarı tetikler. İlk dört katman bir şekilde başarısız olsa bile, audit izi hatayı sessiz değil görünür kılar.
Çıkarım
Güvenlik tek bir akıllı numara değildir; yedekliliktir. Beş bağımsız katman, tek bir insan hatasının asla müşteriye yansıyan bir sızıntıya dönüşmemesi demektir. Bu, yayına aldığımız her sistemin arkasındaki disiplindir.
Bu prensiplerin teknoloji tercihlerimize nasıl yansıdığını Teknoloji sayfasında görebilirsiniz.