OAuth 2.0 Token Exchange'in Farklı Yüzleri
(auth0.com)- Bir güvenlik tokenını başka bir tokena dönüştüren standart tabanlı bir mekanizma; RFC 8693'te tanımlanan OAuth 2.0 genişletme spesifikasyonu
- Yetkilendirme sunucusunu bir Security Token Service(STS) haline getirerek, istemcinin gönderdiği tokenı doğrular ve farklı bağlam, hedef kitle (audience) ve amaca uygun yeni bir token verir
- Çalışma biçimi genel olarak iki moda ayrılır: kimliğe bürünme (Impersonation) ve yetki devri (Delegation)
- Yönetici kimliğine bürünmesi, protokol geçişi, servis zincirleme, federasyon kimliği gibi farklı kullanım senaryolarının her birinin kendi ödünleşimleri ve güvenlik etkileri vardır
- Yapay zeka ajanlarının yaygınlaşmasıyla, birden çok servis ve sağlayıcı arasında gidip gelen işler özünde bir yetki devri zincirine dönüştüğünden token değişiminin önemi daha da artıyor
Token Exchange nedir?
- İstemci
subject_tokenı (isteğin öznesi olan kullanıcıyı/varlığı temsil eden token) gönderir ve isteğe bağlı olarakactor_tokenı (değişimi gerçekleştiren taraf) da birlikte gönderirse, hedef bağlama uygun yeni bir token alır - Mevcut tokenı olduğu gibi iletmek ya da yeni bir tokenı sıfırdan oluşturmak sezgisel görünebilir; ancak her iki yaklaşım da ciddi sorunlara yol açtığı için bu sorunları çözmek üzere bu spesifikasyon oluşturulmuştur
-
İki temel çalışma modu
- Impersonation: İsteği yapan taraf, orijinal özneyle ayırt edilemeyen bir token alır; aşağı akış servisleri bunun gerçek kullanıcı mı yoksa onun kimliğine bürünen taraf mı olduğunu ayıramaz
- Delegation: Her iki öznenin kimliği de korunur; yeni token içindeki
act(actor) claim'i sayesinde aşağı akış servisleri hem kullanıcıyı hem de onun adına hareket eden tarafı görebilir - Kimliğe bürünme güçlüdür ama opaktır; yetki devri ise kısıtlıdır ama denetlenebilir — bu seçim güvenlik duruşunu ve izlenebilirliği belirler
Yönetici kimliğine bürünmesi (Administrative Impersonation)
- Müşteri panosunda yanlış verilerin gösterilmesi sorununu teşhis etmek için, destek mühendisinin müşterinin sahip olduğu yetkiler ve veri erişimiyle ekranı birebir görmesi gereken durum
- Yönetici kendi tokenını müşterinin kimliğini temsil eden bir tokenla değiştirir; ortaya çıkan token müşterinin
subclaim'ini, scope'larını ve audience'ını içerdiğinden uygulama açısından istek müşteriden gelmiş gibi görünür - Bu durumda istek yalnızca
subject_tokenı (kimliğine bürünülecek kullanıcı) kullanır veactor_tokensağlanmaz — çünkü amaç tam anlamıyla kimliğe bürünmedir -
Denetim izi kaybı sorunu
- Bu gerçek bir kimliğe bürünme olduğu için, eylemi gerçekte kimin yaptığına dair denetim izi kaybolur
- Bu nedenle kim, ne zaman, hangi nedenle değişimi başlattı bilgisini kaydeden harici bir loglama mekanizması mutlaka eşlik etmelidir; aksi halde sorun çözme bahanesiyle bir güvenlik boşluğu oluşur
Protokol geçişini yönetmek (Managing Protocol Transition)
- Legacy sistemlerin ve eski protokollerin kaldığı ortamlarda, SAML kimlik doğrulamadan OpenID Connect(OIDC)'e geçiş yapılırken iki sistemin bir süre birlikte çalıştırıldığı senaryo
- Kullanıcıyı SAML ile doğrulayan servis, SAML assertion'ını OAuth 2.0 access tokenına dönüştürür; yetkilendirme sunucusu gelen SAML artefact'ını doğrular ve aşağı akışın anlayacağı standart bir access token verir
-
subject_token_typeparametresi- Gelen tokenın biçimini tanımlar; RFC 8693 birden çok token türü tanımlayıcısı tanımlar
- SAML 2.0 assertion:
urn:ietf:params:oauth:token-type:saml2 - JWT token:
urn:ietf:params:oauth:token-type:jwt
- SAML 2.0 assertion:
- Yetkilendirme sunucusu, farklı protokol ailelerine ait tokenları kabul edip bunları modern servisler için tutarlı bir biçime normalize edebilir
- Gelen tokenın biçimini tanımlar; RFC 8693 birden çok token türü tanımlayıcısı tanımlar
- Şirket birleşme ve satın almalarında, farklı kimlik yığınlarına sahip iki organizasyonun tam geçiş tamamlanmadan önce birlikte çalışması gerektiğinde görülen bir desen; kullanıcı mevcut yöntemiyle kimlik doğrular, sistem de kimlik bilgilerini tüketen servisin beklediği biçime dönüştürür
Servis çağrısı zincirleme (Chaining Service Calls)
- Mikroservis mimarisinde Service A bir kullanıcı isteğini işledikten sonra kullanıcı adına Service B'yi, ardından Service B'nin de Service C'yi çağırması gerektiğinde, her servisin bir sonraki çağrıda hangi kimlik bilgilerini kullanacağı temel sorudur
-
Seçenek 1 — Servisin kendi kimlik bilgilerini kullanması
- Service A, kullanıcı bağlamını yok sayıp kendi istemci kimlik bilgileriyle Service B'yi çağırır; batch işleme, sistem durum denetimi, veri senkronizasyonu gibi kullanıcı bağlamının gerekmediği servisler arası çağrılar için uygundur
- Kullanıcı işin içindeyse Service B kullanıcı düzeyinde yetkilendirme uygulayamaz — isteği hangi kullanıcının yaptığı bilinmediğinden erişim yetkisi doğrulanamaz, güvenlik bağlamı kaybolur
-
Seçenek 2 — Servisin kullanıcı kimliğine bürünmesi
- Service A, kullanıcının orijinal tokenını doğrudan Service B'ye iletir ya da kullanıcıdan ayırt edilemeyen bir tokenla değiştirir; Service B bunu kullanıcıdan gelen bir istek olarak görür ve kullanıcı düzeyinde yetkilendirme uygular
- Service B, kullanıcının doğrudan eylemiyle Service A'nın vekil olarak yaptığı eylemi ayıramaz; Service A ele geçirilirse kullanıcı yetkileri dahilindeki tüm çağrılar yapılabilir ve doğrudan/proxy istekler için farklı güven seviyeleri uygulanamaz — kullanıcı bağlamı korunur ama servis bağlamı kaybolur
-
Seçenek 3 — Kullanıcı adına hareket etmek (Delegation)
- Service A, kullanıcı tokenını hem kullanıcıyı (subject) hem de Service A'yı (actor) tanımlayan yeni bir tokenla değiştirir; sonuç tokenındaki
actclaim'i "User X ile ilgili istek, Service A tarafından yürütüldü" bilgisini taşır - RFC 8693'ün esas olarak desteklemek üzere tasarlandığı yetki devri modeli budur; Service B daha gelişmiş yetkilendirme kararları verebilir — Service A, kullanıcının izin vermediği bir işlemi denediğinde istek başarısız olur
actclaim'i iç içe geçirilebilir (nestable); Service B, Service C'yi çağırdığında yetki devri zinciri genişler ve tam bir denetim izi sağlar- Ödünleşim karmaşıklıktır — her atlamada token değişimi gerekir, bu da gecikmeyi artırır ve her servisin yetkilendirme sunucusunda istemci olarak kayıtlı olmasını gerektirir; ancak güvenlik ve denetimin önemli olduğu mimarilerde ilkesel seçim budur
- Service A, kullanıcı tokenını hem kullanıcıyı (subject) hem de Service A'yı (actor) tanımlayan yeni bir tokenla değiştirir; sonuç tokenındaki
Token Exchange ve federasyon kimliği
- Servisler güvenlik alanları arasında geçtiğinde (ör. üçüncü taraf bir organizasyonun sağladığı servis) zincir senaryosu çok daha karmaşık hale gelir
- Service A, MyCompany güvenlik alanındaki kullanıcı adına Service B'ye erişen bir tokena sahiptir
- Service B'nin, External Provider alanında korunan Service C'yi çağırması gerekir ve bunun için bir access tokena ihtiyacı vardır
- MyCompany yetkilendirme sunucusunun verdiği token, External Provider alanında anlamsızdır — bir yetkilendirme sunucusunun verdiği token başka bir sunucu tarafından otomatik olarak kabul edilmez; güven sınırları, etki alanını (blast radius) sınırlamak için vardır
-
Federasyon kurulumunun sınırları
- External Provider yetkilendirme sunucusunun, MyCompany alanındaki tokenları geçerli bir subject token olarak kabul edecek şekilde yapılandırılması gerekir; metadata değişimi, sertifika doğrulaması ve doğrudan yapılandırma yoluyla önceden güven ilişkisi ile alanlar arası kimlik eşlemesi gerekir
- Alan sayısı arttıkça (kurumsal entegrasyonlar, SaaS ekosistemi, çoklu bulut), ikili güven ilişkileri matrisi yönetilemez hale gelir
-
Cross App Access ve Identity Chaining
- Bu ölçeklenme sorununu çözmek için Cross App Access(XAA), Identity Assertion JWT Authorization Grant'i uygular ve alanlar arası değişimde kurumsal IdP'yi aracı olarak devreye sokar
- Temel fikir, IdP'nin zaten her iki uygulamayı ve kullanıcı ilişkisini biliyor olmasıdır; böylece her alan çiftinin ayrı ayrı güven kurması yerine erişim kararları IdP üzerinde merkezileştirilir
-
XAA akışındaki 4 taraf
- Requesting App: Başka bir alandaki kaynağa erişmesi gereken MyCompany alanındaki uygulama (veya yapay zeka ajanı)
- Enterprise IdP: Çalışanların kimliğini doğrulayan ve uygulamalar arası politikaları yöneten MyCompany alanı kimlik sağlayıcısı
- Resource App: External Provider alanında korunan API'nin sahibi olan uygulama
- Resource Authorization Server: Resource App'in korunan API'si için access token veren yetkilendirme sunucusu
-
XAA'nin adım adım akışı
- Çalışan, SSO ile Requesting App'e giriş yapar ve IdP'den bir ID token alır
- Requesting App bu ID tokenı tekrar IdP'ye göndererek alanlar arası kimlik assertion'ı (ID-JAG, uygulamalar arası kullanım için scope'lanmış özel bir JWT) ister
- IdP, XAA politikasını kontrol eder — bu kullanıcı adına Resource App'e erişime izin verilip verilmediğine karar verir; izin varsa ID-JAG döner
- Requesting App, ID-JAG'i Resource App yetkilendirme sunucusuna sunar
- Resource App yetkilendirme sunucusu, OIDC discovery ile IdP'nin açık anahtarını kullanarak ID-JAG'i doğrular ve ardından access token verir
- Requesting App bu access token ile Resource App API'sini çağırır
- Normal token değişiminden kritik fark, 3. adımda IdP'nin politika kararını zorunlu kılmasıdır — yöneticiler hangi uygulamanın hangi kaynağa erişebileceğini açıkça yapılandırır; bu da IT ekiplerine görünürlük ve kontrol sağlar, kullanıcılar ise tekrarlayan onay akışlarından kaçınır
- Identity Chaining, kullanıcı kimliği assertion'ının ilk kimlik doğrulamadan tüm aşağı akış servislere kadar standart bir biçimde aktığı daha geniş bir desendir; XAA ise bunun OAuth primitive'leri üzerine kurulu bir uygulamasıdır
- Tek bir kullanıcı isteğinin birden çok üçüncü taraf sağlayıcı servis çağrısını tetiklediği yapay zeka ajanı senaryolarında özellikle önemlidir
Token Exchange ve Auth0
- Auth0, yukarıda ele alınan spektrumun farklı noktalarını kapsayan mekanizmalarla token değişimini uygular
-
Custom Token Exchange
- Auth0'un
/oauth/tokenendpoint'inde RFC 8693'ü uygular ve doğrulama mantığı üzerinde geliştiriciye tam kontrol sağlar subject_token_typeURI'sini özel bir Action'a eşleyen Token Exchange Profile tanımlanır; istek geldiğinde Auth0, token doğrulama, yetkilendirme kurallarını uygulama ve tenant içindeki kullanıcıyı eşleme için Action kodunu çalıştırır- Auth0
subject_tokenı opak bir string olarak ele aldığından, başka bir IdP'den gelen JWT, legacy SAML assertion'ı ya da partner API'nin özel tokenı gibi her biçimi kabul edebilir — bu da onu protokol geçişi ve özel federasyon için uygun bir mekanizma yapar
- Auth0'un
-
Token Vault
- Birden çok sağlayıcı genelinde kullanıcı adına üçüncü taraf API'leri çağıran yapay zeka ajanı senaryoları için, token değişimine güvenli saklama ve otomatik yaşam döngüsü yönetimi ekler
- Kullanıcı kimlik doğrulamadan sonra hesaplarını (Google, GitHub, Slack, Microsoft vb.) bağlar; Token Vault tokenları güvenli biçimde saklar ve yenilemeyi otomatik yürütür; yapay zeka ajanı da token değişimi yoluyla geçerli bir access tokenı kasadan alır
- Sonuç tokenı, yapay zeka ajanını tanımlayan bir
actclaim'i içerir — hangi ajanın hangi kullanıcı adına hangi servise eriştiğine dair denetim izi oluşturur; bu da otomasyonu neyin tetiklediğinin bilinmesini gerektiren kurumsal uyumluluk için kritiktir
-
On-Behalf-Of (OBO) Token Exchange
- Servis zinciri senaryoları için yetki devri desenini doğrudan uygular; ara katman servis, gelen kullanıcı tokenını aşağı akış API'ye scope'lanmış yeni bir tokenla değiştirir ve
actclaim'i ile kendini yetki devri zincirine ekler - En fazla 5 seviyeli iç içe yetki devri zinciri desteği sunar; her token
sub(kullanıcı kimliğini korur),aud(hedef servis scope'u) ve iç içeact(zincirdeki servisleri kaydeder) claim'lerini taşır
- Servis zinciri senaryoları için yetki devri desenini doğrudan uygular; ara katman servis, gelen kullanıcı tokenını aşağı akış API'ye scope'lanmış yeni bir tokenla değiştirir ve
-
Cross App Access (XAA)
- İstekte bulunan uygulamanın, başka bir yetkilendirme sunucusu tarafından korunan kaynak API'yi çağırması gereken federasyon kimliği senaryoları için, Identity Assertion Authorization Grant OAuth genişletmesini uygular
- Auth0, Resource Authorization Server rolünü üstlenir — Requesting App kullanıcı ID tokenını Okta gibi bir IdP'ye gönderip ID-JAG alır; IdP yalnızca yönetici Admin Console üzerinden uygulamalar arası bağlantıyı yapılandırdıysa assertion verir
- Requesting App ID-JAG'i Auth0'a sunduğunda, Auth0 bunu OIDC discovery ile doğrular ve scope'lanmış access token verir; böylece IT ekiplerine uygulamalar arası veri paylaşımında merkezi görünürlük sağlar
Doğru yaklaşımı seçmek
- Token Exchange tek bir çözüm değil, bir desenler kümesidir; hangi bağlamın korunacağına ve hangi güven sınırlarının aşılacağına göre seçim değişir
- Yönetici kimliğine bürünmesi: Sorun giderirken kullanıcının gördüğü ekranı aynen görmek gerektiğinde
- Protokol geçişi: Geçiş sürecinde legacy ve modern kimlik sistemleri arasında köprü gerektiğinde
- Delegation: Servis zinciri, tam denetlenebilirlikle birlikte kullanıcı bağlamı gerektirdiğinde
- Cross App Access / Identity Chaining: Yetki devri birden çok güvenlik alanına yayıldığında
- Token Vault: Yapay zeka ajanı, kullanıcı adına üçüncü taraf API'lere yönetilen erişim gerektirdiğinde
- Birden çok servis ve sağlayıcı boyunca kullanıcı adına işleri orkestre eden yapay zeka ajanları özünde birer yetki devri zinciridir; token değişim mekanizmaları da bu zinciri denetlenebilir, yetkilendirilmiş ve kullanıcının niyetiyle scope'lanmış hale getiren güvenlik temelini sağlar
Henüz yorum yok.