Application Security

Çevresiz Bulutu Güvence Altına Almak: BeyondCorp Desenleriyle Mikro Hizmetler İçin ZTNA Uygulaması

İç ağların güvenli, dış ağların ise düşmanca olduğu varsayımına dayanan geleneksel güvenlik modeli uzun süredir çökmüştür. Bulut-native mimariler çağında, mikro hizmetler bulut ortamlarında, yerel veri merkezlerinde ve kenar (edge) konumlarda dağıtılmış olup, "ağ" kavramının artık geçersiz olduğu karmaşık ve akışkan bir ortam yaratmaktadır. Orta düzeyden ileri düzey geliştiriciler için sorun artık sadece bir çevre (perimeter) güvence altına almak değil, bireysel yükleri (workloads) güvence altına almaktır. İşte Google'ın BeyondCorp desenlerine dayalı Sıfır Güvenlik Ağ Erişimi (ZTNA) uygulamasının bu noktada kritik hale geldiği yerdir.

Neden Mikro Hizmetler Sıfır Güvenlik Yaklaşımı Gerektirir?

Mikro hizmet mimarileri, saldırı yüzeyinin önemli ölçüde genişlemesine yol açar. API ağı üzerinden yüzlerce hizmetin iletişim kurduğu bir ortamda, yatay hareket (lateral movement) birincil tehdit vektörü haline gelir. Bir saldırgan Kubernetes kümesindeki tek bir pod'u ele geçirdiğinde, geleneksel ağ segmentasyonu genellikle diğer hizmetlere yatay hareket etmelerini durdurmada başarısız olur. BeyondCorp felsefesi senaryoyu tersine çevirir: varsayılan olarak hiçbir ağa güvenilmez. Bunun yerine, erişim oturum bazında verilir ve talep eden kullanıcıya, cihaza ve bağlama sıkıca bağlıdır.

Mikro hizmetler için bu, hizmetler arasındaki iç trafiğin, dış API trafiğiyle aynı düzeyde incelenmesi gerektiği anlamına gelir. IP tabanlı izin listelerinden kimlik tabanlı erişim kontrolüne geçerek, bir talep VPC'nin içinden gelse bile hedef hizmete ulaşmadan önce kimlik doğrulamasından ve yetkilendirmeden geçmesini sağlarız.

Kimlik Bilinir Vekil Sunucu (IAP) Deseni

Mikro hizmet ortamında ZTNA uygulamanın temeli, Kimlik Bilinir Vekil Sunucu (IAP)'dır. Hizmetleri doğrudan ağa açmak yerine, her istek kullanıcının kimliğini ve cihaz durumunu doğrulayan bir politika karar noktasından geçer ve ardından trafik iletilir. Bu, kullanıcı ile belirli bir mikro hizmet arasında güvenli bir tünel oluşturarak, halka açık IP maruziyetine gerek kalmadan bu ihtiyacı ortadan kaldırır.

Pratikte bu, tüm gelen ve giden trafiği engelleyen bir yan (sidecar) vekil sunucu veya giriş (ingress) denetleyicisi dağıtmayı içerir. Bu bileşen, bir Kimlik ve Erişim Yönetimi (IAM) sistemi tarafından tanımlanan politikaları doğrulayan ve tokenları denetleyen kapı bekçisi olarak hareket eder.

Politika Uygulama Noktasının Yapılandırılması

Kubernetes ortamında bir OPA (Open Policy Agent) veya benzeri bir yan vekil sunucu için genel bir yapılandırma kullanarak bu mantığın nasıl uygulandığına dair pratik bir örneğe bakalım. Politika, sadece "kim"in sorduğunu değil, "hangi" bağlamın var olduğunu da değerlendirmelidir.


# OPA için örnek politika.rego dosyası
package kubernetes.authz

import data.users

default allow = false

allow {
    input.request.user == "admin@example.com"
    input.request.method == "GET"
    input.resource.type == "pod"
    input.resource.namespace == "production"
    users["admin@example.com"].verified == true
    users["admin@example.com"].device_compliant == true
}

allow {
    input.request.user == "developer@example.com"
    input.request.method == "GET"
    input.resource.type == "pod"
    input.resource.namespace == "development"
    users["developer@example.com"].verified == true
}

