Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 39

Dağıtık Mimarilerde Anahtar Yönetimi Zorlukları

Recommended resources

Önceki dersimizde, kriptografik sırların oluşturulması ve karşılaştırılmasında zamanlama yan kanalı gibi gizli tehlikeleri nasıl tespit edeceğimizi öğrendik. Güvenli entropi kaynakları ve sabit zamanlı karşılaştırma fonksiyonları artık araç setimizin bir parçası. Ancak, bir sırrı güvenli bir şekilde oluşturmak ve karşılaştırmak, denklemin sadece ilk yarısıdır. Sırlar, özellikle günümüzün dağıtık mimarilerinde, yaşayan varlıklardır: doğarlar, kullanılırlar ve eninde sonunda güvenli bir şekilde yok edilmeleri gerekir.

Bu derste, sırların yaşam döngüsü yönetimine odaklanacağız. Modern mikroservis ve bulut ortamlarının getirdiği karmaşıklıkları mercek altına alacağız. Dersin sonunda, dağıtık mimarilerde anahtar yönetimiyle ilgili kritik zafiyetleri — secret rotation (anahtar rotasyonu) açıkları, güvensiz anahtar paylaşımı ve konfigürasyon sızıntıları — kod ve mimari seviyesinde analiz etme yetkinliğini kazanacaksınız. Bu konu, özellikle DevSecOps ve güvenli mimari tasarımı alanındaki tecrübelerinizle doğrudan örtüşerek, sistemik riskleri daha derinlemesine anlamanıza olanak tanıyacaktır.

Dağıtık Sistemlerde Sırların Kaosu: Secret Sprawl

Monolitik bir uygulamada sırlar genellikle tek bir appsettings.json veya .env dosyasında yönetilebilirdi. Ancak yüzlerce mikroservisin olduğu bir dünyada, her servisin kendi veritabanı şifresine, API anahtarına, mesaj kuyruğu kimlik bilgisine ihtiyacı vardır. Bu durum, "secret sprawl" olarak bilinen kaosa yol açar:

  • Konfigürasyon Sızıntıları: Sırlar, konfigürasyon dosyalarına (config.yml, web.config) düz metin olarak yazılır ve yanlışlıkla Git repolarına gönderilir.
  • Güvensiz Ortam Değişkenleri: Sırlar, orkestrasyon platformlarında (Kubernetes, Docker Swarm) ortam değişkenleri olarak tanımlanır. Bu, düz metin koddan daha iyi olsa da, loglara sızma veya kubectl describe pod gibi komutlarla yetkisiz kişiler tarafından ifşa olma riski taşır.
  • Güvensiz Anahtar Paylaşımı: En tehlikeli modellerden biri, birden fazla servisin aynı sırrı paylaşmasıdır. Örneğin, JWT'leri imzalamak için tüm mikroservisler arasında paylaşılan tek bir simetrik HS256 anahtarı düşünün. Bu servislerden herhangi biri ele geçirilirse, saldırgan tüm sistem adına geçerli token'lar üretebilir.

Bu sorunlar, "sıfır güven" (zero trust) ilkesiyle temelden çelişir. Nurettin Topal'ın makalesinde vurguladığı gibi, iç ağda olmaları servislere körü körüne güvenmek için bir neden değildir.

Mikro Servislerde Sıfır Güven Modeli: API Gateway ile ...

Bu makale, "internal servisler zaten güvenli" yanılgısını yıkarak, dağıtık mimarilerde neden her servisin kimliğinin doğrulanması gerektiğini mükemmel bir şekilde açıklıyor. Konumuzun felsefi temelini anlamak için bu bölümleri okumanızı öneririm.

Makalenin başlangıcından ilk bölüme odaklanın. Burada, geleneksel ağ temelli güvenin neden yetersiz kaldığı ve sıfır güvenin neden gerekli olduğu anlatılıyor. Ardından, Alternatif Yaklaşım bölümünü okuyarak, güvenliğin merkezi bir gateway katmanına taşınmasının mimari avantajlarını anlayın. Bu, dersin ilerleyen kısımlarında ele alacağımız merkezi sır yönetimi konsepti için zemin hazırlayacaktır.


Çözüm: Merkezi Sır Yönetimi (Secret Management)

Secret sprawl sorununu çözmenin modern yolu, sırları merkezi ve güvenli bir kasada (vault) saklamaktır. Uygulamalar artık sırları kendi içlerinde barındırmaz; bunun yerine çalışma zamanında (runtime) bu merkezi kasadan talep ederler. HashiCorp Vault, AWS Secrets Manager ve Azure Key Vault bu alandaki popüler çözümlerdir.

