İçeriğe atla
Ayhan Sipahi Ayhan Sipahi

Dogwood: AI Ajanları için Zamansal Yetkilendirme

AWS Dogwood, Cedar politikalarına zamansal koşullar ekler, bunları düz Cedar'a indirger ve ajan korumalarını Amazon Bedrock AgentCore ağ geçidinde uygular.

Özet

Anlık yetkilendirme tek bir soruya cevap verir: bu tek istek izinli mi? Sırayla araç çağıran otonom bir ajan için bu gerekli ama yeterli değildir. Bir araç çağrısı tek başına geçerli, ama ajanın hemen öncesinde yaptığı işe bakıldığında yanlış olabilir. AWS, bu boşluğu kapatmak için Dogwood’u 2026-08-06 tarihinde Apache 2.0 lisansıyla açık kaynak yaptı. Dogwood, Cedar’ın üzerine zamansal koşullar ekleyen bir politika dilidir; sonra her zamansal ifadeyi sıradan Cedar’a derler (“indirger”). Burada Cedar bilgisi varsayılıyor. Odak, Dogwood’un bunun üzerine ne eklediği: zamansal operatörler, indirgemenin nasıl çalıştığı, Amazon Bedrock AgentCore’un zamansal politikaları ağ geçidinde nasıl uyguladığı ve dürüst sınırların nerede olduğu. Cedar’ın kendisine dair bir hatırlatma istersen Cedar vs Rego vs OpenFGA karşılaştırmasına bakabilirsin.

Ajanlar İçin Anlık Yetkilendirme Neden Yetersiz Kalır

Cedar her isteği yalıtılmış olarak karara bağlar. Principal’a, action’a, resource’a ve çağıran tarafın sağladığı bir bağlama (context) bakar, sonra izin ver ya da reddet döner. Bu durumsuzluk bilinçli bir tercihtir. Cedar’ı çözümlenebilir (analyzable) kılan tam olarak budur: aynı istekler aynı kararları verir ve bir çözücü, bir politika kümesinin neye izin verip veremeyeceği üzerine akıl yürütebilir.

Otonom, araç çağıran bir ajan, her isteğin tek başına durduğu varsayımını bozar. Ajan bir yörünge (trajectory) üretir: her biri öncekilerin çıktılarıyla şekillenen bir araç çağrıları dizisi. Tek bir çağrı her anlık kontrolü geçebilir, ama öncesinde olanların bağlamında yine de zararlı olabilir. The New Stack bu boşluğu iyi çerçeveledi: sorun, bir ajanın yapmasına izin verilen şey ile çalışma zamanı geçmişi göz önüne alındığında yapması gereken şey arasındaki mesafedir. Prompt mühendisliği ve durağan erişim kontrol listeleri bu mesafeyi kapatmaz. Deterministik, süreç dışı (out-of-band) bir politika katmanı kapatabilir.

Hata Biçimleri

AWS, anlık yetkilendirmenin yakalayamadığı birkaç kalıba dikkat çekiyor:

  • Güvenilmez veri bulaşması. Bir çağrı tek başına güvenli, ama ajanın güvenilmez bir kaynaktan okuma yaptığı anın hemen ardından zararlıdır. Bu klasik prompt-injection zinciridir. İstek düzgün görünür; asıl sorun sıradır.
  • Çağrılar arası değiştirme. Ajan meşru bir get_client_profile çalıştırır, sonra execute_trade’e uydurma bir hesap kimliği geçirir. Her çağrı biçimsel olarak doğrudur. Ama o kimlik sorgudan hiç dönmemişti.
  • Kontrolsüz toplama. Ajan onlarca transfer başlatır. Her biri istek başına sınırın altındadır, ama toplam tutar bütçeyi aşar. Anlık yetkilendirmenin bunu yakalayacak bir belleği yoktur.
  • Çelişki. Ajan bir talebi onaylar, sonra saniyeler içinde aynı talebi reddeder; ya da bir menkul kıymeti alıp aynı yörüngede zararına satar. Tek tek yasal, birlikte anormal.
  • Bayat girdi. Ajan, çok önce çekilmiş bir piyasa fiyatına göre işlem yapar.