Bu Rego politikası gereken ayrıntıyı göstermektedir. Bir kullanıcı kimlik doğrulamasından geçse bile, cihazı uyumlu olarak işaretlenmemişse ve belirli kimliği doğrulanmamışsa "production" adlı alanına (namespace) erişemez. Bu, güvenin asla varsayımsal olmaması gerektiği ilkesiyle BeyondCorp prensibiyle mükemmel bir uyum içindedir.

Hizmetten-Hizmete Kimlik Doğrulama Uygulaması

ZTNA sadece insan kullanıcılar için değildir; hizmetten-hizmete iletişim için de aynı derecede hayati öneme sahiptir. Bir BeyondCorp modelinde, hizmetler birbirlerine kimliklerini kanıtlamaları gereken varlıklar olarak hareket eder. Bu genellikle merkezi bir güven otoritesi tarafından verilen karşılıklı TLS (mTLS) veya JWT (JSON Web Token) kullanılarak sağlanır.

Hizmet A, Hizmet B'yi çağırdığında, Hizmet B'nin güvenilir bir anahtar deposuna karşı doğrulayabileceği kriptografik olarak imzalanmış bir token isteğe dahil edilmelidir. Bu, ele geçirilmiş bir hizmetin başka birini taklit etmesini engeller. Istio veya Linkerd gibi araçlar, geçerli sertifikalara sahip hizmetlerin bağlantı kurabilmesini sağlayarak mTLS el sıkışmalarını otomatikleştirir.

mTLS'nin gerekli olduğu Go tabanlı bir mikro hizmetteki istemci tarafı uygulamasını ele alalım:


// client.go - Güvenli bir mTLS bağlantısı kurma
import (
    "crypto/tls"
    "crypto/x509"
    "net/http"
)

func createSecureClient(certPath, keyPath, caPath string) (*http.Client, error) {
    cert, err := tls.LoadX509KeyPair(certPath, keyPath)
    if err != nil {
        return nil, err
    }

    caCert, err := ioutil.ReadFile(caPath)
    if err != nil {
        return nil, err
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)

    tlsConfig := &tls.Config{
        Certificates: []tls.Certificate{cert},
        RootCAs:      caCertPool,
        MinVersion:   tls.VersionTLS13,
    }

    return &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: tlsConfig,
        },
    }, nil
}

Bu kod parçası, güvenin teknik olarak uygulanmasını göstermektedir. Belirli sertifikaları yükleyerek ve TLS 1.3'ü zorlayarak, veri değişiminden önce bağlantının şifrelendiğini ve tarafların kimliklerinin doğrulandığını garanti ederiz.

Zorluklar ve En İyi Uygulamalar

Mikro hizmetler için ZTNA modeline geçiş, kendi zorluklarını beraberinde getirir. Token doğrulama ve şifrelemeden kaynaklanan performans yükü gecikmeyi etkileyebilir; ancak modern donanım hızlandırma ve verimli önbellekleme stratejileri bunu hafifletir. Ayrıca, hem insanlar hem de makineler için kimliklerin yönetilmesinin operasyonel karmaşıklığı önemli olabilir.

Başarı için geliştiriciler "güvenli başarısızlık" (fail-secure) zihniyetini benimsemelidir. Bir politika kontrolü tamamlanamazsa, erişim izin verilmemeli, reddedilmelidir. Ayrıca, tüm erişim denemelerinin sürekli izlenmesi ve loglanması esastır. Kimin, neye, ne zaman ve hangi cihazdan eriştiğini bilmeli, böylece hızlı anormallik algılama sağlanmalıdır.

Sonuç

Bulut-native bir dünyada mikro hizmetleri güvence altına almak, bakış açısında temel bir değişim gerektirir. BeyondCorp desenlerini benimseyerek ve Sıfır Güvenlik Ağ Erişimi'ni (ZTNA) uygulayarak, kurumlar kırılgan ağ çevrelerinin ötesine geçip, sağlam, kimlik odaklı bir güvenlik modeline ulaşabilir. Bu yaklaşım, bir geliştiricinin dizüstü bilgisayarından veya otomatik bir boru hattından gelen her isteğin, hassas kaynaklara erişim vermeden önce titizlikle denetlenmesini sağlar. Saldırı yüzeyi büyümeye devam ettikçe, ZTNA sadece bir en iyi uygulama değil; dayanıklı uygulama güvenliği için tek geçerli yol haritasıdır.

Share: