Application Security

Mikroservislerde Sıfır Güven: Servis Ağı ve Kimlik Tabanlı Erişim Kontrolü İçin mTLS Ötesi

Mikroservislerde Sıfır Güven: Servis Ağı ve Kimlik Tabanlı Erişim Kontrolü İçin mTLS Ötesi

Geleneksel güvenlik sınırları, monolitik dönemin bir kalıntısıdır. Uygulamaların yüzlerce geçici mikroservise ayrıldığı modern bulut-native mimarilerde, "güvenli iç ağ" kavramı fiilen ortadan kalkmıştır. İşte Sıfır Güven (Zero Trust): "Asla güvenme, her zaman doğrula" ilkesine dayalı bir güvenlik çerçevesi. Istio ve Linkerd gibi servis ağları, hizmetler arası iletişim için karşılıklı Taşıma Katmanı Güvenliği'ni (mTLS) varsayılan olarak popülerleştirmiş olsa da, sağlam bir Sıfır Güven duruşu için yalnızca şifrelemeye güvenmek artık yeterli değildir.

Bu makale, ağ odaklı güvenlikten kimlik odaklı güvenliğe yapılan kritik geçişi incelemektedir. mTLS'nin neden yalnızca bir temel olduğunu ve modern dağıtık uygulamayı güvence altına almak için ayrıntılı, kimlik tabanlı erişim kontrolünün (IBAC) neden hayati önem taşıdığını ele alacağız.

Sıfır Güven Mimarisi'nde mTLS'nin Sınırlamaları

mTLS, şüphesiz güvenli mikroservis iletişiminin omurgasıdır. İstemci ve sunucunun sertifikalar kullanarak birbirini kimlik doğrulamasını ve dinleme ile ortadaki adam (man-in-the-middle) saldırılarını önleyen şifreli bir tünel oluşturmasını sağlar. Ancak mTLS, esas olarak ağ ucunda kimin olduğunu (hizmet örneğini) doğrular, o hizmetin ne yapmasına izin verildiğini değil.

Frontend bir hizmetin kötü niyetli bir aktör tarafından ele geçirildiği veya bir geliştiricinin bir hizmete yanlışlıkla aşırı izinler verdiği bir senaryoyu düşünün. Kompromeye uğrayan hizmet ağa girdiğinde ve geçerli sertifikalara sahip olduğunda, mTLS tüneli üzerinden diğer hizmetlerle iletişim kurabilir. Ek kontroller olmadan, saldırgan fiilen frontend hizmetinin kimliğini devralır ve frontend'in erişmesine izin verilen herhangi bir arka uç kaynağına erişebilir. Bu, mTLS'nin tek başına çözemeyeceği "düz ağ" (flat network) sorunudur.

Kimlik Tabanlı Erişim Kontrolü: Bir Sonraki Katman

Gerçek bir Sıfır Güven elde etmek için, ağ kimlik doğrulamasının ötesine geçerek kimliğe dayalı yetkilendirmeye geçmemiz gerekir. Mikroservis bağlamında kimlik, kullanıcı kimlik bilgilerinin ötesine geçer; hizmet kimliğini, istek bağlamını ve iş yükü meta verilerini de kapsar.

Etkili Kimlik Tabanlı Erişim Kontrolü şunları gerektirir:

  • İş Yükü Kimliği: Her pod veya konteyner, belirli bir kimliğe sahip benzersiz bir varlık olarak kabul edilir.
  • Bağlam Bilinçli Politikalar: Erişim kararları yalnızca kaynak ve hedefe değil, aynı zamanda işleme, HTTP yöntemine ve hatta yük (payload) özniteliklerine de dayanır.
  • Kısa Ömürlü Kimlik Bilgileri: Uzun ömürlü hizmet hesapları yerine geçici tokenlar kullanarak kimlik bilgilerinin biriktirilmesini önlemek.

