WEB / WEB-20.S03
Service identity ve async context propagation
Job context’i worker’a ulaşır, fakat trace veya workload identity işlem yetkisi vermez. Güncel amaç ve zaman koşullarını izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Read izinli
- Job context hazır
API, yalnız onaylı context alanlarını yeni job object’ine kopyalar. Trace alias ilişkilendirme içindir, identity kanıtı değildir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Queue waiting; no delivery
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Job queue’ya ulaştı
Queue job’u aldığını kaydeder. Bu receipt worker’ın güncel permission kararını göstermez.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Owned job received; worker delivery pending
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Worker teslimi hazır
Queue aynı job’u worker’a teslim etmek üzere hazırlar. Bu scheduling adımı yerel işlemdir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Context worker’a ulaştı
Worker context’i job tesliminde alır. Workload ve provenance doğrulaması bu modelde verilen girdilerdir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Job received; current recipient/purpose/time pending
- Public note store
- note-A unchanged; no read
- Güncel koşullar kabul edildi
Worker audience, purpose, time, action ve object koşullarını kabul eder. Store read bundan sonra hazırlanır.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Current workload/context/resource allow; read ready
- Public note store
- note-A unchanged; no read
- Read store’a ulaştı
Store onaylı public-note read’i alır. Read-only title projection henüz hazırlanmamıştır.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Current workload/context/resource allow; read ready
- Public note store
- Approved note-A read received; title pending
- Title hazır
Store Tea & Bread title projection’ını yerel read-only işlemle hazırlar. Mutation=false kalır.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Current workload/context/resource allow; read ready
- Public note store
- Tea & Bread title body ready; mutation=false
- Body worker’a ulaştı
Title body worker’a ulaşır. API veya browser’a dönüş ve queue ACK bu sahnede gösterilmez.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Received title=Tea & Bread; read-only success
- Public note store
- Tea & Bread title body ready; mutation=false
Purpose uyuşmaz
- Job context hazır
API, yalnız onaylı context alanlarını yeni job object’ine kopyalar. Trace alias ilişkilendirme içindir, identity kanıtı değildir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Queue waiting; no delivery
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Job queue’ya ulaştı
Queue job’u aldığını kaydeder. Bu receipt worker’ın güncel permission kararını göstermez.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Owned job received; worker delivery pending
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Worker teslimi hazır
Queue aynı job’u worker’a teslim etmek üzere hazırlar. Bu scheduling adımı yerel işlemdir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Context worker’a ulaştı
Worker context’i job tesliminde alır. Workload ve provenance doğrulaması bu modelde verilen girdilerdir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Job received; current recipient/purpose/time pending
- Public note store
- note-A unchanged; no read
- Güncel context değerlendirildi
Worker recipient, purpose ve lifetime koşullarını değerlendirir. Eksik context ile bilinen ret farklı sonuçlardır.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Current gate denied
- Public note store
- note-A unchanged; no read
- Store read durduruldu
Gerekli context koşulu kabul edilmediği için store’a mesaj gönderilmez ve title body oluşturulmaz.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Resource delivery=0; protected title body absent
- Public note store
- note-A unchanged; no read
- Ret nedeni ayrıldı
Context eksikliği, purpose veya zaman reddinden ayrı tutulur. Trace’in devam etmesi işlem yetkisi oluşturmaz.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Known purpose/time denial; mutation=false
- Public note store
- note-A unchanged; no read
Context eksik
- Job context hazır
API, yalnız onaylı context alanlarını yeni job object’ine kopyalar. Trace alias ilişkilendirme içindir, identity kanıtı değildir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Queue waiting; no delivery
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Job queue’ya ulaştı
Queue job’u aldığını kaydeder. Bu receipt worker’ın güncel permission kararını göstermez.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Owned job received; worker delivery pending
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Worker teslimi hazır
Queue aynı job’u worker’a teslim etmek üzere hazırlar. Bu scheduling adımı yerel işlemdir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Context worker’a ulaştı
Worker context’i job tesliminde alır. Workload ve provenance doğrulaması bu modelde verilen girdilerdir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Job received; current recipient/purpose/time pending
- Public note store
- note-A unchanged; no read
- Güncel context değerlendirildi
Worker recipient, purpose ve lifetime koşullarını değerlendirir. Eksik context ile bilinen ret farklı sonuçlardır.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Context evidence unknown
- Public note store
- note-A unchanged; no read
- Store read durduruldu
Gerekli context koşulu kabul edilmediği için store’a mesaj gönderilmez ve title body oluşturulmaz.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Resource delivery=0; protected title body absent
- Public note store
- note-A unchanged; no read
- Ret nedeni ayrıldı
Context eksikliği, purpose veya zaman reddinden ayrı tutulur. Trace’in devam etmesi işlem yetkisi oluşturmaz.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Unknown context; safe deny; mutation=false
- Public note store
- note-A unchanged; no read
Context expired
- Job context hazır
API, yalnız onaylı context alanlarını yeni job object’ine kopyalar. Trace alias ilişkilendirme içindir, identity kanıtı değildir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Queue waiting; no delivery
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Job queue’ya ulaştı
Queue job’u aldığını kaydeder. Bu receipt worker’ın güncel permission kararını göstermez.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Owned job received; worker delivery pending
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Worker teslimi hazır
Queue aynı job’u worker’a teslim etmek üzere hazırlar. Bu scheduling adımı yerel işlemdir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Worker waiting; protected body absent
- Public note store
- note-A unchanged; no read
- Context worker’a ulaştı
Worker context’i job tesliminde alır. Workload ve provenance doğrulaması bu modelde verilen girdilerdir.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Job received; current recipient/purpose/time pending
- Public note store
- note-A unchanged; no read
- Güncel context değerlendirildi
Worker recipient, purpose ve lifetime koşullarını değerlendirir. Eksik context ile bilinen ret farklı sonuçlardır.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Current gate denied
- Public note store
- note-A unchanged; no read
- Store read durduruldu
Gerekli context koşulu kabul edilmediği için store’a mesaj gönderilmez ve title body oluşturulmaz.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Resource delivery=0; protected title body absent
- Public note store
- note-A unchanged; no read
- Ret nedeni ayrıldı
Context eksikliği, purpose veya zaman reddinden ayrı tutulur. Trace’in devam etmesi işlem yetkisi oluşturmaz.
- Notes API
- Approved field copy; own job ready
- Owned queue
- Approved copied job ready for worker
- Notes worker
- Known purpose/time denial; mutation=false
- Public note store
- note-A unchanged; no read
ROLLER · STATE · VERİ AKIŞI
Workload ve end-user iki farklı actor’dır
Bir service’in kimliği, onun hangi end-user adına hangi action’ı yapabileceği ile aynı şey değildir. Notes API’nin Queue’ya kabul edilen workload olması, Duru adına tüm tenant verilerini okuma izni yaratmaz. Service connection identity’si uygun trust roots/issuer ve alıcı profile ile doğrulanır; user delegation ayrıca subject, tenant, purpose, audience, action ve object sınırlarına bağlanır. SPIFFE, workload identity ve onu kanıtlayan SVID kavramını tanımlar; belirli bir SPIFFE ID’nin notes.read permission’ı uygulama policy’sinin kararıdır. Bu derste credential veya SVID byte’ı yoktur. WorkloadVerifiedDeclared, seçilmiş fixture’ın bağımsız girdisidir; ders bu boolean’ı gerçek TLS veya token verification sonucu diye sunmaz. Böylece sender’ı tanıma, user assertion’a güvenme ve resource’a izin verme üç ayrı soruda kalır.
Queue gecikmesi context’in anlamını değiştirir
Async job enqueue anında kabul edilmiş olabilir, ancak worker daha sonra farklı now veya policy revision altında çalışır. Bu nedenle job context’i trusted provenance ile taşınır ve worker kendi operation’ı için audience/purpose/time/action sınırlarını yeniden değerlendirir. Artifact public-note-read purpose’ını notes-worker audience’ına ve note-A object’ine bağlar. validUntil=200 için now=200 equality geçersizdir; bu profilin seçtiği boundary’dir. Purpose farklıysa user’ın adı ve tenant’ı doğru olsa bile read store’a gitmez. Context eksikse permissionUnknown olarak kaydedilir ve güvenli deny seçilir. Queue receipt veya ACK business success anlamına gelmez; bir job’ın geldiğini gösterir. Retries ve idempotency de yetki sağlamaz: aynı job’ın tekrar işlenmesini kontrol etmek ile actor/purpose doğrulamak farklı problemlerdir.
Correlation context identity değildir
Trace context, farklı component’lerdeki aynı işin izini ilişkilendirir. W3C traceparent/tracestate alanlarının amacı correlation’dır; bu alanlara sensitive user claim yerleştirilmez. Defterde trace-A yalnız okunur bir öğretim alias’ıdır, gerçek traceparent syntax’ı değildir. Alias’ın eşleşmesi workload, subject veya permission kanıtı üretmez. Authentication context ile tracing context ayrı field’larda, ayrı provenance ve retention kurallarıyla yönetilir. Yerel kopyalama işleminde yalnız approved job field’ları yeni object’e aktarılır; ana request object’ine referans taşımak başka bir işin state’ini karıştırabilir. AsyncLocalStorage gibi runtime araçları, tek process içindeki async continuation’larda context’i tutmaya yardımcı olur; network veya queue boundary’sinde identity assertion oluşturmaz. Deserialize edilmiş context’in yeniden güvenilir sayılması için alıcının kendi validation’ı gerekir.
Serverless execution reuse ve least privilege
Serverless olmak her invocation’ın yeni process olduğu anlamına gelmez. Execution environment tekrar kullanılabilir; SDK client veya static resource reuse ile request’e özel actor/context state’i birbirinden ayrılır. AWS Lambda’nın function code rehberi user data ve security açısından önemli event state’ini invocation’lar arasında saklamamayı önerir. Dersin yerel iki-context kontrolü Duru/job-A ile Ece/job-B’nin ayrı async store ve kopyalarda kaldığını gösterir; gerçek Lambda isolation testi değildir. Workload’ın platform permission’ı da minimum service rolüyle sınırlandırılır; user delegation o rolün yerine geçmez. Queue consumer’ın readNotes rolü varsa bile current context geçersizken note-A body’si üretilmez. Deployment platformu, token exchange, actual clock sync ve revocation propagation bu modelin dışındaki bağımlılıklardır; bunların kanıtı varmış gibi davranılmaz.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Purpose ret
- Workload predicate olumlu
Wrong-purpose row workloadVerifiedDeclared=true ve assertionIssuerTrustedDeclared=true taşır. Bu iki supplied alan job’un resource action’ına izin vermez.
- Workload / job
- workloadVerifiedDeclared=true
- Worker kararı
- assertionIssuerTrustedDeclared=true
- Güven sınırı
- Resource kararı henüz incelenmedi
- Context var, purpose farklı
ContextPresent=true, subject=Duru ve tenant=tenant-A verilmiş. Purpose=note-export ise seçilen public-note-read purpose’ı değildir.
- Workload / job
- subject=Duru / tenant=tenant-A
- Worker kararı
- purpose=note-export
- Güven sınırı
- Beklenen purpose public-note-read
- Resource allowed tek başına yetmez
ResourceAllowedDeclared=true olsa da job’un purpose koşulu uymuyor. Güncel gate’ler birlikte değerlendirilir.
- Workload / job
- resourceAllowedDeclared=true
- Worker kararı
- purpose mismatch
- Güven sınırı
- Purpose ayrıca gerekir
- Worker kabul etmedi
ExpectedAllowed=false, expectedBody=null ve expectedResourceDelivery=false. Trusted workload, bu purpose ret kararını ortadan kaldırmaz.
- Workload / job
- expectedAllowed=false
- Worker kararı
- expectedBody=null
- Güven sınırı
- Store body teslimi yok
- Service role’leri genişletme
Notes-api’nin enqueue role’ü ve queue’nun delivery role’ü worker’ın current read gate’ini atlayamaz. Bir hop’un rolü sonraki hop’un resource kararı değildir.
- Workload / job
- notes-api: enqueue
- Worker kararı
- notes-worker: current context gate
- Güven sınırı
- Her sınırda kendi karar
- Purpose’u aynı job için raporla
Bu dal workload verification değil purpose koşulunda durur. Başka job’un doğru purpose’ı bu kaydı tamamlamaz.
- Workload / job
- workload declared=true
- Worker kararı
- purpose=note-export / allowed=false
- Güven sınırı
- Bilinen purpose ret
Süre sınırı
- Context kimliği ve scope’u mevcut
Expired row Duru, tenant-A, public-note-read ve notes-worker alanlarını taşır. Bu uygun alanlar time gate’in yerine geçmez.
- Workload / job
- subject=Duru / audience=notes-worker
- Worker kararı
- purpose=public-note-read
- Güven sınırı
- Time gate henüz incelenmedi
- Now sınırın üzerinde değil, eşit
Now=200 ve validUntil=200. Bu örnek current time için now < validUntil ister; eşitlik kabul değildir.
- Workload / job
- now=200
- Worker kararı
- validUntil=200
- Güven sınırı
- 200 < 200 false
- Diğer olumlu alanlar süreyi uzatmaz
ResourceAllowedDeclared=true ve policyRevision=notes-policy-3 verilmiş. Bu alanlar validUntil değerini değiştirmez.
- Workload / job
- resourceAllowedDeclared=true
- Worker kararı
- now=validUntil
- Güven sınırı
- Current time koşulu ayrı
- Süresi dolan iş body almaz
ExpectedAllowed=false ve expectedResourceDelivery=false. Bu row için store’dan worker’a başarılı title teslimi üretilmez.
- Workload / job
- expectedAllowed=false
- Worker kararı
- expectedResourceDelivery=false
- Güven sınırı
- expectedBody=null
- Enqueue zamanı güncel kabul değildir
İş queue’da bekleyebilir. Daha önce geçerli olan context, worker’ın aldığı anda time koşulunu tekrar karşılamak zorundadır.
- Workload / job
- now=200 / validUntil=200
- Worker kararı
- current time gate failed
- Güven sınırı
- Güncel karar gerekir
- Expiry ile revocation ayrı
Bu kayıt seçilen expiry karşılaştırmasını gösterir. ActualRevocation=false olduğu için gerçek identity servisinde revocation uygulandığı sonucuna genişletilmez.
- Workload / job
- time predicate=false
- Worker kararı
- actualRevocation=false
- Güven sınırı
- Yalnız seçilen time gate
VARSAYIM · SINIR · KONTROL
İç ağdan geldi; user context doğrudur varsayımı
İncelenecek varsayım internal connection’ın veya bilinen service adının her user assertion’ına otorite verdiğidir. Bu sonuç için service’in assertion üretme yetkisi ve recipient’ın doğrulama policy’si kaybolmuş olmalıdır. Workload authentication sender’a ilişkindir; “Duru adına public-note-read” assertion’ı farklı bir issuer ve delegation trust kararı gerektirebilir. Defterin wrong-purpose dalında workload tanınır, user context vardır, ama istenen purpose notes-worker profile’ıyla uyuşmaz. Bu branch bir token değiştirme veya bypass denemesi değildir; supplied normal policy satırı yanlış amaç için güvenli biçimde kapanır. Internal hostname, queue adı, trace alias veya başarılı receipt bu kapıyı açmaz. Gerçek bağlantı identity’si incelenmemişse de sonuç saldırı başarısı değildir: workload verification’ın declared bir dependency olduğu açıkça yazılır.
Gecikmiş ve eksik context’i ayırmak
Queue’ya zamanında verilmiş context, worker’ın execution anında hâlâ kabul edilebilir olmayabilir. Bunun impact’i, current time veya policy gate’i yerine eski admission sonucunun kullanılması durumunda doğar. Expired satırı bilinen zaman uyuşmazlığını taşır; context-missing satırı ise actor delegation hakkında yeterli kanıt olmadığını taşır. İkisinin de güvenli sonucu resource delivery=0 ve body=null’dır, ancak teşhisleri farklı kalır. Trace’in devam etmesi identity’nin devam ettiği sonucunu vermez. Aynı mutable object’in iki iş arasında paylaşılması da runtime state karışmasıdır; bu ders yalnız approved copied context ile pozitif isolation gözlemi yapar. Red perspektif supplied koşulların hangisinin gerekli olduğunu sorar, gerçek queue’da privilege yükseltme veya credential kullanımı denemez. Actual distributed replay/retry davranışı için bu finite model kanıt sayılmaz.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Context eksik
- Workload girdisi yine olumlu
Yerel Node AsyncLocalStorage kontrolü jobId ve subject’in iki async scope’ta ayrı kaldığını ölçer. Worker policy satırları ise purpose, audience ve validUntil girdilerine göre üretilir; bunlar queue log’u, signature verification veya IAM kanıtı değildir. Context-missing row workloadVerifiedDeclared=true taşır. Bu service-level girdi user context’in varlığına dair bilgi değildir.
- Job gözlemi
- workloadVerifiedDeclared=true
- Context / store sonucu
- assertionIssuerTrustedDeclared=true
- Kanıt sınırı
- User context ayrıca incelenir
- Subject ve tenant yok
ContextPresent=false, subject=null ve tenant=null. Missing alanlar normal row’daki Duru ve tenant-A ile doldurulmaz.
- Job gözlemi
- contextPresent=false
- Context / store sonucu
- subject=null / tenant=null
- Kanıt sınırı
- User permission bilgisi UNKNOWN
- Resource true context yaratmaz
ResourceAllowedDeclared=true olsa da row permissionEvidence=unknown taşır. Boolean bir resource girdisi eksik subject/tenant bağını oluşturmaz.
- Job gözlemi
- resourceAllowedDeclared=true
- Context / store sonucu
- permissionEvidence=unknown
- Kanıt sınırı
- Context binding gerekli
- Model fail closed durur
ExpectedAllowed=false ve expectedBody=null. Bu sonuç bilinmeyen user context’i belirli bir user için bilinen ret kararına dönüştürmez.
- Job gözlemi
- expectedAllowed=false
- Context / store sonucu
- expectedBody=null
- Kanıt sınırı
- Ret nedeni eksik context
- Trace identity değildir
Correlation.traceAlias=trace-A, identityEvidence=false ve permissionEvidence=false. İşleri ilişkilendiren bir alias subject’in kimliği veya permission’ı değildir.
- Job gözlemi
- traceAlias=trace-A
- Context / store sonucu
- identityEvidence=false / permissionEvidence=false
- Kanıt sınırı
- Correlation kendi kapsamındadır
- Gereken context’i açıkça belirt
Bu job için doğrulanmış subject/tenant ve current gate bilgisi gerekir. Queue delivery veya trace alias eksik alanların yerine geçmez.
- Job gözlemi
- subject / tenant evidence missing
- Context / store sonucu
- permissionEvidence=unknown
- Kanıt sınırı
- Aynı job için current context gerekir
Worker’a teslim
- Normal row scope’u belirli
Yerel Node AsyncLocalStorage kontrolü jobId ve subject’in iki async scope’ta ayrı kaldığını ölçer. Worker policy satırları ise purpose, audience ve validUntil girdilerine göre üretilir; bunlar queue log’u, signature verification veya IAM kanıtı değildir. Normal row Duru, tenant-A, notes.read ve note-A taşır. İncelenen sonuç bu job’un public title okumasına aittir.
- Job gözlemi
- subject=Duru / tenant=tenant-A
- Context / store sonucu
- action=notes.read / noteId=note-A
- Kanıt sınırı
- Bir job’un scope’u
- Current gate kabul etti
Purpose ve audience eşleşir; now=150, validUntil=200. Row expectedAllowed=true taşır; başka job’un gate sonucu buna kopyalanmaz.
- Job gözlemi
- now=150 < validUntil=200
- Context / store sonucu
- expectedAllowed=true
- Kanıt sınırı
- Seçilen gate kabulü
- Body worker’a ait sonuç
ExpectedResourceDelivery=true ve expectedBody.title=Tea & Bread. DeliveryBoundary bu başarının store-to-worker body olduğunu söyler.
- Job gözlemi
- expectedBody.title=Tea & Bread
- Context / store sonucu
- deliveryBoundary=store-to-worker
- Kanıt sınırı
- Worker receipt
- Read-only sonuç mutation değildir
ExpectedMutation=false. Title’ın okunması note üzerinde yazma yapıldığı veya başka action’a izin verildiği anlamına gelmez.
- Job gözlemi
- expectedResourceDelivery=true
- Context / store sonucu
- expectedMutation=false
- Kanıt sınırı
- Read ile write ayrı
- API ve browser dönüşü gösterilmiyor
DeliveryBoundary açıkça no API/browser return der. Worker’ın body alması Duru’nun browser’da sonucu gördüğünü kanıtlamaz.
- Job gözlemi
- store-to-worker body observed
- Context / store sonucu
- no API/browser return
- Kanıt sınırı
- Browser receipt UNKNOWN
- Önce tamamlanan hop’u raporla
Bilinen sonuç current gate sonrası read-only store body’sinin worker’a teslimidir. Trace correlation ile downstream receipt veya retry guarantee eklenmez.
- Job gözlemi
- worker body=Tea & Bread
- Context / store sonucu
- actualRetryGuarantee=false
- Kanıt sınırı
- Teslim scope’u worker’da biter
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Her recipient kendi gate’ini tutar
Yerel Node AsyncLocalStorage kontrolü jobId ve subject’in iki async scope’ta ayrı kaldığını ölçer. Worker policy satırları ise purpose, audience ve validUntil girdilerine göre üretilir; bunlar queue log’u, signature verification veya IAM kanıtı değildir. Notes API, Queue ve Worker için service role’leri açıkça ayrılır: enqueue, dequeue ve notes.read aynı permission değildir. User context minimal approved field projection ile taşınır; downstream recipient kendisine uygun audience, purpose, lifetime ve resource scope’ı doğrular. Geçerli bir signature varsa bile onu belirli assertion’ı üretmeye yetkili issuer’a bağlamak gerekir; burada signature çalıştırılmaz. Başka service’e context aktarmak gerektiğinde amaç ve recipient için uygun delegation veya exchange profili tasarlanır; bir ID token veya user bearer material körlemesine kopyalanmaz. Modelin success dalı store’un read-only title projection’ını worker’a getirir; API’ye veya son browser’a teslim edildiği iddia edilmez. Service verification, user delegation ve resource permission için ayrı telemetry outcome’ları hata nedenini görünür kılar.
Isolation ve başarısızlığın sonuçları
Yerel runtime kontrolünde iki Promise continuation, ayrı AsyncLocalStorage.run scope’larında kendi jobId ve subject değerini görür. Bu, Node içindeki actual context davranışıdır; başka process’in trust kararı değildir. Copied job object’inin title veya trace field’ını değiştirmek original request’i veya ikinci işi değiştirmemelidir. Policy fixture’ları wrong-purpose, expired ve missing-context için store’a mesaj çıkmadığını, mutation yapılmadığını ve protected title body’si oluşmadığını denetler. Unknown context, known-deny ile tek kanıt diye birleştirilmez. Production tasarımında yeniden denemeler, revocation, key rotation ve current policy revision ayrı entegrasyonlarla doğrulanır; idempotency key bir permission belgesi değildir. Serverless environment reuse için request state’i per-invocation scope’da kalır. Bu dersin deterministik sahnesi queue ACK, actual token validation veya cloud IAM enforcement testi olarak sunulmaz.
ŞİMDİ VAKAYA UYGULA
Trusted workload ve correlation, güncel user permission yerine geçer mi?
Duru public note-A başlığını ister. Notes-api, queue ve notes-worker farklı role’ler taşır; worker işi aldığında purpose, audience, zaman ve resource context’ini yeniden değerlendirir.
Vakadaki accepted, delivery ve committed effect kayıtlarını farklı owner’lar üzerinden oku. Caller’ın bilinmeyen sonucunu business rollback olarak yeniden adlandırma.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Atlas Notları — async context kaydı
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"actor": "Duru",
"tenant": "tenant-A",
"action": "notes.read",
"noteId": "note-A",
"title": "Tea & Bread",
"purpose": "public-note-read",
"audience": "notes-worker",
"now": 150,
"validUntil": 200,
"policyRevision": "notes-policy-3",
"apiWorkload": "notes-api",
"workerWorkload": "notes-worker",
"actualNetwork": false,
"actualIdentityVerification": false
},
"rows": [
{
"case": "normal",
"workloadVerifiedDeclared": true,
"assertionIssuerTrustedDeclared": true,
"contextPresent": true,
"subject": "Duru",
"tenant": "tenant-A",
"purpose": "public-note-read",
"audience": "notes-worker",
"action": "notes.read",
"noteId": "note-A",
"now": 150,
"validUntil": 200,
"policyRevision": "notes-policy-3",
"resourceAllowedDeclared": true,
"expectedAllowed": true,
"expectedBody": {
"title": "Tea & Bread"
},
"expectedResourceDelivery": true,
"expectedMutation": false,
"permissionEvidence": "declared-known"
},
{
"case": "wrong-purpose",
"workloadVerifiedDeclared": true,
"assertionIssuerTrustedDeclared": true,
"contextPresent": true,
"subject": "Duru",
"tenant": "tenant-A",
"purpose": "note-export",
"audience": "notes-worker",
"action": "notes.read",
"noteId": "note-A",
"now": 150,
"validUntil": 200,
"policyRevision": "notes-policy-3",
"resourceAllowedDeclared": true,
"expectedAllowed": false,
"expectedBody": null,
"expectedResourceDelivery": false,
"expectedMutation": false,
"permissionEvidence": "declared-known"
},
{
"case": "context-missing",
"workloadVerifiedDeclared": true,
"assertionIssuerTrustedDeclared": true,
"contextPresent": false,
"subject": null,
"tenant": null,
"purpose": "public-note-read",
"audience": "notes-worker",
"action": "notes.read",
"noteId": "note-A",
"now": 150,
"validUntil": 200,
"policyRevision": "notes-policy-3",
"resourceAllowedDeclared": true,
"expectedAllowed": false,
"expectedBody": null,
"expectedResourceDelivery": false,
"expectedMutation": false,
"permissionEvidence": "unknown"
},
{
"case": "expired",
"workloadVerifiedDeclared": true,
"assertionIssuerTrustedDeclared": true,
"contextPresent": true,
"subject": "Duru",
"tenant": "tenant-A",
"purpose": "public-note-read",
"audience": "notes-worker",
"action": "notes.read",
"noteId": "note-A",
"now": 200,
"validUntil": 200,
"policyRevision": "notes-policy-3",
"resourceAllowedDeclared": true,
"expectedAllowed": false,
"expectedBody": null,
"expectedResourceDelivery": false,
"expectedMutation": false,
"permissionEvidence": "declared-known"
}
],
"serviceRoles": [
{
"service": "notes-api",
"permission": "enqueue public-note-read"
},
{
"service": "owned-queue",
"permission": "deliver approved jobs"
},
{
"service": "notes-worker",
"permission": "read own public note after current context gate"
}
],
"copiedContextFields": [
"jobId",
"subject",
"tenant",
"purpose",
"audience",
"action",
"noteId",
"validUntil",
"policyRevision"
],
"correlation": {
"traceAlias": "trace-A",
"actualTraceparent": false,
"identityEvidence": false,
"permissionEvidence": false
},
"deliveryBoundary": "Store-to-worker body only; no API/browser return",
"boundaries": {
"actualQueue": false,
"actualToken": false,
"actualSPIFFE": false,
"actualCloudIAM": false,
"actualRevocation": false,
"actualRetryGuarantee": false
}
}- rows
- Workload ve issuer girdileri ile güncel purpose, audience, time ve resource kararları ayrı tutulur.
- copiedContextFields
- Job’a yalnız izin verilen context alanları kopyalanır. Credential material taşınmaz.
- correlation
- Trace alias aynı işi ilişkilendirmeye yarar; identity veya permission kanıtı değildir.
- deliveryBoundary
- Başarılı body teslimi yalnız store’dan worker’a kadar gösterilir; API veya browser receipt bilgisi yoktur.
Owned synthetic queue ledger ve local copied-context gözlemleri; actual identity service, queue, token, SPIFFE veya cloud deployment yoktur.
İki yanlış kanı
Service tanınıyorsa user’ın tüm yetkileri geçerlidir.
Workload identity ile user delegation ve resource permission ayrı gate’lerdir.
Trace ID aynıysa identity kanıtlanmıştır.
Trace yalnız correlation içindir; trusted identity context ayrıca doğrulanır.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Worker workload doğrulanmış, fakat contextPresent=false ve subject=null. Note body açılır mı?
- Evet. Trusted service her subject adına sınırsız işlem yapabilir.
- Hayır. Permission evidence unknown; delivery yok.
Gerekçeli cevabı oku
Hayır. Permission evidence unknown; delivery yok. — Doğrulanmış workload eksik user/tenant context’ini kendiliğinden üretmez. expectedBody=null kalır.
Job enqueue edilmiş ve traceAlias var. now=validUntil=200 olduğunda worker eski izne dayanabilir mi?
Dersten seçilen artifact alanları; öğretim örneği
- rows[3].now
- 200
- rows[3].validUntil
- 200
- rows[3].expectedAllowed
- false
- correlation
- {"traceAlias":"trace-A","actualTraceparent":false,"identityEvidence":false,"permissionEvidence":false}
- Hayır. Expired context reddedilir; trace izin değildir.
- Evet. Trace ID veya job ID kalıcı authorization credential’ıdır.
Gerekçeli cevabı oku
Hayır. Expired context reddedilir; trace izin değildir. — Current time kontrolü equality anında kapanır. correlation.identityEvidence=false ve permissionEvidence=false; trace alias bu eksikliği gidermez.
Copied context purpose, audience, noteId, validUntil ve policyRevision taşıyor. Bunları kopyalamak neden doğrulanmış delegation veya browser delivery değildir?
Gerekçeli cevabı oku
Worker gerekli issuer/workload provenance’ını, subject/tenant bağını, purpose/audience/action ve güncel permission’ı değerlendirmelidir. Kopyalanmış field’lar tek başına authority kurmaz. Bu scene yalnız store’dan worker’a body teslimini gösterir; API/browser return yoktur. Gerçek queue, token, SPIFFE, IAM veya revocation çalıştırılmaz. Async context carrier’ı identity verifier değildir.
□ Copied context’i trusted provenance yerine kullanmadım.
□ Worker receipt ile API/browser delivery’yi ayırdım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- OWASP Identity Propagation Patterns Cheat SheetValidation at Each Boundary · Simple Service-Level Identity Forwarding; Token Exchange; Privacy and Recommendation
- SPIFFE ConceptsWorkload; SPIFFE ID; Trust Domain; SVID; Trust Bundle
- W3C Trace Context§6 Privacy Considerations: correlation-only fields; §6.1/6.2 · §7 Security Considerations
- AWS Lambda Best practicesFunction code: execution environment reuse, security-sensitive state isolation and idempotency
- Node.js v24.13.0 Asynchronous context trackingClass AsyncLocalStorage; run(store, callback); getStore(); usage with async/await