Bu sistemlerin çalışma mantığını anlamak için Taner Saydam'ın HashiCorp Vault'u tanıttığı videoyu inceleyelim. Bu video, bir sırrın merkezi bir kasaya nasıl kaydedildiğini ve bir .NET uygulamasından nasıl güvenli bir şekilde okunduğunu pratik olarak gösteriyor.

HashiCorp Vault'ı İnceleyelim, Docker Container ile ayağa kaldıralım ve .NET de çağıralım

Bu video, merkezi sır yönetimi konseptini somut bir örnek üzerinden anlatıyor. Bir kod denetçisi olarak, uygulamaların bu tür sistemlerle nasıl etkileşime girdiğini anlamak, potansiyel konfigürasyon sızıntılarını ve zayıf entegrasyon desenlerini tespit etmek için kritik öneme sahiptir.

Öncelikle, giriş bölümünü izleyerek Vault'un ne işe yaradığına dair genel bir fikir edinin. Ardından, bir sırrın Vault'a nasıl eklendiğini görmek için bu bölümü izleyin. Burada secret/app1/config gibi bir yol (path) yapısı kullanıldığına dikkat edin. Kod denetiminde bu yollar, sırların nerede tanımlandığını gösteren önemli ipuçlarıdır. Son olarak, en kritik bölüm olan .NET uygulamasından sır okuma kısmını dikkatle inceleyin. Kodda şu unsurları aramalısınız: Vault adresi, kimlik doğrulama metodu (burada token kullanılıyor) ve sırrın yolu. Güvensiz bir implementasyonda, bu değerlerin kendisi (özellikle Vault'a erişim token'ı) kodun içine hard-code edilebilir. Bu, bir zafiyeti başka bir zafiyetle takas etmekten farksızdır.


Anahtar Rotasyonunun Anatomisi

Sırları merkezi bir yerde saklamak ilk adımdır. İkinci ve daha zorlu adım ise bu sırları periyodik olarak değiştirmektir; yani rotasyon. Rotasyon, bir sırrın sızması durumunda saldırganın sahip olduğu erişim süresini kısıtlar. Manuel rotasyon hem hataya açık hem de genellikle ihmal edilen bir süreçtir. Bu nedenle hedef, otomatik rotasyon olmalıdır.

Otomatik rotasyon genellikle "rotator" adı verilen, özel yetkilere sahip bir fonksiyon (örneğin AWS Lambda veya Azure Function) tarafından gerçekleştirilir. Bu fonksiyonun temel adımları şunlardır:

  1. createSecret: Sırrın yeni bir versiyonunu oluşturur (örn. yeni bir veritabanı şifresi üretir).
  2. setSecret: Bu yeni sırrı hem hedef sistemde (örn. veritabanı kullanıcısının şifresini günceller) hem de merkezi kasada (Vault/Key Vault) günceller.
  3. testSecret: Uygulamanın yeni sır ile hedef sisteme başarılı bir şekilde erişebildiğini doğrular.
  4. finishSecret: Test başarılı olursa, eski sır versiyonunu kullanımdan kaldırır (deprecate/disable).

Aşağıdaki akış şemaları bu süreci görselleştirmektedir.

Bu akış şeması, bir sır rotasyon sürecinin mantıksal adımlarını detaylandırır. Özellikle `createSecret`, `setSecret`, `testSecret` ve `finishSecret` gibi dört ana aşamayı ve her aşamadaki potansiyel başarısızlık yollarını (örneğin yeni anahtarın test edilememesi) gösterir. Güvenli bir rotasyon mekanizması, bu hata durumlarını yönetebilmeli ve gerekirse süreci geri alarak (rollback) sistemi kararlı bir durumda bırakmalıdır.
Bu mimari diyagram, Azure üzerinde otomatik anahtar rotasyonunun pratik bir implementasyonunu göstermektedir. Azure Key Vault, süresi dolmak üzere olan bir sır için bir olay (event) tetikler. Azure Event Grid bu olayı yakalar ve bir Azure Function'ı (rotator fonksiyonu) tetikler. Fonksiyon, yönetilen kimlik (managed identity) kullanarak kimliğini doğrular, yeni bir sır oluşturur ve Key Vault'u günceller. Bu, bulut ortamlarında sır rotasyonunu otomatize etmek için yaygın ve güvenli bir desendir.

Derinlemesine Analiz: Dağıtık Kimliklerde Anahtar Yönetimi

Şimdi, bu genel prensipleri dağıtık sistemlerde kimlik doğrulamanın temel taşı olan JWT'ler (JSON Web Tokens) özelinde inceleyelim. Bu, "güvensiz anahtar paylaşımı" ve "secret rotation açıkları" konularını en net görebileceğimiz alandır.

Sorun: Simetrik Anahtarların (HS256) Paylaşımı

Daha önce de belirttiğimiz gibi, birden fazla mikroservisin JWT'leri doğrulamak için aynı HS256 simetrik sırrını paylaşması büyük bir risktir. Bu, "içerideki her şeye güven" varsayımına dayanan zayıf bir modeldir.

Çözüm: Asimetrik Anahtarlar (RS256) ve JWKS

Doğru yaklaşım, asimetrik bir algoritma (RS256, ES256 vb.) kullanmaktır:

  • Özel Anahtar (Private Key): Sadece ve sadece merkezi kimlik doğrulama servisi (Auth Service) tarafından JWT'leri imzalamak için kullanılır ve asla paylaşılmaz.
  • Genel Anahtar (Public Key): Diğer tüm mikroservisler tarafından, gelen JWT'lerin imzasını doğrulamak için kullanılır. Güvenle dağıtılabilir.

Bu model, bir servis ele geçirilse bile saldırganın yeni token'lar imzalayamamasını sağlar. Ancak bu yeni bir soru doğurur: Mikroservisler, genel anahtarı nasıl güvenli bir şekilde elde edecek ve anahtar döndüğünde (rotate edildiğinde) yenisini nasıl öğrenecekler?

Cevap, JWKS (JSON Web Key Set) standardıdır. Auth Service, genellikle /.well-known/jwks.json altında, imza doğrulamada kullanılabilecek geçerli genel anahtarların bir listesini yayınlar. Her anahtarın bir kimliği (kid - Key ID) bulunur. Bu kid, imzalanan her JWT'nin başlık (header) kısmına eklenir.

Bir servis, JWT'yi doğrulamak için:

  1. JWT başlığındaki kid'i okur.
  2. Kendi önbelleğinde bu kid'e karşılık gelen genel anahtar var mı diye kontrol eder.
  3. Varsa, o anahtarla imzayı doğrular.
  4. Yoksa, Auth Service'in JWKS endpoint'ine giderek en güncel anahtar listesini çeker, önbelleğini günceller ve doğrulamayı yapar.

Bu mekanizma, anahtar rotasyonunun istemci servisleri etkilemeden, sorunsuz bir şekilde yapılmasına olanak tanır. Auth Service, yeni bir anahtar çifti oluşturur, yeni genel anahtarı JWKS endpoint'ine ekler ve yeni token'ları bu yeni özel anahtarla imzalamaya başlar. Eski anahtar ise bir süre daha JWKS listesinde tutularak, hala dolaşımda olan eski token'ların doğrulanabilmesini sağlar.

JWT implementasyonları için en iyi pratikleri ve kod örneklerini içeren aşağıdaki kaynağı dikkatle inceleyelim.

JWT Kimlik Doğrulaması: 2026'nın En İyi Güvenlik Uygulamaları

Bu kaynak, modern JWT güvenliği için kapsamlı bir rehber niteliğindedir. Özellikle dağıtık sistemlerde asimetrik anahtar yönetimi ve rotasyonu üzerine pratik bilgiler ve kod örnekleri içerir.

Öncelikle, RS256 bölümünü okuyun. Burada, asimetrik anahtarların neden mikroservisler için daha güvenli olduğu ve kid ile JWKS kullanılarak anahtar rotasyonunun nasıl kolaylaştırıldığı açıklanmaktadır. Daha sonra, JWKS Uç Noktası bölümündeki NestJS kod örneğini inceleyin. Bu kod, bir jwks.json endpoint'inin nasıl oluşturulduğunu ve genel anahtarın bu standart formatta nasıl sunulduğunu göstermektedir.

Kod Denetiminde Kritik Kontrol: JWT doğrulaması yapan bir kodu incelerken en kritik zafiyetlerden biri, kütüphanenin jku (JWK Set URL) veya jwk (JSON Web Key) başlık parametrelerini körü körüne kullanmasıdır. Eğer kod, doğrulamada kullanacağı genel anahtarın adresini (jku) veya kendisini (jwk) doğrudan token'ın başlığından alıyorsa, saldırgan kendi anahtarını içeren bir token oluşturarak sistemi kandırabilir. Doğrulama kodu, güvenilir genel anahtar kaynağını (JWKS endpoint'i) mutlaka yapılandırmadan (config) almalıdır. Yukarıda incelediğiniz kaynakta bu zafiyet "JWT Başlık Ekleme (jwk/jku)" başlığı altında da ele alınmıştır.