Cedar bunların hiçbirini ifade edemez, çünkü hiçbiri yalnızca mevcut istekten karara bağlanamaz. Dolayısıyla amaç Cedar’ı düzeltmek değildir. Amaç, yine Cedar’a indirgenen bir zamansal katman eklemektir. İşte bu Dogwood’dur.

Dogwood Ne Ekliyor

Dogwood bir politikayı, bir oturumdaki önceki olayların geçmişine göre değerlendirir: bunların sırasına, aralarındaki zaman pencerelerine, ne sıklıkta gerçekleştiklerine ve verileri üzerindeki birikimli toplamlara göre. Merkezi tasarım hamlesi bunu pratik tutar. Dogwood yeni bir motor değildir. Her zamansal ifade sıradan Cedar’a derlenir; orada zamansal koşul, bir çalışma zamanının Cedar değerlendirmeden önce olay geçmişinden doldurduğu bir context.* yuvasına dönüşür. Sonucu önemlidir: sözdizimsel olarak geçerli her Cedar politikası zaten geçerli bir Dogwood politikasıdır. Mevcut Cedar kuralları değişmeden çalışmaya devam eder, dolayısıyla göç (migration) yoktur.

Kuramsal temeli, çalışma zamanı doğrulamasından (runtime verification) alınan Metric First-Order Temporal Logic’tir (MFOTL). Bu, çalışan bir sistemin zaman içinde bir zamansal belirtime uyup uymadığını denetlemek için kullanılan matematiğin aynısıdır. Dogwood’un kullanıcıya dönük operatörleri, MFOTL operatörlerinden oluşan küçük bir çekirdek alt küme cinsinden tanımlanır.

Cedar ve Dogwood

BoyutCedar (anlık)Dogwood (zaman içinde)
AmaçTek bir istek üzerinde erişim kontrolü kararlarıZaman içindeki olay kalıplarına bağlı kararlar
Politikanın gördüğüYalnızca mevcut istekMevcut istek artı bir olay geçmişi
Anahtar yapıPrincipal, action, resource, context üzerinde when { ... }when temporal { ... } ekler; ayrıca satır içi temporal { ... } ifadesi olarak da kullanılabilir
OperatörlerCedar’ın ifade dilisince, formerly, once ve toplamalar: count_within, count_distinct_within, sum_within, bind
Ek gerçeklerÇağıran tarafın sağladığı context öznitelikleriBilgi sağlayıcılar: değerlendirme anında enjekte edilen hesaplanmış koruma gerçekleri (Rhai)
Kuramsal temelOtomatik akıl yürütme için kurulmuş öznitelik tabanlı yetkilendirmeRuntime verification’dan gelen Metric First-Order Temporal Logic
DeğerlendirmeDoğrudan, durumsuz Cedar değerlendirmesiCedar’a indirger; her zamansal ifade olay geçmişinden doldurulan bir context.* yuvasına dönüşür
Maliyet profiliAynı istekler, sıra ya da durum ne olursa olsun aynı kararı verirDurumlu: olayları saklar ve arar, dolayısıyla değerlendirme süresi geçmiş uzunluğuna bağlı olabilir

Her ikisi de Apache 2.0’dır. Alt satır ödünleşimi tek cümlede özetler: Dogwood bellek satın alır ve bunun bedelini durum (state) olarak öder.

Olay Modeli

Dogwood, bazen olay günlüğü (event log) de denilen bir olay izine (event trace) göre değerlendirme yapar. Her olay dört şeyi kaydeder:

  • Önceki olaylara göre ifade edilen bir zaman damgası. within 30s ya da within 24h gibi pencereleri mümkün kılan şey budur.
  • Bir action adı ve bir tür: ya request ya da response.
  • İlişkili veri: context.input.* ile erişilen girdi argümanları ve context.output.* olarak çıktı değerleri.
  • O olay için yetkilendirme kararı: izin ver ya da reddet.

Politikalar olayları action’a göre eşleştirir ve verilerine bu input.* ve output.* yuvaları üzerinden ulaşır. Bir zamansal ifade, aslında bu iz üzerinde bir sorgudur.

Zamansal Operatörler