Modern servis ağları, bu politikaları trafiği engelleyen yan araç (sidecar) proxy'leri aracılığıyla uygular. Namespace içindeki tüm trafiğe izin vermek yerine, proxy, yönetici tarafından tanımlanan sıkı bir politika doğrultusunda isteği değerlendirir.

OPA ve Yetkilendirme ile Ayrıntılı Politikaların Uygulanması

Servis ağları taşıma katmanını sağlarken, Kubernetes ile entegre edilen Açık Politika Ajanı (Open Policy Agent - OPA) gibi açık kaynaklı politika motorları, dinamik, kimlik tabanlı yetkilendirmeye olanak tanır. Bu yaklaşım, basit izin/engelle listelerinin çok ötesine geçen karmaşık kurallar tanımlamanızı sağlar.

Örneğin, payment-service'in inventory-service'i yalnızca HTTP yöntemi GET olduğunda ve istek production namespace'indeki order-processor'dan geldiğinde çağırmasına izin verebilir, POST isteklerini veya staging'den gelen istekleri engelleyebilirsiniz.

Böyle bir politikanın, bir OPA yan aracı veya servis ağı uzantısı tarafından işlenen bir Kubernetes AuthorizationRequest kaynağında nasıl görünebileceğine dair bir örnek aşağıdadır:

apiVersion: authorization.k8s.io/v1
kind: SubjectAccessReview
metadata:
  name: service-mesh-authorization
spec:
  user: system:serviceaccount:payments:payment-service
  groups:
  - system:authenticated
  resourceAttributes:
    namespace: inventory
    verb: get
    resource: pods
    name: inventory-data-pod
status:
  allowed: true
  reason: "Politika: payment-service, production namespace'inde yalnızca inventory podlarını GET edebilir"

Üretim ortamındaki bir servis ağında, bu mantık genellikle Envoy filtrelerine veya yerel ağ politikalarına (örneğin Istio'nun AuthorizationPolicy'i) dönüştürülür; böylece kimlik ve bağlam politika ile eşleşmediğinde yan araç proxy paketi hemen düşürür.

Pratik Zorluklar ve En İyi Uygulamalar

Kimlik tabanlı erişim kontrolünün uygulanması, bazı zorluklardan uzaktır. Yüzlerce geçici hizmet için kimlikleri yönetmenin karmaşıklığı, sağlam bir Sertifika Otoritesi (CA) ve otomatik yaşam döngüsü yönetimi gerektirir. SPIFFE (SPIFFE IDs) ve SPIRE gibi araçlar, bu kısa ömürlü kimlikleri yayınlamak ve yönetmek için kritik standartlar olarak ortaya çıkmaktadır.

Bunun yanı sıra, geliştiriciler "varsayılan olarak engelle" (deny by default) zihniyetini benimsemelidir. Yeni bir mikroservis dağıtıldığında, açıkça izin verilene kadar sıfır izne sahip olduğunu varsayın. Bu genellikle, politikaların uygulama koduyla birlikte versiyon kontrolü yapılarak test edilmesini sağlamak için mevcut CI/CD pipeline'larının önemli ölçüde yeniden yapılandırılmasını gerektirir.

Sonuç

Mikroservislerde Sıfır Güven, bir varış noktası değil, bir yolculuktur. mTLS temel şifreleme ve ağ kimlik doğrulama katmanını sağlasa da, bu yalnızca ilk adımdır. Gerçek güvenlik, her isteğin niyetini ve bağlamını doğrulayan kimlik tabanlı erişim kontrolüne dayanır.

Servis ağlarını dinamik politika motorları ve standartlaştırılmış iş yükü kimlikleriyle entegre ederek, organizasyonlar tek bir kompromize uğramış hizmetin toplam bir ihlale dönüşemeyeceği dirençli bir güvenlik duruşu oluşturabilir. Orta ve ileri düzey geliştiriciler için odak noktası artık yalnızca mTLS'yi etkinleştirmekten, kimin ne yapabileceğini ve hangi koşullar altında yapabileceğini sıkı bir şekilde tanımlamaya ve uygulamaya kaymalıdır.

Share: