Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:Implement custom authorization by using the gRPC protocol

Son Güncelleme:Oct 07, 2026

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:

  1. Bir istemci, hedef bir hizmete (örneğin httpbin) istek gönderir.

  2. Sidecar proxy isteği yakalar ve yetkilendirme kontrolü için harici gRPC hizmetinize iletir.

  3. Harici hizmet isteği değerlendirir ve izin verme veya reddetme kararı döndürür.

  4. İ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:

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.

  1. Aşağıdaki içeriğe sahip ext-authz.yaml adlı bir dosya oluşturun:

    ext-authz.yaml

    # Copyright Istio Authors
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    #   you may not use this file except in compliance with the License.
    #   You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Unless required by applicable law or agreed to in writing, software
    #   distributed under the License is distributed on an "AS IS" BASIS,
    #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #   See the License for the specific language governing permissions and
    #   limitations under the License.
    
    # Example configurations for deploying ext-authz server separately in the mesh.
    
    apiVersion: v1
    kind: Service
    metadata:
      name: ext-authz
      labels:
        app: ext-authz
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 8000
      - name: grpc
        port: 9000
        targetPort: 9000
      selector:
        app: ext-authz
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ext-authz
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ext-authz
      template:
        metadata:
          labels:
            app: ext-authz
        spec:
          containers:
          - image: istio/ext-authz:0.6
            imagePullPolicy: IfNotPresent
            name: ext-authz
            ports:
            - containerPort: 8000
            - containerPort: 9000

    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.

  2. Hizmeti dağıtın:

    kubectl apply -f ext-authz.yaml

    Beklenen çıktı:

    service/ext-authz created
    deployment.apps/ext-authz created
  3. 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-authz

    Beklenen çıktı:

    2023/12/20 08:15:39 Starting gRPC server at [::]:9000
    2023/12/20 08:15:39 Starting HTTP server at [::]:8000

    Hem 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.

  4. ext-authz hizmeti için gRPC bağlantı noktasını onaylayın:

    1. ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.

    2. Clusters sayfasında ilgili kümeyi bulun ve adına tıklayın. Sol bölmede Network > Services seçeneklerini belirleyin.

    3. 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.

  1. Aşağıdaki içeriğe sahip httpbin.yaml adlı bir dosya oluşturun:

    httpbin.yaml

    # Copyright Istio Authors
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    #   you may not use this file except in compliance with the License.
    #   You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Unless required by applicable law or agreed to in writing, software
    #   distributed under the License is distributed on an "AS IS" BASIS,
    #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #   See the License for the specific language governing permissions and
    #   limitations under the License.
    
    ##################################################################################################
    # httpbin service
    ##################################################################################################
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  2. httpbin'i dağıtın:

    kubectl apply -f httpbin.yaml
  3. Aşağıdaki içeriğe sahip sleep.yaml adlı bir dosya oluşturun:

    sleep.yaml

    # Copyright Istio Authors
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    #   you may not use this file except in compliance with the License.
    #   You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Unless required by applicable law or agreed to in writing, software
    #   distributed under the License is distributed on an "AS IS" BASIS,
    #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #   See the License for the specific language governing permissions and
    #   limitations under the License.
    
    ##################################################################################################
    # Sleep service
    ##################################################################################################
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: curlimages/curl
            command: ["/bin/sleep", "3650d"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
  4. 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.

  1. ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneklerini belirleyin.

  2. 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.

  3. 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. test
    Service Address <Service name>.<Namespace>.svc.<Cluster domain> formatındaki hizmet uç noktası. ext-authz.default.svc.cluster.local
    Port(1 - 65535) Yetkilendirme hizmetinin gRPC bağlantı noktası. 9000
    Timeout(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.

  1. ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneklerini belirleyin.

  2. 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.

  3. 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. test1
    Policy 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. default
    Effective 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ü. httpbin
    Request Matching Rules Yetkilendirme kontrolünü tetikleyen istek koşulları. Add Request Target bölümünde Paths seçeneğini etkinleştirin. /headers

    Bu yapılandırmayla yalnızca httpbin hizmetindeki /headers yoluna 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.

Ayrıca bkz.