Aşağıdaki biçimler, referans dokümantasyondaki yüzey söz dizimidir. AWS’nin AgentCore örnekleri aynı koşulları bazen daha ayrıntılı, daha alt seviyeli bir biçimde yazar; buradaki makrolar günlük kullanım için tasarlanmış söz dizimidir.

formerly within <window> <Event>{ ... } geriye dönük varlık sorgusudur. Pencere içinde eşleşen bir olayın gerçekleşip gerçekleşmediğini sorar:

formerly within 1h AgentCore::Action::"ApproveSale"::response{
    input.stock: context.input.stock,
    input.shares: context.input.shares,
    output.approved: true
}

Alan bağlamaya (field binding) dikkat et. İfade yalnızca bir onayın olduğunu değil; onayın mevcut istekle aynı hisse ve aynı hisse adedi için olduğunu ve çıktısının approved: true olduğunu da kontrol eder.

count_within(<window>, <Event>{ ... }) bir penceredeki oluşumları sayar:

count_within(1h, AgentCore::Action::"Transfer"::request{ input.amount: _ }) > 5

count_distinct_within(<var>, <window>, <Event>{ ... field: <var> }) bağlanmış bir alanın ayrık (distinct) değerlerini sayar:

count_distinct_within(u, 1h, AgentCore::Action::"Transfer"::request{ input.user: u }) > 3

sum_within(<var>, <window>, <Event>{ ... field: <var> }) sayısal bir alanı toplar:

sum_within(a, 1h, AgentCore::Action::"Transfer"::request{ input.amount: a }) > 5000

bind(<name>, <aggregate>, <expr using name>) bir toplama sonucunu yakalar, sonra ona göre karşılaştırma yapar. Bu bir ani artış (spike) koruyucusudur: son transferlerin toplamından büyük bir transferi engeller.

bind(prior,
    sum_within(a, 1h, AgentCore::Action::"Transfer"::response{ input.amount: a }),
    context.input.amount > prior)

Aileyi iki operatör daha tamamlar. since, bir koşulun bir olay gerçekleştiğinden beri geçerli olduğunu ifade eder. once, bir şeyin kapsam içinde en az bir kez gerçekleştiğini ifade eder. since within <window> biçimi, aşağıda ele alınan “onay tam olarak bir kez tüketilir” kalıplarında görünür.

Bu operatörler standart kütüphane makrolarıdır. Küçük MFOTL çekirdeğine açılırlar; yüzey dilini küçük tutarken altta yatan anlamları kesin bırakan şey budur.

Cedar’a İndirgeme

Bir Dogwood politikası Cedar’ın when’ini genişletir. Sıradan bir Cedar koşulunu, aynı politikada bir zamansal koşulla birleştirebilirsin:

permit ( principal, action == AgentCore::Action::"SellShares", resource )
when {
  context.input.shares <= 100
  && temporal {
    formerly within 1h AgentCore::Action::"ApproveSale"::response{
      input.stock: context.input.stock,
      input.shares: context.input.shares,
      output.approved: true
    }
  }
};

İlk satır düz Cedar’dır: en fazla 100 hisse. temporal bloğu geçmiş gereksinimini ekler: son bir saat içinde aynı hisse ve aynı hisse adedi için eşleşen bir onay. Her ikisi de geçerli olmalı. Zamansal ifadeyi doğrudan when temporal { ... } ile de ekleyebilirsin. Referans uygulaması ağaç temalı bir Drupe ad alanı kullanır, çünkü dogwood ağacı drupe (çekirdekli meyve) verir:

@id("read_after_login")
permit (
    principal,
    action == Drupe::Action::"Read",
    resource
)
when temporal {
    formerly within 1h Drupe::Action::"Login"::request{ input.user: context.input.user }
};

Asıl mekanizma bundan sonra olur. dogwood lower komutu bir Dogwood politikasını standart Cedar’a derler. Zamansal ifade, sentezlenmiş bir context yuvasıyla değiştirilir. Değerlendirme anında bir çalışma zamanı olay geçmişini arar, zamansal koşulun geçerli olup olmadığını hesaplar ve o yuvayı doldurur. Sonrasında normal bir Cedar değerlendiricisi, ortaya çıkan düz Cedar politikasını karara bağlar. İndirgenmiş çıktı şöyle görünür:

permit(principal, action == Drupe::Action::"Read", resource)
when { context.policy_0__temporal_0 };

Değerlendirme motoru Cedar olarak kalır. Dogwood bir ön uç, artı zamansal gerçekleri hesaplayan bir çalışma zamanıdır. Geriye dönük uyumluluğun bedava olmasının nedeni budur: motorun anlaması gereken yeni bir şey yoktur.

Dogwood policy (.dw)

dogwood lower

Cedar policy + context.* slots

Runtime fills slots from event history

Cedar evaluator: ALLOW or DENY

Referans araç zinciri üç komut sunar: bir politikayı şemaya göre doğrula, Cedar’a indir ve kaydedilmiş bir ize göre yeniden oynatarak ne karar vereceğini gör.

dogwood validate policy.dw --policy-schema schema.cedarschema
dogwood lower    policy.dw --policy-schema schema.cedarschema --emit both
dogwood replay   policy.dw --policy-schema schema.cedarschema --trace events.log

Dili bir Rust servisine gömmek için, kütüphaneyi bir Git bağımlılığı olarak ekle:

dogwood-language = { git = "https://github.com/dogwood-policy/dogwood.git" }

Amazon Bedrock AgentCore’da Uygulama

Referans yorumlayıcı bir belirtim ve bir test ortamıdır; üretim için bir politika karar noktası (PDP) değildir. Yönetilen uygulama yolu Amazon Bedrock AgentCore’dur. AgentCore’daki politika artık Dogwood’un zamansal koşullarını destekler ve bunları AgentCore Gateway’de, çevrede, ajanın kendi kodunun dışında çalıştırır.

Akış nettir. Ağ geçidi, bir oturum başlığı (x-amzn-bedrock-agentcore-policy-session-id) taşıyan her isteği yakalar. Politika motoru yörüngeyi, yani o oturum için sıralı önceki action’ları sorgular, mevcut isteği buna karşı Dogwood ile değerlendirir ve deterministik bir izin ver ya da reddet döner, sonra kararın tüm bağlamını günlüğe kaydeder.

ToolTrajectory StoreGateway PolicyAgentToolTrajectory StoreGateway PolicyAgentalt[Denied][Allowed]Agent never reads or writes the trajectory storeTool call + session idFetch prior events for sessionOrdered trajectoryEvaluate temporal policy (Dogwood)DENY (logged)Forward requestResponseResult

Süreç dışı olma özelliği, güvenlik argümanının tamamıdır. Ajan politika mantığını hiç görmez, durum deposuna hiç dokunmaz ve kontrolleri değiştiremez. Modelin ulaşamadığı bir kontrole prompt-injection yapamazsın. Bu, bir sistem prompt’una yerleştirilen herhangi bir talimattan daha güçlü bir garantidir, çünkü uygulama noktası modelin uslu davranmasına bağlı değildir.

Birkaç operasyonel ayrıntı politikaları nasıl tasarlayacağını şekillendirir:

  • Oturum kapsamı, oturum kimliği artı son kullanıcı kimliğidir. Azami geriye bakış penceresi 24 saattir; daha eski olaylar otomatik silinir. Politikalarındaki pencereler bu ufkun içine sığmalıdır.
  • Varsayılan reddet, Cedar anlambilimi korunarak: bir forbid, bir permit’i geçersiz kılar.
  • Action şemaları MCP araç manifestlerinden üretilir. Politika katmanı, ağ geçidinden geçen Model Context Protocol araç çağrılarını, ajandan ajana çağrıları ve model çıkarımını yönetir.
  • Bir politikayı değiştirmek etkin oturumları geçersiz kılar, dolayısıyla bir kural değişikliği, eski politika altında oluşmuş bir yörüngeye geriye dönük uygulanmaz.

Şemalar MCP manifestlerinden geldiği için, politikalarının başvurduğu action’lar ajanın gerçekten açığa çıkardığı araçlarla hizalanır. Özel bir politika katmanının daha geniş bir mimaride nereye oturduğu sorusu için harici yetkilendirme sistemleri yazısına bak.

Operatöre Göre Kullanım Senaryoları

Aşağıdaki her kalıp bir operatöre karşılık gelir, böylece kazanç arzu ifadesi değil somut olur.

İş akışı sıralaması, B adımını yalnızca A adımından sonra ister. Profil-yükle adımını atlayıp doğrudan yeniden dengelemeye geçen bir ajan, talimatları ne olursa olsun reddedilir. Bu, alan bağlaması olmayan formerly within’dir: önkoşul action penceresi içinde gerçekleşti mi?

Çıktıdan girdiye bütünlük, çağrılar arası uydurmanın doğrudan cevabıdır. execute_trade’e geçirilen kimlik, önceki bir get_client_profile yanıtının gerçekten döndürdüğü bir kimliğe eşit olmalıdır. Bu, mevcut girdiyi geçmiş bir çıktıya bağlayan bir alan bağlamasıyla formerly within’dir:

permit ( principal, action == AgentCore::Action::"ExecuteTrade", resource )
when temporal {
    formerly within 1h AgentCore::Action::"GetClientProfile"::response{
        output.account_id: context.input.account_id
    }
};

Veri tazeliği, bir işlemden önce, örneğin 30 saniye içinde bir get_market_price yanıtı ister. Bu formerly within 30s’dir. Pencere kapandığında bayat bir fiyat ifadeyi artık karşılamaz.

Kümülatif bütçe ve hız sınırları doğrudan toplama makrolarından çıkar. Bir penceredeki toplam hareket değeri, sum_within ile bir tavanın altında kalır. Sıklık, count_within ile N’nin altında kalır. Ayrık alıcılar, count_distinct_within ile N’nin altında kalır. Birlikte, anlık yetkilendirmenin cevaplayamadığı soruya cevap verirler: bu ajan günlük bütçesinin altında kaldı mı?

Bir kez tüketilen insan onayı kapısı, önceki bir onaya ihtiyaç duyar ve her onay tam olarak bir yürütmeyi yetkilendirmelidir. since within biçimi onayı ifade eder, bir eşlik eden koruyucu da o onaydan bu yana hiçbir yürütme olmadığını kontrol eder. Bu, bir ajanın tek bir onayı toptan bir yetki gibi kullanmasını önler.

Bir karşılıklı dışlama koruyucusu, aynı yörüngedeki çelişkili action’ları engeller; örneğin aynı çalışmada daha önce alınan bir menkul kıymeti zararına satmak gibi.

Kademeli güven aşınması, hiç insan etkileşimi olmayan bir süreden sonra yazma action’larını iptal ederken okumaları erişilebilir tutar. Uzun otonom çalışmalar böylece denetimsiz risk biriktiremez. Bu, yazmayı kapılamak için kullanılan, yakın zamanlı bir etkileşim olayı üzerinde bir formerly within kontrolüdür.

Hız sınırlama, kota uygulaması ve kullanım takibi (örneğin bir token’ın kaç kez kullanıldığı) hepsi aynı toplama makrolarına indirgenir. Bu genişlik, “birkaç operatörle çok şey yapabilirsin” vaadidir ve operatörler birleştirilebildiği için de tutar.

Bilgi Sağlayıcılar

Her gerçek, olay günlüğünde bulunmaz. Canlı bir risk skoru, harici bir izin listesi ya da hesaplanmış bir sınıflandırma bir yerden gelmelidir. Dogwood bunun için bilgi sağlayıcılar (information providers) ekler: Rhai betikleri tarafından üretilen ve değerlendirme anında ek context alanları olarak enjekte edilen hesaplanmış koruma gerçekleri. Cedar’ın context’i çağıran tarafça sağlanırken, bir bilgi sağlayıcı gerçeği karar anında hesaplar. İsteğe bağlı bir net özelliği, harici aramalar için http_get’i etkinleştirir; güvenilmez girdiden URL kurmaya dair açık uyarılarla birlikte. Bunu geçmişten türetemediğin gerçekler için bir kaçış kapısı olarak gör ve betikleri küçük ve gözden geçirilebilir tut.

Ödünleşimler ve Düz Cedar’ın Hâlâ Kazandığı Durumlar

Zamansal gücün gerçek bir bedeli vardır ve burada dürüst değerlendirme, özellik listesinden daha önemlidir.

Bedel durumdur. Cedar’ın, aynı isteklerin sıra ya da durum ne olursa olsun aynı kararı vereceği garantisi, kuruluş gereği ortadan kalkar. Dogwood olayları saklar ve arar, dolayısıyla değerlendirme süresi geçmiş uzunluğuna bağlı olabilir. Bu, plan yapman gereken operasyonel bir özelliktir, dipnot değil.

Henüz otomatik akıl yürütme yok. Zamansal koşullar şu an Cedar’ın çözümleyici tarzı akıl yürütmesini desteklemiyor. Bunu bir politikanın anlık kısımları için korursun, ama zamansal kısımlar için politika kümesinin neye izin verip veremeyeceğini kanıtlama yeteneğini kaybedersin. Cedar’ı en baştan biçimsel çözümlenebilirlik için seçtiysen, bunu dikkatle tart. Cedar karşılaştırma yazısı bu çözümlenebilirliği derinlemesine ele alır.

Referans yorumlayıcı açıkça üretim için değildir. README bunu söyler ve boşlukları açıkça listeler: olay zaman damgası bütünlüğü doğrulaması yok, olay kimlik doğrulaması yok, Rhai betiklerinde CPU ya da bellek sınırı yok (kötü niyetli bir betik kaynakları tüketebilir), çökmede kaybolan bellek-içi izler (dayanıklılık yok), çok kiracılı kurulumlarda politika yapısını sızdırabilen hata mesajları ve yerleşik denetim günlüğü yok. Üretimde uygulama için yönetilen yol AgentCore’dur. Açık kaynak deposu bir belirtim ve bir referanstır, hazır bir politika karar noktası değil.

Proje erken aşamada. Katkılar henüz kabul edilmiyor; dil kararlı hale gelirken geri bildirim bekleniyor. Yol haritası şunlara işaret ediyor: mutlak zamanlı pencereler (sabit bir saatte sıfırlanan günlük kotalar, çünkü bugünün pencereleri göreli ve kayan pencerelerdir), canlılık (liveness) operatörleri (geleceğe dönük “eninde sonunda olmalı” gereksinimleri, çünkü bugünün operatörleri güvenlik ve geçmiş odaklı) ve çok ajanlı orkestrasyon politikaları. Bunları taahhüt değil, yön olarak gör.

Peki düz Cedar ne zaman doğru tercih olarak kalır? Her karar gerçekten tek başına durduğunda, çözümlenebilirlik politika kümesinin tamamında katı bir gereksinim olduğunda ya da otonom ajanlar hiç çalıştırmadığında. Dogwood’a özellikle, doğruluk bir oturum boyunca sıraya, zamanlamaya, sayılara ya da toplamlara bağlı olduğunda ve uygulama noktası durumu ajanın erişiminin dışında güvenle tutabildiğinde uzan.

Sonuç

Dogwood yetkilendirmeye tek bir ilkel ekler: oturumun belleği, zamansal koşullar olarak ifade edilir ve Cedar’a geri derlenir, böylece değerlendirme motoruna dair hiçbir şey değişmez. Ajan korumalarında eksik olan tam da bu ilkeldi. Stokastik bir aktör, tek tek makul görünen bir araç çağrıları akışı üretir; deterministik bir katman ise bunları geçmişe karşı, süreç dışında, modelin karışamayacağı bir yerde karara bağlar. Ödünleşim açıktır ve adını koymaya değer: geçerli-ama-yanlış sıraları yakalama yeteneği kazanırsın, karşılığında durumsuzluğu ve şimdilik zamansal kısımların çözümlenebilirliğini bırakırsın. Zaten Cedar çalıştırıyorsan, Dogwood’u benimsemek mevcut kurallarına hiçbir şeye mal olmaz ve zamansal kuralları yalnızca sıranın risk olduğu yerlere ekler. Ağ geçidinde herhangi bir şeyi uygulamadan önce, kaydedilmiş bir yörüngeyi bir taslak politikaya karşı dogwood replay ile yeniden oynatarak başla.

Kaynaklar

İlgili yazılar