İleri Seviye Rotasyon: Refresh Token Rotation

Anahtar rotasyonu sadece sistem anahtarları için geçerli değildir. Kullanıcıların uzun ömürlü oturumlarını temsil eden "refresh token"lar da bir nevi sırdır ve rotasyona tabi tutulmalıdır. Refresh Token Rotation, çalınan bir refresh token'ın tespit edilmesini sağlayan güçlü bir güvenlik mekanizmasıdır.

Mantık şöyledir:

  1. Bir istemci, elindeki refresh token'ı kullanarak yeni bir access token talep eder.
  2. Auth Service, bu refresh token'ı doğrular.
  3. Doğrulama başarılı olursa, istemciye yeni bir access token VE yeni bir refresh token verir.
  4. En kritik adım: Kullanılan eski refresh token'ı anında geçersiz kılar (veritabanında revoked olarak işaretler).

Peki bu ne işe yarar? Bir saldırgan, kullanıcının refresh token'ını çaldı diyelim.

  • Saldırgan bu token'ı kullanır ve yeni bir access/refresh token çifti alır. Eski token veritabanında geçersiz kılınır.
  • Bu sırada, meşru kullanıcı kendi uygulamasıyla (elindeki artık geçersiz olan token ile) yeni bir access token talep eder.
  • Auth Service, zaten geçersiz kılınmış bir token'ın tekrar kullanılmaya çalışıldığını görür. Bu, bir "token tekrar kullanım saldırısı" (token reuse attack) işaretidir.
  • Sistem bu durumda, bu kullanıcıya ait tüm aktif oturumları sonlandırabilir ve kullanıcıyı uyarabilir.

Bu desen, sızıntının etkisini sınırlamanın ötesine geçerek, sızıntıyı aktif olarak tespit etmemizi sağlar.

JWT Kimlik Doğrulaması: 2026'nın En İyi Güvenlik Uygulamaları

Bu bölüm, Refresh Token Rotation mekanizmasını detaylı bir kod örneği ve veritabanı şemasıyla açıklıyor. Bir kod denetiminde bu deseni aramak ve doğru implemente edilip edilmediğini kontrol etmek, ileri seviye bir yetkinliktir.

Lütfen bu bölümü dikkatle inceleyin. Kodun mantığını takip edin: Gelen refresh token veritabanında aranır. Token bulunamazsa veya zaten geçersizse, bu durum potansiyel bir saldırı olarak değerlendirilir. Token geçerliyse, kullanıldı olarak işaretlenir (revoked: true). Kullanıcı için tamamen yeni bir access ve refresh token çifti oluşturulur.


Özet ve Sonraki Adımlar

Bu derste, dağıtık mimarilerde sır yönetiminin statik değil, dinamik bir yaşam döngüsü süreci olduğunu gördük.

Anahtar Çıkarımlar:

  • Konfigürasyon Sızıntıları: Sırların kod, konfigürasyon dosyaları veya güvensiz ortam değişkenleri içinde saklanması "secret sprawl" yaratır. Çözüm, HashiCorp Vault gibi merkezi sır yönetimi sistemleri kullanmaktır.
  • Güvensiz Anahtar Paylaşımı: Özellikle JWT'ler için, birden fazla servis arasında simetrik anahtar (HS256) paylaşmak, tek bir servisin ele geçirilmesiyle tüm sistemin güvenliğini tehlikeye atar.
  • Güvenli Anahtar Yönetimi Deseni: Doğru yaklaşım, asimetrik anahtarlar (RS256) ve anahtar rotasyonunu sağlayan JWKS endpoint'leri kullanmaktır. Kod denetiminde, anahtar kaynağının yapılandırmadan geldiğini ve token başlığından okunmadığını doğrulamak kritiktir.
  • Secret Rotation Açıkları: Anahtar rotasyonu, sızıntıların etkisini sınırlar. Bu süreç, rotator fonksiyonlar aracılığıyla otomatize edilmeli ve hata durumlarını yönetebilmelidir. Refresh Token Rotation ise çalınan kullanıcı oturumlarını proaktif olarak tespit etmek için güçlü bir tekniktir.

Bu dersle birlikte, kriptografik implementasyonlardaki standart ve en iyi pratikleri derinlemesine analiz ettik. Ancak bazen geliştiriciler, standartları kullanmak yerine "tekerleği yeniden icat etmeye" çalışırlar. Bir sonraki dersimizde, tam da bu konuya odaklanacağız: Özel kriptografik protokol implementasyonlarını değerlendirerek, yerleşik standartlardan sapmaları ve mantık hatalarını nasıl tespit edeceğimizi öğreneceğiz.