WEB / WEB-14.05
Resource authorization ve tenant boundaries
Bir raporu okumak için login olmak yeterli değildir. Aynı request üzerinde kimlik, tenant, action ve ownership kararının nerede verildiğini izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Owner read · allow
- İstek bir karar değildir
UI bir action ister. İstenen resource ve client’ın gösterdiği tenant etiketi server yetkisi oluşturmaz.
- Browser · UI
- report.read report-atlas-01
- Server · policy evaluator
- Policy çalışmadı
- Resource · verified context
- Context yüklenmedi
- Request server’a ulaştı
Server subject’i verified session/context üzerinden kurar; browser’ın isim alanını doğrulanmış identity gibi kabul etmez.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Duru / member
- Resource · verified context
- Context yüklenmedi
- Object ve tenant context’i kuruldu
Resource tenant ve ownership metadata’sı server’ın güvenilir veri kaynağından gelir. Yükleme ve authorization tek bir atomik operation olabilir; çizim iki mantıksal kontrolü ayırır.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Subject / action / context hazır
- Resource · verified context
- report-atlas-01 · atlas
- Policy koşulları değerlendirildi
Active identity, tenant match, action permission ve owner/reviewer relationship birlikte değerlendirilir. Bir koşulu atlamak farklı bir güven sınırını bozar.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- ALLOW · OWNER_READ
- Resource · verified context
- Read scope izinli
- Karar browser’a döndü
Response yalnız allow durumunda resource representation taşır. Denial reason bu teaching fixture’da açıklanır; production response ayrıntısı bilgi sızıntısını gözetir.
- Browser · UI
- Resource gösterilebilir
- Server · policy evaluator
- ALLOW · OWNER_READ
- Resource · verified context
- Read gerçekleşti
- Gözlem kararın kapsamını korur
Audit actor, action, object, tenant, decision ve reason kaydeder. Session secret yazılmaz. Bir allow yalnız bu action/resource/context için geçerlidir.
- Browser · UI
- UI: allowed read
- Server · policy evaluator
- Audit: OWNER_READ
- Resource · verified context
- report-atlas-01
Başka owner · deny
- İstek bir karar değildir
UI bir action ister. İstenen resource ve client’ın gösterdiği tenant etiketi server yetkisi oluşturmaz.
- Browser · UI
- report.read report-atlas-02
- Server · policy evaluator
- Policy çalışmadı
- Resource · verified context
- Context yüklenmedi
- Request server’a ulaştı
Server subject’i verified session/context üzerinden kurar; browser’ın isim alanını doğrulanmış identity gibi kabul etmez.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Duru / member
- Resource · verified context
- Context yüklenmedi
- Object ve tenant context’i kuruldu
Resource tenant ve ownership metadata’sı server’ın güvenilir veri kaynağından gelir. Yükleme ve authorization tek bir atomik operation olabilir; çizim iki mantıksal kontrolü ayırır.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Subject / action / context hazır
- Resource · verified context
- report-atlas-02 · atlas
- Policy koşulları değerlendirildi
Active identity, tenant match, action permission ve owner/reviewer relationship birlikte değerlendirilir. Bir koşulu atlamak farklı bir güven sınırını bozar.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- DENY · OWNER_REQUIRED
- Resource · verified context
- Resource body verilmez
- Karar browser’a döndü
Response yalnız allow durumunda resource representation taşır. Denial reason bu teaching fixture’da açıklanır; production response ayrıntısı bilgi sızıntısını gözetir.
- Browser · UI
- İşlem reddedildi
- Server · policy evaluator
- DENY · OWNER_REQUIRED
- Resource · verified context
- Body verilmedi
- Gözlem kararın kapsamını korur
Audit actor, action, object, tenant, decision ve reason kaydeder. Session secret yazılmaz. Bir allow yalnız bu action/resource/context için geçerlidir.
- Browser · UI
- UI: denied action
- Server · policy evaluator
- Audit: OWNER_REQUIRED
- Resource · verified context
- report-atlas-02
Tenant mismatch · deny
- İstek bir karar değildir
UI bir action ister. İstenen resource ve client’ın gösterdiği tenant etiketi server yetkisi oluşturmaz.
- Browser · UI
- report.read report-orion-01
- Server · policy evaluator
- Policy çalışmadı
- Resource · verified context
- Context yüklenmedi
- Request server’a ulaştı
Server subject’i verified session/context üzerinden kurar; browser’ın isim alanını doğrulanmış identity gibi kabul etmez.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Duru / member
- Resource · verified context
- Context yüklenmedi
- Object ve tenant context’i kuruldu
Resource tenant ve ownership metadata’sı server’ın güvenilir veri kaynağından gelir. Yükleme ve authorization tek bir atomik operation olabilir; çizim iki mantıksal kontrolü ayırır.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Subject / action / context hazır
- Resource · verified context
- report-orion-01 · orion
- Policy koşulları değerlendirildi
Active identity, tenant match, action permission ve owner/reviewer relationship birlikte değerlendirilir. Bir koşulu atlamak farklı bir güven sınırını bozar.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- DENY · TENANT_MISMATCH
- Resource · verified context
- Resource body verilmez
- Karar browser’a döndü
Response yalnız allow durumunda resource representation taşır. Denial reason bu teaching fixture’da açıklanır; production response ayrıntısı bilgi sızıntısını gözetir.
- Browser · UI
- İşlem reddedildi
- Server · policy evaluator
- DENY · TENANT_MISMATCH
- Resource · verified context
- Body verilmedi
- Gözlem kararın kapsamını korur
Audit actor, action, object, tenant, decision ve reason kaydeder. Session secret yazılmaz. Bir allow yalnız bu action/resource/context için geçerlidir.
- Browser · UI
- UI: denied action
- Server · policy evaluator
- Audit: TENANT_MISMATCH
- Resource · verified context
- report-orion-01
Reviewer read · allow
- İstek bir karar değildir
UI bir action ister. İstenen resource ve client’ın gösterdiği tenant etiketi server yetkisi oluşturmaz.
- Browser · UI
- report.read report-atlas-01
- Server · policy evaluator
- Policy çalışmadı
- Resource · verified context
- Context yüklenmedi
- Request server’a ulaştı
Server subject’i verified session/context üzerinden kurar; browser’ın isim alanını doğrulanmış identity gibi kabul etmez.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Ekin / reviewer
- Resource · verified context
- Context yüklenmedi
- Object ve tenant context’i kuruldu
Resource tenant ve ownership metadata’sı server’ın güvenilir veri kaynağından gelir. Yükleme ve authorization tek bir atomik operation olabilir; çizim iki mantıksal kontrolü ayırır.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Subject / action / context hazır
- Resource · verified context
- report-atlas-01 · atlas
- Policy koşulları değerlendirildi
Active identity, tenant match, action permission ve owner/reviewer relationship birlikte değerlendirilir. Bir koşulu atlamak farklı bir güven sınırını bozar.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- ALLOW · REVIEWER_READ
- Resource · verified context
- Read scope izinli
- Karar browser’a döndü
Response yalnız allow durumunda resource representation taşır. Denial reason bu teaching fixture’da açıklanır; production response ayrıntısı bilgi sızıntısını gözetir.
- Browser · UI
- Resource gösterilebilir
- Server · policy evaluator
- ALLOW · REVIEWER_READ
- Resource · verified context
- Read gerçekleşti
- Gözlem kararın kapsamını korur
Audit actor, action, object, tenant, decision ve reason kaydeder. Session secret yazılmaz. Bir allow yalnız bu action/resource/context için geçerlidir.
- Browser · UI
- UI: allowed read
- Server · policy evaluator
- Audit: REVIEWER_READ
- Resource · verified context
- report-atlas-01
Reviewer başka tenant · deny
- İstek bir karar değildir
UI bir action ister. İstenen resource ve client’ın gösterdiği tenant etiketi server yetkisi oluşturmaz.
- Browser · UI
- report.read report-orion-01
- Server · policy evaluator
- Policy çalışmadı
- Resource · verified context
- Context yüklenmedi
- Request server’a ulaştı
Server subject’i verified session/context üzerinden kurar; browser’ın isim alanını doğrulanmış identity gibi kabul etmez.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Ekin / reviewer
- Resource · verified context
- Context yüklenmedi
- Object ve tenant context’i kuruldu
Resource tenant ve ownership metadata’sı server’ın güvenilir veri kaynağından gelir. Yükleme ve authorization tek bir atomik operation olabilir; çizim iki mantıksal kontrolü ayırır.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Subject / action / context hazır
- Resource · verified context
- report-orion-01 · orion
- Policy koşulları değerlendirildi
Active identity, tenant match, action permission ve owner/reviewer relationship birlikte değerlendirilir. Bir koşulu atlamak farklı bir güven sınırını bozar.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- DENY · TENANT_MISMATCH
- Resource · verified context
- Resource body verilmez
- Karar browser’a döndü
Response yalnız allow durumunda resource representation taşır. Denial reason bu teaching fixture’da açıklanır; production response ayrıntısı bilgi sızıntısını gözetir.
- Browser · UI
- İşlem reddedildi
- Server · policy evaluator
- DENY · TENANT_MISMATCH
- Resource · verified context
- Body verilmedi
- Gözlem kararın kapsamını korur
Audit actor, action, object, tenant, decision ve reason kaydeder. Session secret yazılmaz. Bir allow yalnız bu action/resource/context için geçerlidir.
- Browser · UI
- UI: denied action
- Server · policy evaluator
- Audit: TENANT_MISMATCH
- Resource · verified context
- report-orion-01
Verified context yok · deny
- İstek bir karar değildir
UI bir action ister. İstenen resource ve client’ın gösterdiği tenant etiketi server yetkisi oluşturmaz.
- Browser · UI
- report.read report-atlas-01
- Server · policy evaluator
- Policy çalışmadı
- Resource · verified context
- Context yüklenmedi
- Request server’a ulaştı
Server subject’i verified session/context üzerinden kurar; browser’ın isim alanını doğrulanmış identity gibi kabul etmez.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Duru / member
- Resource · verified context
- Context yüklenmedi
- Object ve tenant context’i kuruldu
Resource tenant ve ownership metadata’sı server’ın güvenilir veri kaynağından gelir. Yükleme ve authorization tek bir atomik operation olabilir; çizim iki mantıksal kontrolü ayırır.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Verified context yok
- Resource · verified context
- report-atlas-01 · atlas
- Policy koşulları değerlendirildi
Active identity, tenant match, action permission ve owner/reviewer relationship birlikte değerlendirilir. Bir koşulu atlamak farklı bir güven sınırını bozar.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- DENY · CONTEXT_REQUIRED
- Resource · verified context
- Resource body verilmez
- Karar browser’a döndü
Response yalnız allow durumunda resource representation taşır. Denial reason bu teaching fixture’da açıklanır; production response ayrıntısı bilgi sızıntısını gözetir.
- Browser · UI
- İşlem reddedildi
- Server · policy evaluator
- DENY · CONTEXT_REQUIRED
- Resource · verified context
- Body verilmedi
- Gözlem kararın kapsamını korur
Audit actor, action, object, tenant, decision ve reason kaydeder. Session secret yazılmaz. Bir allow yalnız bu action/resource/context için geçerlidir.
- Browser · UI
- UI: denied action
- Server · policy evaluator
- Audit: CONTEXT_REQUIRED
- Resource · verified context
- report-atlas-01
Action grant yok · deny
- İstek bir karar değildir
UI bir action ister. İstenen resource ve client’ın gösterdiği tenant etiketi server yetkisi oluşturmaz.
- Browser · UI
- report.archive report-atlas-01
- Server · policy evaluator
- Policy çalışmadı
- Resource · verified context
- Context yüklenmedi
- Request server’a ulaştı
Server subject’i verified session/context üzerinden kurar; browser’ın isim alanını doğrulanmış identity gibi kabul etmez.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Duru / member
- Resource · verified context
- Context yüklenmedi
- Object ve tenant context’i kuruldu
Resource tenant ve ownership metadata’sı server’ın güvenilir veri kaynağından gelir. Yükleme ve authorization tek bir atomik operation olabilir; çizim iki mantıksal kontrolü ayırır.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- Subject / action / context hazır
- Resource · verified context
- report-atlas-01 · atlas
- Policy koşulları değerlendirildi
Active identity, tenant match, action permission ve owner/reviewer relationship birlikte değerlendirilir. Bir koşulu atlamak farklı bir güven sınırını bozar.
- Browser · UI
- Karar bekliyor
- Server · policy evaluator
- DENY · ACTION_NOT_GRANTED
- Resource · verified context
- Resource body verilmez
- Karar browser’a döndü
Response yalnız allow durumunda resource representation taşır. Denial reason bu teaching fixture’da açıklanır; production response ayrıntısı bilgi sızıntısını gözetir.
- Browser · UI
- İşlem reddedildi
- Server · policy evaluator
- DENY · ACTION_NOT_GRANTED
- Resource · verified context
- Body verilmedi
- Gözlem kararın kapsamını korur
Audit actor, action, object, tenant, decision ve reason kaydeder. Session secret yazılmaz. Bir allow yalnız bu action/resource/context için geçerlidir.
- Browser · UI
- UI: denied action
- Server · policy evaluator
- Audit: ACTION_NOT_GRANTED
- Resource · verified context
- report-atlas-01
ROLLER · STATE · VERİ AKIŞI
Duru hangi raporu okuyabilir?
Atlas ve Orion iki ayrı kuruluşun tenant’larıdır. Duru Atlas’ın member hesabıyla login olur. report-atlas-01, Atlas içinde Duru’ya ait bir rapordur. Ekin aynı tenant’ta reviewer rolündedir; raporları incelemesi işinin bir parçasıdır. Orion’un raporları ikisinin de iş kapsamının dışındadır. Bu örnekte her actor bir tenant’a bağlıdır; birden fazla tenant üyeliği olan ürünlerde aktif tenant seçimi ayrıca doğrulanır.
Authentication Duru’nun kimliğini kurar. Authorization ise Duru’nun belirli bir raporu belirli bir action ile kullanmasına izin verilip verilmediğini belirler. Bir subject’in read izni olması update veya export izni olduğunu söylemez. Buradaki policy iş kuralıdır: member kendi tenant’ında kendi raporunu okuyabilir; reviewer kendi tenant’ında başkasına ait raporu da okuyabilir. Platform-wide admin veya tenant paylaşımı bu policy’de tanımlı değildir.
Kararın dört girdisi ve bunları sağlayan taraf
Subject, isteği yapan doğrulanmış principal’dır: actorId, aktif üyelik ve rol bilgisi. Object hedef rapordur: objectId, ownerId, tenantId ve raporun state’i. Action burada report.read’dir. Context, server’ın bu işlem için doğruladığı aktif tenant ve policy version gibi ek koşullardır. Rol subject’in bir özniteliği, ownership ise subject ile object arasındaki ilişkidir; birbirinin yerine geçmezler.
Client bir rapor veya tenant seçebilir; bu seçim bir yetki belgesi değildir. Actor server-side session’dan çözülür. Rol ve üyelik server’ın güvenilir kaynağından alınır. Raporun tenantId ve ownerId alanları kayıt metadata’sından gelir. Client body’sindeki owner veya role etiketini kararın otoritesi yapmak, kararın girdisini isteği yapan kişiye bırakır. Server’ın güvenilir kaynağından gelen bilgi de güncellik gerektirir: iptal edilmiş üyeliği eski bir cache’ten okumak doğru kararı bozabilir.
Bir allow kararını adım adım açmak
Duru, report-atlas-01 için read ister. Handler önce aktif principal ve doğrulanmış Atlas context’i kurar. Policy hedef metadata’nın Atlas’a ait olduğunu kontrol eder. Sonra action’ı tanır, member rolünün bu action için değerlendirilebildiğini görür ve ownerId ile actorId ilişkisini karşılaştırır. Bütün gerekli koşullar sağlandığında allow/OWNER_READ çıkar. Korunan rapor body’si ancak bundan sonra sunulur.
Aynı tenant’taki başka owner raporunda son koşul sağlanmaz: deny/OWNER_REQUIRED. Hedef Orion’a aitse tenant koşulu sağlanmaz: deny/TENANT_MISMATCH. Ekin’in reviewer rolü Atlas içindeki ownership istisnasını sağlar; Orion sınırını kaldırmaz. Bu sıralama eğitim policy’sinin gerekçe üretme düzenidir, evrensel framework davranışı değildir. Bazı uygulamalar başka tenant’ın object metadata’sını hiç yüklemeden scoped lookup ile “bulunamadı” döner.
Deny, veri döndürmemek ve işlem yapmamak demektir
Policy bilinmeyen action, eksik context veya tanımlanmamış role için açık bir izin bulamazsa deny üretir. Karar servisi hata verdiğinde protected işlem izin verilmiş gibi devam etmez. Read için confidential body gönderilmez; write için değişiklik yapılmaz. Error handling’in kendisi alternatif bir allow yolu oluşturmamalıdır. Public resource’lar ayrı ve açık bir policy ile herkese açılabilir; bu örneğin tenant kontrolünü bütün web kaynaklarına zorla uygulamak gerekmez.
Deny reason server içi gözlem içindir. Kullanıcıya ownerId, başka tenant adı veya bütün policy ayrıntılarını gösterme zorunluluğu yoktur. 403 veya resource existence’ı gizleyen 404 seçimi ürünün HTTP ve disclosure tasarımıdır. Status code tek başına “hangi izin kontrolü çalıştı” sorusunu cevaplamaz.
Karar farklı veri yollarında kaybolmamalı
Rapor ekrandan, download yolundan veya background export job’ından erişilebilir. Her yol aynı entitlement’ı korumalıdır. Tenant equality tek başına yeterli değildir: Atlas içindeki ownership ve action kuralı da uygulanır. Aşağıdaki uygulamalar bu rapor policy’sini farklı veri yollarına taşıyan tasarım örnekleridir; tek bir middleware bütün alt katmanları kendiliğinden güvenli yapmaz.
- Database: object lookup tenant scope içinde yapılır; read/update/delete ve ilişkili kayıt yüklemeleri aynı scope’u korur. Bir query’nin parameterized olması injection kontrolüdür; ownership veya tenant yetkisini tek başına kurmaz.
- Cache: protected body’ye erişimden önce authorization gerekir. Tenant’a veya kullanıcı iznine göre değişen sonuç cache key’de bu scope’u ve gereken permission version’ı taşır. Cache hit, policy’yi atlama izni değildir.
- Files: private export’ın metadata’sı owner ve tenant’la ilişkilidir. Download servisi bu ilişkiye göre karar verir; public bir dosya URL’i oluşturmak aynı policy’yi kendiliğinden korumaz.
- Jobs: export kuyruğa alınırken originating actor, doğrulanmış tenant ve action güvenilir job context’ine bağlanır. Worker execution sırasında context’i yeniden kurar; gecikmeyle değişebilecek üyelik/izin tekrar değerlendirilir. Worker’ın service hesabının geniş izni Duru’nun entitlement’ı değildir.
Bir kararın geçerlilik süresi
Ekin’in reviewer rolü kaldırılırsa eski allow kararı sonraki read için yeterli değildir. Policy version, kullanılan kural setini ayırt etmeye yardım eder; tek başına role değişikliğini yürürlüğe sokmaz. Güncel membership, cache invalidation ve kararın uygulandığı katman birlikte tasarlanır. Queue gecikmesi veya uzun işlem sırasında değişen yetki için ürün açık bir execution kuralı belirlemelidir.
Bu ders read kararını modeller. Update gibi işlemlerde authorization ile mutation arasında object ownership/state değişebilir. Gereken tutarlılık transaction, kilit, version check veya ilgili veri platformunun başka bir mekanizmasıyla sağlanır. Sadece read öncesi kontrol gösteren bir animasyonu write güvenliği kanıtı olarak okumamak gerekir.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Field sınırı
- Bir allow her işlem için değildir
Duru report-atlas-01 için report.read ister. Aynı nesne kimliği ve verified tenant, farklı action’a kendiliğinden izin vermez.
- İşlem isteği
- report.read
- Policy kapsamı
- Policy okunmadı
- Representation gate
- Fields seçilmedi
- Policy kapsamı görüldü
atlas-report-read-v1 yalnız tenant-owned report.read kapsamını tanımlar. Server’a ait subject/object metadata’sı sabittir; client etiketi yetki kaynağı değildir.
- İşlem isteği
- report.read
- Policy kapsamı
- atlas-report-read-v1
- Representation gate
- Fields seçilmedi
- İşlem kararı sınırlandı
OWN_READ fixture’ı OWNER_READ ile allow üretir. Bu karar yalnız report.read/report-atlas-01/atlas context’ine aittir, tüm property’lere veya işlemlere değil.
- İşlem isteği
- report.read
- Policy kapsamı
- ALLOW / OWNER_READ
- Representation gate
- Fields seçilmedi
- Field çıkışı ayrıca seçildi
deliveredFields=objectId, title, body bu fixture’ın izin verdiği çıkıştır. Nesne erişimi ile field seçimi farklı sorumluluklardır; yeni bir özel field veya gerçek veri varlığı uydurulmaz.
- İşlem isteği
- report.read
- Policy kapsamı
- OWNER_READ
- Representation gate
- objectId,title,body
- Delivery gate sonucu korudu
Allow branch yalnız objectId, title, body seçimini teslimata hazırlar. İzinli nesne için bile representation sözleşmesi görünür tutulur.
- İşlem isteği
- report.read
- Policy kapsamı
- OWNER_READ
- Representation gate
- İzinli field seti hazır
- Sonuç yetki kapsamını aşmadı
Bu yerel model sonucu yalnız izinli field setini sunar. Kartlar mantıksal sahipleri gösterir; bu sahne yeni HTTP endpoint veya ağ paketi çalıştırmaz.
- İşlem isteği
- objectId,title,body
- Policy kapsamı
- OWNER_READ
- Representation gate
- objectId,title,body
Action sınırı
- Bir allow her işlem için değildir
Duru report-atlas-01 için report.archive ister. Aynı nesne kimliği ve verified tenant, farklı action’a kendiliğinden izin vermez.
- İşlem isteği
- report.archive
- Policy kapsamı
- Policy okunmadı
- Representation gate
- Fields seçilmedi
- Policy kapsamı görüldü
atlas-report-read-v1 yalnız tenant-owned report.read kapsamını tanımlar. Server’a ait subject/object metadata’sı sabittir; client etiketi yetki kaynağı değildir.
- İşlem isteği
- report.archive
- Policy kapsamı
- atlas-report-read-v1
- Representation gate
- Fields seçilmedi
- İşlem kararı sınırlandı
UNKNOWN_ACTION fixture’ı ACTION_NOT_GRANTED üretir. Önceki veya farklı report.read allow’u bu kararı değiştirmez; action bazında yeni karar gerekir.
- İşlem isteği
- report.archive
- Policy kapsamı
- DENY / ACTION_NOT_GRANTED
- Representation gate
- Fields seçilmedi
- Field çıkışı ayrıca seçildi
deliveredFields=[] bu fixture’ın izin verdiği çıkıştır. Nesne erişimi ile field seçimi farklı sorumluluklardır; yeni bir özel field veya gerçek veri varlığı uydurulmaz.
- İşlem isteği
- report.archive
- Policy kapsamı
- ACTION_NOT_GRANTED
- Representation gate
- []
- Delivery gate sonucu korudu
Deny branch protected representation üretmez. Empty deliveredFields bir policy beklentisidir; gerçek HTTP capture gördüğümüz anlamına gelmez.
- İşlem isteği
- report.archive
- Policy kapsamı
- ACTION_NOT_GRANTED
- Representation gate
- Body withheld
- Sonuç yetki kapsamını aşmadı
Bu yerel model sonucu işlemi reddeder. Kartlar mantıksal sahipleri gösterir; bu sahne yeni HTTP endpoint veya ağ paketi çalıştırmaz.
- İşlem isteği
- DENY
- Policy kapsamı
- ACTION_NOT_GRANTED
- Representation gate
- []
VARSAYIM · SINIR · KONTROL
Hangi güven varsayımı kırılır?
Normal akışta handler, authentication sonucuyla güvenilir principal kurar; policy principal’ın bu object/action için entitlement’ını belirler. “Login başarılı, öyleyse rapor okunabilir” kestirmesi bu iki kararı birleştirir. Hata authentication’ın başarısız olması değil, doğrulanmış kimliğe sahip bir request’in gerekli object yetkisi olmadan veri almasıdır.
Dersin matrisi bir saldırı yolu tarif etmek yerine beklenen sınırı gösterir. Duru’nun başka owner raporunda allow alması OWNER_REQUIRED kontrolünün etkisiz kaldığını düşündürür. Orion raporunda allow alması tenant sınırının etkisiz kaldığını düşündürür. Her iki sonuç için de actual policy, authoritative object metadata ve veri çıktısı birlikte incelenir; tek UI mesajı kök nedeni kanıtlamaz.
Object, function ve property aynı soru değildir
Object-level kontrol “bu rapor üzerinde bu işlem yapılabilir mi?” diye sorar. Function-level kontrol örneğin report.export işlevinin bu subject’e açık olup olmadığını sorar. Property-level kontrol ise izin verilen report.read sonucunda hangi alanların okunabileceğini veya update sırasında hangi alanların değişebileceğini sınırlar. Birini geçirmek diğerlerini otomatik olarak geçirmez.
Örnekte bir member’a report.read verilirken internalReviewNote response’a dahil edilmez; report.update tanımlansaydı ownerId veya tenantId sıradan editable alan olmazdı. Bu alanlar için ayrı yönetim policy’si gerekir. Geniş serialization veya input binding, izin verilen object action’ını izin verilmeyen field erişimine dönüştürebilir. Etki verinin hassasiyetine ve mevcut action’a bağlıdır; her eksik kontrol aynı etkiye sahip değildir.
Tenant kontrolünü yalnız bir yerde yapmak
API’nin rapor okuma yolunda tenant kontrolü bulunması, aynı raporun cache veya private export yolunda da bulunduğu anlamına gelmez. Broken trust assumption, downstream component’in “buraya geldiyse zaten yetkilidir” demesidir. Background worker’ın yalnız kendi service rolüne bakması da originating actor’ın scope’unu genişletebilir.
Engelleyici kontrol, her korunan yolun tanımlı entitlement’ı uygulaması ve context’in güvenilir biçimde taşınmasıdır. Meşru platform operasyonları farklı bir explicit policy ile tenant’lar arasında çalışabilir; cross-tenant bir işlem görmek tek başına ihlal değildir. Bu örnekte böyle bir istisna tanımlanmadığı için Orion deny beklenir.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Deny kontrolü
- Policy kaydı bir iddiadır
Sunulan ledgerExample demo-authz-001 / OTHER_TENANT interaction’ını tanımlar. synthetic-server-policy kaynağı gerçek production audit veya HTTP capture değildir.
- Decision ledger
- demo-authz-001
- Metadata / context
- Context okunmadı
- Field receipt
- Field receipt okunmadı
- Evidence incelemesi
- Karar yok
- Kural ve context eşleşti
Duru’nun subject tenant’ı atlas, raporun object tenant’ı orion’dur. Bunlar aynı interaction için okunur. atlas-report-read-v1 policyVersion’ı bilinmeden başka kural setinin beklentisi bu karara taşınmaz.
- Decision ledger
- demo-authz-001
- Metadata / context
- atlas ≠ orion / v1
- Field receipt
- Field receipt okunmadı
- Evidence incelemesi
- Karar yok
- Deny gerekçesi ayrı doğrulandı
OTHER_TENANT satırı deny / TENANT_MISMATCH bekler. Bu normal negative control’dür; deny sayısı tek başına saldırı veya hatalı policy kanıtı değildir.
- Decision ledger
- deny / TENANT_MISMATCH
- Metadata / context
- Beklenti uyumlu
- Field receipt
- Field receipt okunmadı
- Evidence incelemesi
- Karar yok
- Karar ile delivery ayrıldı
Sunulan ledgerExample deliveredFields=[] içerir. Bu fixture alanının boşluğu bilinir; ağ üzerinde gerçekten boş body ölçüldüğü iddia edilmez.
- Decision ledger
- deny / TENANT_MISMATCH
- Metadata / context
- Beklenti uyumlu
- Field receipt
- deliveredFields=[]
- Evidence incelemesi
- Karar yok
- Tüm eşleşmeler incelendi
requestId/caseId/policyVersion kapsamındaki bütün sunulan kayıtlar karşılaştırılır. Çelişkili duplicate varsa ilk row seçilmez; sonuç belirsiz olarak korunur.
- Decision ledger
- Interaction scope
- Metadata / context
- Kural kapsamı korunuyor
- Field receipt
- Boş fixture field seti
- Evidence incelemesi
- Alanlar uyumlu
- Regression hükmü sınırlandı
Bu fixture deny/empty-fields kontrolünü geçer. OWN_READ ve REVIEWER_READ izinli positive controls olarak ayrıca korunmalıdır; herkesi reddetmek doğru policy değildir.
- Decision ledger
- deny / TENANT_MISMATCH
- Metadata / context
- Policy beklentisi uyumlu
- Field receipt
- Fixture fields=[]
- Evidence incelemesi
- PASS: supplied matrix
Delivery eksik
- Policy kaydı bir iddiadır
Sunulan ledgerExample demo-authz-001 / OTHER_TENANT interaction’ını tanımlar. synthetic-server-policy kaynağı gerçek production audit veya HTTP capture değildir.
- Decision ledger
- demo-authz-001
- Metadata / context
- Context okunmadı
- Field receipt
- Field receipt okunmadı
- Evidence incelemesi
- Karar yok
- Kural ve context eşleşti
Duru’nun subject tenant’ı atlas, raporun object tenant’ı orion’dur. Bunlar aynı interaction için okunur. atlas-report-read-v1 policyVersion’ı bilinmeden başka kural setinin beklentisi bu karara taşınmaz.
- Decision ledger
- demo-authz-001
- Metadata / context
- atlas ≠ orion / v1
- Field receipt
- Field receipt okunmadı
- Evidence incelemesi
- Karar yok
- Deny gerekçesi ayrı doğrulandı
OTHER_TENANT satırı deny / TENANT_MISMATCH bekler. Bu normal negative control’dür; deny sayısı tek başına saldırı veya hatalı policy kanıtı değildir.
- Decision ledger
- deny / TENANT_MISMATCH
- Metadata / context
- Beklenti uyumlu
- Field receipt
- Field receipt okunmadı
- Evidence incelemesi
- Karar yok
- Karar ile delivery ayrıldı
İnceleme kopyası deliveredFields gözlemini dışarıda bırakır. Deny kaydından gerçek body’nin boş olduğu sonucu üretilemez.
- Decision ledger
- deny / TENANT_MISMATCH
- Metadata / context
- Beklenti uyumlu
- Field receipt
- Receipt eksik
- Evidence incelemesi
- Karar yok
- Tüm eşleşmeler incelendi
requestId/caseId/policyVersion kapsamındaki bütün sunulan kayıtlar karşılaştırılır. Çelişkili duplicate varsa ilk row seçilmez; sonuç belirsiz olarak korunur.
- Decision ledger
- Interaction scope
- Metadata / context
- Kural kapsamı korunuyor
- Field receipt
- Receipt eksik
- Evidence incelemesi
- Coverage eksik
- Regression hükmü sınırlandı
Policy denial bilinir, delivery kısmı UNKNOWN kalır. Ek response kanıtı istenir; kayıp gözlem bir leak veya başarılı koruma gibi sunulmaz.
- Decision ledger
- deny / TENANT_MISMATCH
- Metadata / context
- Policy beklentisi uyumlu
- Field receipt
- UNKNOWN: delivery
- Evidence incelemesi
- UNKNOWN: delivery
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
HTTP log ile decision ledger’ın görevleri
HTTP access log path, status ve timing gösterebilir; ownership comparison veya tenant policy’nin çalıştığını tek başına söylemez. Application’ın policy evaluator’ı server-verified actorId, subjectTenant, objectTenant, action, objectId, decision, reason ve policyVersion alanlarıyla ayrı bir decision event üretir. Bunlar bu örneğin özel şemasıdır; standart OWASP event alanları diye sunulmaz.
requestId aynı interaction’ın karar ve response izini birleştirir. Background iş varsa jobId ve originating actor bağlantısı korunur. Session cookie veya access token’ı correlation için düz metin loglama. Tenant ve actor alanlarını client’in serbest etiketinden kopyalama; veri kaynağını server context olarak işaretle. Audit deposunun okunması da yetki gerektirir.
Üç farklı kanıt sonucu
Pozitif kontrol Duru/own-read için allow/OWNER_READ ve yalnız beklenen rapor alanlarının dönmesidir. Negatif kontrol other-owner için deny/OWNER_REQUIRED ve protected body’nin yokluğudur. Cross-tenant kontrol deny/TENANT_MISMATCH üretir. Bu beklenen deny’lar güvenli baseline’dır; her deny saldırı alarmı değildir. Ekin’in Atlas reviewer-read allow sonucu da meşru ownership istisnasıdır.
Eksik actor, objectTenant veya policyVersion durumunda olay sınıflandırması eksik kanıt olarak kalır. Bir denial event’i bulunması başka bir component’in sonra veri göndermediğini kanıtlamaz. Karar event’i ile delivered-field listesi, response ve varsa mutation sonucunu eşleştir. Kayıt kaybı, saat farkı veya async retry korelasyonu bozabilir; bilinmeyen sonucu allow veya saldırı diye doldurma.
Bu fixture için açıklanabilir review mantığı
Bu derste backend’e özel KQL tablosu uydurmak yerine küçük matrix üzerinde kontrol mantığı kullanılır. Her caseId için expected decision/reason ile observed karar karşılaştırılır; deny case’lerinde deliveredFields boş olmalıdır. Fixture’da subjectTenant ile objectTenant farklıyken allow görmek policy regression adayıdır. Tenant’lar arası açık platform grant’i olan gerçek bir üründe bu predicate tek başına uygun değildir.
Aynı role label’a bakmak yerine policyVersion, current membership ve object metadata ilişkilendirilir. Geniş “deny sayısı arttı” alarmı, kullanıcı rol değişiklikleri veya artık geçersiz bookmark’lar yüzünden false positive üretebilir. İhlal için güçlü kanıt, beklenen deny case’inin allow alması veya deny sonrası protected verinin çıkmasıdır. Matrix’teki beklenen değerlerle gerçek application observation’ları ayrı tutulur; observed karar ayrıca kaydedilir.
Düzeltme ve regression birlikte ilerler
Kontrol bir yolda eksikse önce bütün report erişim yollarını ve policy ownership’ini çıkar. Ortak trusted evaluator veya eşdeğer enforcement kullanan katmanlar kur; tenant context’in bağlantı havuzunda ya da worker reuse sırasında başka işe taşınmadığını doğrula. Değişiklik private download ve cached response gibi yan yolları da kapsamalıdır.
Regression yalnız “yasak artık deny” değildir. Own-read ve aynı tenant reviewer-read çalışmalı; other-owner, cross-tenant, missing context ve unsupported action deny kalmalıdır. Role kaldırma ve cache hit/miss koşullarını ayrıca değerlendir. Bu denge meşru işi bozmadan sınırı onarır. Dosyadaki matrix beklenen sonuçları tanımlar; gerçek uygulama enforcement’ı ancak ilgili code path ve çıktı testleriyle kanıtlanır.
ŞİMDİ VAKAYA UYGULA
Nesne izni hangi field ve action’ı kapsar; bunu ne kanıtlar?
Duru’nun Atlas raporunu okuma izni arşivleme izni vermez. Ekin’in reviewer rolü de tenant sınırını kaldırmaz. Policy kararı ile response’ta görülen field seti ayrıca karşılaştırılır.
Vakadaki doğrulanmış actor, tenant ilişkisi ve requested action için gereken kararları ayır. Authentication veya proof başarısını object permission yerine kullanma.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Atlas rapor policy’si: karar matrisi
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"policyVersion": "atlas-report-read-v1",
"policyScope": "Tenant-owned report.read only; no global administrator or cross-tenant grant.",
"subjects": [
{
"actorId": "duru",
"tenantId": "atlas",
"role": "member",
"active": true
},
{
"actorId": "ekin",
"tenantId": "atlas",
"role": "reviewer",
"active": true
}
],
"objects": [
{
"objectId": "report-atlas-01",
"tenantId": "atlas",
"ownerId": "duru"
},
{
"objectId": "report-atlas-02",
"tenantId": "atlas",
"ownerId": "ekin"
},
{
"objectId": "report-orion-01",
"tenantId": "orion",
"ownerId": "sarp"
}
],
"ruleOrder": [
"active-subject-and-verified-context",
"tenant-match",
"known-action",
"known-role",
"owner-or-reviewer",
"explicit-allow"
],
"cases": [
{
"caseId": "OWN_READ",
"actorId": "duru",
"objectId": "report-atlas-01",
"action": "report.read",
"verifiedContextTenant": "atlas",
"expected": {
"decision": "allow",
"reason": "OWNER_READ",
"deliveredFields": [
"objectId",
"title",
"body"
]
}
},
{
"caseId": "OTHER_OWNER",
"actorId": "duru",
"objectId": "report-atlas-02",
"action": "report.read",
"verifiedContextTenant": "atlas",
"expected": {
"decision": "deny",
"reason": "OWNER_REQUIRED",
"deliveredFields": []
}
},
{
"caseId": "OTHER_TENANT",
"actorId": "duru",
"objectId": "report-orion-01",
"action": "report.read",
"verifiedContextTenant": "atlas",
"expected": {
"decision": "deny",
"reason": "TENANT_MISMATCH",
"deliveredFields": []
}
},
{
"caseId": "REVIEWER_READ",
"actorId": "ekin",
"objectId": "report-atlas-01",
"action": "report.read",
"verifiedContextTenant": "atlas",
"expected": {
"decision": "allow",
"reason": "REVIEWER_READ",
"deliveredFields": [
"objectId",
"title",
"body"
]
}
},
{
"caseId": "REVIEWER_OTHER_TENANT",
"actorId": "ekin",
"objectId": "report-orion-01",
"action": "report.read",
"verifiedContextTenant": "atlas",
"expected": {
"decision": "deny",
"reason": "TENANT_MISMATCH",
"deliveredFields": []
}
},
{
"caseId": "NO_CONTEXT",
"actorId": "duru",
"objectId": "report-atlas-01",
"action": "report.read",
"verifiedContextTenant": null,
"expected": {
"decision": "deny",
"reason": "CONTEXT_REQUIRED",
"deliveredFields": []
}
},
{
"caseId": "UNKNOWN_ACTION",
"actorId": "duru",
"objectId": "report-atlas-01",
"action": "report.archive",
"verifiedContextTenant": "atlas",
"expected": {
"decision": "deny",
"reason": "ACTION_NOT_GRANTED",
"deliveredFields": []
}
}
],
"ledgerExample": {
"requestId": "demo-authz-001",
"caseId": "OTHER_TENANT",
"actorId": "duru",
"subjectTenant": "atlas",
"objectId": "report-orion-01",
"objectTenant": "orion",
"action": "report.read",
"policyVersion": "atlas-report-read-v1",
"decision": "deny",
"reason": "TENANT_MISMATCH",
"deliveredFields": [],
"source": "synthetic-server-policy"
}
}- subjects / objects
- Önceden verilmiş kimlik ve rapor metadata’sı. Client’in role veya owner iddiası değildir.
- verifiedContextTenant
- Server’ın üyelikten kurduğu aktif context; null case’i eksik context kararını gösterir.
- ruleOrder
- Bu öğretim modelinin kontrol/gerekçe sırası; çoklu hata durumunda ilk başarısız koşul reason’ı belirler.
- expected
- Policy’ye göre olması gereken sonuç. Gerçek runtime observation değildir.
- deliveredFields
- Allow halinde izin verilen response field adları; deny durumunda protected field çıkışı beklenmez.
- requestId / policyVersion
- Interaction korelasyonu ve kural seti kimliği; secret veya credential değildir.
Sentetik, inert JSON; gerçek HTTP isteği, database capture veya production audit değildir. Membership, time ve concurrency için tam model değildir; policyVersion kendi başına revocation sağlamaz. Browser’da çalışan educational evaluator server enforcement kanıtı sayılmaz.
İki yanlış kanı
Login olan kullanıcı application’daki bütün resources’a erişebilir.
Authentication kimliği kurar. Belirli object, action ve gerekirse field için authorization ayrıca değerlendirilir.
UI’da butonu gizlemek server authorization’dır.
UI izin kararını kullanıcıya yansıtabilir; korunan işlem trusted service layer’da ayrıca enforce edilmelidir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Ekin atlas tenant’ında reviewer. report-orion-01 için report.read istiyor; verified context atlas. Seçilen policy hangi sonucu verir?
- TENANT_MISMATCH ile deny; protected fields teslim edilmez.
- Reviewer olduğu için bütün tenant raporlarına allow.
- Yalnız owner olmadığı için OWNER_REQUIRED.
Gerekçeli cevabı oku
TENANT_MISMATCH ile deny; protected fields teslim edilmez. — Subject, object ve verified context aynı tenant sınırında birleşmelidir. Bu örnekte reviewer yetkisi ancak bu gate geçtikten sonra anlam taşır. Deny sonucunda deliveredFields boş kalmalıdır.
Aşağıdaki expected satırı server enforcement hakkında neyi kanıtlar?
OTHER_TENANT için policy beklentisi; runtime kaydı değil
- caseId
- OTHER_TENANT
- expected.decision / reason
- deny / TENANT_MISMATCH
- expected.deliveredFields
- []
- evidence origin
- synthetic policy matrix
- Gerekli sonucu tanımlar; gerçek response teslimini ölçmez.
- Production’da hiçbir foreign-tenant field çıkmadığı kanıtlanır.
- Boş expected list cache ve jobs’un da aynı kontrolü yaptığına kanıttır.
Gerekçeli cevabı oku
Gerekli sonucu tanımlar; gerçek response teslimini ölçmez. — Policy matrix gerekçeli regression beklentisini sağlar. Enforcement kanıtı için allow/deny koşullarına ek olarak teslim edilen fields ve farklı DB/cache/file/job yolları ölçülmelidir; gerçek üretim sonucunu bu JSON tek başına göstermez.
Duru kendi atlas raporunu istiyor ama verifiedContextTenant null. Owner eşleşmesine rağmen deny neden gereklidir? Cache veya job yolu bunu nasıl korumalı?
Gerekçeli cevabı oku
Seçilen policy önce active subject ve verified context ister. null context tenant eşleşmesini güvenle kuramaz; owner kontrolüne geçmeden CONTEXT_REQUIRED ile deny edilir, protected body/fields çıkmaz. Cache hit aynı permission/context gate’ini atlamamalı; job consumer da kimliği ve yürütme anındaki geçerli scope’u doğrulamalıdır. Context eksikliği, Duru’nun her durumda yetkisiz olduğunu kanıtlamaz; bu request için gerekli kanıt bulunmadığını gösterir.
□ Owner eşleşmesini verified context yerine koymadım.
□ Deny’da protected teslimin boş kalmasını açıkladım.
□ Cache/job için aynı gate ve güncel context gereksinimini korudum.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
MANUAL LAB
Request, session ve resource policy
İki workbook ile gerçek loopback HTTP request, cookie/store ayrımı ve seeded permission kararlarını izle.
Tahmin → gözlem → açıklama workbook’unu aç ↗GitHub kaynakları ↗Kaynaklar ve kapsam
- OWASP Authorization Cheat SheetIntroduction · Deny by Default · Validate the Permissions on Every Request · Prefer Attribute and Relationship Based Access Control over RBAC · Verify that Authorization Checks are Performed in the Right Location
- OWASP ASVS 5.0.0 — V8 Authorization8.1.1–8.1.4 · 8.2.1–8.2.4 · 8.3.1–8.3.3 · 8.4.1
- OWASP API1:2023 — Broken Object Level AuthorizationIs the API Vulnerable? · How To Prevent
- OWASP API3:2023 — Broken Object Property Level AuthorizationIs the API Vulnerable? · How To Prevent
- OWASP API5:2023 — Broken Function Level AuthorizationIs the API Vulnerable? · How To Prevent
- OWASP Multi Tenant Security Cheat Sheet1. Tenant Identification & Context Management · 3. Preventing Cross-Tenant Data Access (IDOR Prevention) · 4. Cache & Session Isolation · Tenant-Aware Asynchronous Work · Tenant-Aware Logging & Monitoring · 6. File Storage & Blob Isolation
- OWASP Logging Cheat SheetEvent attributes · Data to exclude · Event collection · Verification