Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

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.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Owner read · allow

  1. İ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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. İ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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. İ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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. İ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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. İ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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. İ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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. İ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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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ı

  1. 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
  2. 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
  3. İş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
  4. 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
  5. 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
  6. 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ı

  1. 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
  2. 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
  3. İş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
  4. 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
    []
  5. 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
  6. 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ü

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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?

  1. TENANT_MISMATCH ile deny; protected fields teslim edilmez.
  2. Reviewer olduğu için bütün tenant raporlarına allow.
  3. 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
  1. Gerekli sonucu tanımlar; gerçek response teslimini ölçmez.
  2. Production’da hiçbir foreign-tenant field çıkmadığı kanıtlanır.
  3. 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