Service Mesh (ASM), erişim kontrolü kararlarını sizin dağıttığınız ve yönettiğiniz özel bir gRPC hizmetine devreden harici yetkilendirmeyi destekler. Bu özellik, yerleşik yetkilendirme ilkelerinin ihtiyaçlarınızı karşılamadığı durumlarda — örneğin şirket içi bir kimlik doğrulama sistemiyle entegrasyon veya işe özel kuralların uygulanması gibi senaryolarda — oldukça kullanışlıdır.
Bu öğreticide örnek bir gRPC yetkilendirme hizmeti dağıtır, ASM'ye kaydeder, bir yetkilendirme ilkesi oluşturur ve uçtan uca akışı doğrularsınız. Örnek hizmet, x-ext-authz: allow başlığını içeren isteklere izin verir ve diğer tüm istekleri reddeder.
Nasıl çalışır?
ASM'de harici yetkilendirmeyi etkinleştirdiğinizde istek akışı şu şekilde işler:
Bir istemci, hedef bir hizmete (örneğin httpbin) istek gönderir.
Sidecar proxy isteği yakalar ve yetkilendirme kontrolü için harici gRPC hizmetinize iletir.
Harici hizmet isteği değerlendirir ve izin verme veya reddetme kararı döndürür.
İzin verilirse istek hedef hizmete ulaşır. Reddedilirse proxy hemen istemciye bir hata döndürür.
Yetkilendirme kontrolleri yalnızca yetkilendirme ilkenizde tanımlanan kurallarla eşleşen istekler için tetiklenir. İlke kapsamında olmayan yollara veya hizmetlere yapılan istekler harici kontrole tabi tutulmadan doğrudan geçer.
Ön koşullar
Başlamadan önce aşağıdaki gereksinimleri karşıladığınızdan emin olun:
Container Service for Kubernetes (ACK) kümeniz ASM örneğinize eklenmiş olmalıdır. Daha fazla bilgi için bkz. Kümeyi ASM örneğine ekleme
kubectl, ACK kümenize bağlanacak şekilde yapılandırılmış olmalıdır. Daha fazla bilgi için bkz. Kümenin kubeconfig dosyasını alma ve kubectl ile kümeye bağlanma
Adım 1: Harici yetkilendirme hizmetini dağıtma
ACK kümenizde gRPC tabanlı bir yetkilendirme hizmeti dağıtın. Bu hizmet, Envoy ext_authz API'sini uygular ve gelen istekler için yetkilendirme kontrollerini yürütür.
Burada kullanılan örnek hizmet, x-ext-authz: allow başlığını taşıyan isteklere izin verir ve diğerlerini reddeder. Bu örneği olduğu gibi kullanabilir veya kendi mantığınıza göre özelleştirebilirsiniz. Kaynak koduna GitHub üzerinden erişebilirsiniz.
-
Aşağıdaki içeriğe sahip ext-authz.yaml adlı bir dosya oluşturun:
Hizmet iki bağlantı noktasını açığa çıkarır: 8000 numaralı bağlantı noktasında HTTP ve 9000 numaralı bağlantı noktasında gRPC. Bu öğreticide gRPC bağlantı noktası (9000) kullanılır.
-
Hizmeti dağıtın:
kubectl apply -f ext-authz.yamlBeklenen çıktı:
service/ext-authz created deployment.apps/ext-authz created -
Hizmetin çalıştığını doğrulayın:
kubectl logs "$(kubectl get pod -l app=ext-authz -n default -o jsonpath={.items..metadata.name})" -n default -c ext-authzBeklenen çıktı:
2023/12/20 08:15:39 Starting gRPC server at [::]:9000 2023/12/20 08:15:39 Starting HTTP server at [::]:8000Hem gRPC hem de HTTP sunucuları çalışıyor olmalıdır. Çıktı görünmezse pod'un başlaması için birkaç saniye bekleyip tekrar deneyin.
-
ext-authz hizmeti için gRPC bağlantı noktasını onaylayın:
ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.
Clusters sayfasında ilgili kümeyi bulun ve adına tıklayın. Sol bölmede Network > Services seçeneklerini belirleyin.
Services sayfasında ext-authz seçeneğine tıklayın.
Endpoint bölümünde gRPC bağlantı noktası görüntülenir. Bu örnekte bağlantı noktası 9000'dir.
Adım 2: Örnek uygulamaları dağıtma
httpbin ve sleep uygulamalarını dağıtın. httpbin, istekleri alan hedef hizmet olarak; sleep ise istekleri gönderen istemci olarak görev yapar.
-
Aşağıdaki içeriğe sahip httpbin.yaml adlı bir dosya oluşturun:
-
httpbin'i dağıtın:
kubectl apply -f httpbin.yaml -
Aşağıdaki içeriğe sahip sleep.yaml adlı bir dosya oluşturun:
-
sleep'i dağıtın:
kubectl apply -f sleep.yaml
Adım 3: Harici yetkilendirme hizmetini ASM'ye kaydetme
1. Adımda dağıttığınız ext-authz hizmetini ASM örneğinizde özel bir yetkilendirme sağlayıcısı olarak kaydedin. Bu işlem, mesh kontrol düzlemine yetkilendirme kontrollerinin nereye yönlendirileceğini bildirir.
ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneklerini belirleyin.
Mesh Management sayfasında ASM örneğinizin adına tıklayın. Sol gezinme bölmesinde Mesh Security Center > Custom Authorization Service seçeneklerini belirleyin. Define Custom Authorization Service seçeneğine tıklayın.
-
Register Custom Authorization Service sayfasında Custom authorization service (HTTP or gRPC protocol) implemented based on envoy.ext_authz sekmesine tıklayın. Aşağıdaki parametreleri yapılandırın ve Create seçeneğine tıklayın.
Gerekli parametreler
Parametre Açıklama Örnek değer Protocol Yetkilendirme hizmetinin kullandığı protokol. GRPC Name Bu yetkilendirme hizmeti kaydı için bir ad. testService Address <Service name>.<Namespace>.svc.<Cluster domain>formatındaki hizmet uç noktası.ext-authz.default.svc.cluster.localPort(1 - 65535) Yetkilendirme hizmetinin gRPC bağlantı noktası. 9000Timeout(second) Yetkilendirme yanıtı için beklenecek maksimum süre. Hizmet bu süre içinde yanıt vermezse istek yetkisiz olarak kabul edilir (aşağıdaki atlama seçeneği etkinleştirilmediyse). 10İsteğe bağlı parametreler
Parametre Açıklama Skip authentication while authorization service is unavailable Etkinleştirildiğinde, yetkilendirme hizmetine ulaşılamıyorsa isteklere izin verilir. Devre dışı bırakıldığında istekler reddedilir. Error code returned by asm proxy while Auth-Service is not available Yetkilendirme hizmeti kullanılamadığında arayanlara döndürülen özel HTTP hata kodu. Yalnızca Skip authentication while authorization service is unavailable devre dışı bırakıldığında kullanılabilir. Carry origin request body within auth request Etkinleştirildiğinde orijinal istek gövdesi yetkilendirme hizmetine iletilir. Maksimum gövde uzunluğu ayarlayın. Allow send incomplete message to Auth-Service da etkinleştirilirse maksimum uzunluğu aşan gövdeler reddilmek yerine kırpılır.
Adım 4: Yetkilendirme ilkesi oluşturma
Hangi isteklerin harici yetkilendirme kontrolü gerektirdiğini tanımlamak için bir yetkilendirme ilkesi oluşturun.
ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneklerini belirleyin.
Mesh Management sayfasında ASM örneğinizin adına tıklayın. Sol gezinme bölmesinde Mesh Security Center > AuthorizationPolicy seçeneklerini belirleyin. Create seçeneğine tıklayın.
-
Create sayfasında aşağıdaki parametreleri yapılandırın ve Create seçeneğine tıklayın.
Parametre Açıklama Örnek değer Name Yetkilendirme ilkesi için bir ad. test1Policy Type Yetkilendirme ilkesinin türü. Custom Authorization Service Custom Authorization Service Kullanılacak harici yetkilendirme hizmeti. grpcextauth-test(GRPC) Namespace İlsenin uygulandığı ad alanı. Workload Scope sekmesinde ayarlanır. defaultEffective Scope İlsenin belirli bir hizmete mi yoksa tüm ad alanına mı uygulanacağını belirtir. Service Workload Bu ilke için hedef iş yükü. httpbinRequest Matching Rules Yetkilendirme kontrolünü tetikleyen istek koşulları. Add Request Target bölümünde Paths seçeneğini etkinleştirin. /headersBu yapılandırmayla yalnızca httpbin hizmetindeki
/headersyoluna yapılan istekler harici yetkilendirme kontrolünden geçer. Diğer yollara (örneğin/ip) yapılan istekler etkilenmez.
Adım 5: Yetkilendirme akışını doğrulama
Sleep pod'undan httpbin hizmetine istekler göndererek kurulumu test edin. Aşağıdaki üç senaryo, yetkilendirmenin doğru çalıştığını teyit eder.
Senaryo 1: Korumasız bir yola istek
Yetkilendirme ilkesi kapsamında olmayan /ip yoluna bir istek gönderin:
kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/ip" -s -o /dev/null -w "%{http_code}\n"
Beklenen çıktı:
200
200 durum kodu, bu yol için harici yetkilendirme kontrolünün tetiklenmediğini gösterir.
Senaryo 2: Yetkilendirme hizmeti tarafından reddedilen istek
/headers yoluna x-ext-authz: deny başlığıyla bir istek gönderin:
kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/headers" -H "x-ext-authz: deny" -s
Beklenen çıktı:
denied by ext_authz for not found header `x-ext-authz: allow` in the request
İstek harici yetkilendirme hizmetine ulaşır ancak gerekli x-ext-authz: allow başlığı bulunamadığı için hizmet isteği reddeder.
Senaryo 3: Yetkilendirme hizmeti tarafından izin verilen istek
/headers yoluna x-ext-authz: allow başlığıyla bir istek gönderin:
kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/headers" -H "x-ext-authz: allow" -s
Beklenen çıktı:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.default:8000",
"User-Agent": "curl/8.5.0",
"X-Envoy-Attempt-Count": "1",
"X-Ext-Authz": "allow",
"X-Ext-Authz-Check-Result": "allowed",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=c3e5364e87add0f4f69e6b0d029f5961b404c8f209bf9004b3d21a82cf67****;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep"
}
}
Yanıttaki X-Ext-Authz-Check-Result: allowed başlığı, yetkilendirme hizmetinin isteği onayladığını gösterir. Yanıt ayrıca istemcinin (sleep) ve sunucunun (httpbin) SPIFFE kimliklerini içerir; bu da hizmetler arasında karşılıklı TLS'in aktif olduğunu kanıtlar.
Bu üç senaryo, yetkilendirme ilkesinin beklendiği gibi çalıştığını doğrular: Yalnızca /headers yoluna x-ext-authz: allow başlığına sahip olan isteklere izin verilir.