All Products
Search
Document Center

Alibaba Cloud Service Mesh:Implementasikan otorisasi kustom menggunakan protokol gRPC

Last Updated:Mar 11, 2026

Service Mesh (ASM) mendukung otorisasi eksternal yang mendelegasikan keputusan kontrol akses ke layanan gRPC kustom yang Anda sebarkan dan kelola. Fitur ini berguna ketika kebijakan otorisasi bawaan tidak memenuhi kebutuhan Anda—misalnya, saat mengintegrasikan dengan sistem autentikasi internal atau menerapkan aturan bisnis khusus.

Tutorial ini menyebarkan layanan otorisasi gRPC contoh, mendaftarkannya ke ASM, membuat kebijakan otorisasi, dan memverifikasi alur end-to-end. Layanan contoh ini mengizinkan permintaan yang menyertakan header x-ext-authz: allow dan menolak semua permintaan lainnya.

Cara kerja

Saat Anda mengaktifkan otorisasi eksternal di ASM, alur permintaan bekerja sebagai berikut:

  1. Klien mengirim permintaan ke layanan target (misalnya, httpbin).

  2. Proxy sidecar mencegat permintaan tersebut dan mengirim permintaan pemeriksaan otorisasi ke layanan gRPC eksternal Anda.

  3. Layanan eksternal mengevaluasi permintaan dan mengembalikan keputusan izinkan atau tolak.

  4. Jika diizinkan, permintaan dilanjutkan ke layanan target. Jika ditolak, proxy segera mengembalikan error ke klien.

Pemeriksaan otorisasi hanya dipicu untuk permintaan yang sesuai dengan aturan yang didefinisikan dalam kebijakan otorisasi Anda. Permintaan ke path atau layanan yang tidak tercakup oleh kebijakan akan dilewatkan tanpa pemeriksaan eksternal.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Langkah 1: Sebarkan layanan otorisasi eksternal

Sebarkan layanan otorisasi berbasis gRPC di kluster ACK Anda. Layanan ini mengimplementasikan API Envoy ext_authz dan menangani pemeriksaan otorisasi untuk permintaan masuk.

Layanan contoh yang digunakan di sini mengizinkan permintaan yang membawa header x-ext-authz: allow dan menolak semua permintaan lainnya. Gunakan contoh ini apa adanya atau sesuaikan dengan logika Anda sendiri. Kode sumber tersedia di GitHub.

  1. Buat file bernama ext-authz.yaml dengan konten berikut:

    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.
    
    # Contoh konfigurasi untuk menyebarkan server ext-authz secara terpisah dalam 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

    Layanan ini mengekspos dua port: HTTP pada port 8000 dan gRPC pada port 9000. Tutorial ini menggunakan port gRPC (9000).

  2. Sebarkan layanan tersebut:

    kubectl apply -f ext-authz.yaml

    Output yang diharapkan:

    service/ext-authz created
    deployment.apps/ext-authz created
  3. Verifikasi bahwa layanan sedang berjalan:

    kubectl logs "$(kubectl get pod -l app=ext-authz -n default -o jsonpath={.items..metadata.name})" -n default -c ext-authz

    Output yang diharapkan:

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

    Server gRPC dan HTTP keduanya harus berjalan. Jika tidak ada output, tunggu beberapa detik hingga pod dimulai dan coba lagi.

  4. Konfirmasi port gRPC untuk layanan ext-authz:

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Di halaman Clusters, temukan kluster dan klik namanya. Di panel kiri, pilih Network > Services.

    3. Di halaman Services, klik ext-authz.

    Di bagian Endpoint, port gRPC ditampilkan. Dalam contoh ini, port tersebut adalah 9000.

Langkah 2: Sebarkan aplikasi contoh

Sebarkan aplikasi httpbin dan sleep. httpbin berfungsi sebagai layanan target yang menerima permintaan, sedangkan sleep berfungsi sebagai klien yang mengirim permintaan.

  1. Buat file bernama httpbin.yaml dengan konten berikut:

    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.
    
    ##################################################################################################
    # Layanan httpbin
    ##################################################################################################
    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. Sebarkan httpbin:

    kubectl apply -f httpbin.yaml
  3. Buat file bernama sleep.yaml dengan konten berikut:

    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.
    
    ##################################################################################################
    # Layanan Sleep
    ##################################################################################################
    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. Deploy sleep:

    kubectl apply -f sleep.yaml

Langkah 3: Daftarkan layanan otorisasi eksternal di ASM

Daftarkan layanan ext-authz yang disebarkan pada Langkah 1 sebagai penyedia otorisasi kustom di instans ASM Anda. Hal ini memberi tahu lapisan kontrol mesh ke mana harus mengarahkan pemeriksaan otorisasi.

  1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Pada halaman Mesh Management, klik nama instance ASM Anda. Di panel navigasi sebelah kiri, pilih Mesh Security Center > Custom Authorization Service, lalu klik Define Custom Authorization Service.

  3. Di halaman Register Custom Authorization Service, klik tab Custom authorization service (HTTP or gRPC protocol) implemented based on envoy.ext_authz. Konfigurasikan parameter berikut dan klik Create.

    Parameter wajib

    ParameterDeskripsiNilai contoh
    ProtocolProtokol yang digunakan oleh layanan otorisasi.GRPC
    NameNama untuk pendaftaran layanan otorisasi ini.test
    Service AddressTitik akhir layanan dalam format <Service name>.<Namespace>.svc.<Cluster domain>.ext-authz.default.svc.cluster.local
    Port(1 - 65535)Port gRPC dari layanan otorisasi.9000
    Timeout(second)Waktu maksimum menunggu respons otorisasi. Jika layanan tidak merespons dalam periode ini, permintaan dianggap tidak sah (kecuali jika Anda mengaktifkan opsi skip di bawah).10

    Parameter opsional

    ParameterDeskripsi
    Skip authentication while authorization service is unavailableJika diaktifkan, permintaan diizinkan jika layanan otorisasi tidak dapat dijangkau. Jika dinonaktifkan, permintaan ditolak.
    Error code returned by asm proxy while Auth-Service is not availableKode error HTTP kustom yang dikembalikan kepada pemanggil saat layanan otorisasi tidak tersedia. Hanya tersedia jika Skip authentication while authorization service is unavailable dinonaktifkan.
    Carry origin request body within auth requestJika diaktifkan, badan permintaan asli diteruskan ke layanan otorisasi. Tetapkan panjang maksimum badan. Jika Allow send incomplete message to Auth-Service juga diaktifkan, badan yang melebihi panjang maksimum akan dipotong, bukan ditolak.

Langkah 4: Buat kebijakan otorisasi

Buat kebijakan otorisasi untuk menentukan permintaan mana yang memerlukan pemeriksaan otorisasi eksternal.

  1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instans ASM Anda. Di panel navigasi kiri, pilih Mesh Security Center > AuthorizationPolicy. Klik Create.

  3. Di halaman Create, konfigurasikan parameter berikut dan klik Create.

    ParameterDeskripsiNilai contoh
    NameNama untuk kebijakan otorisasi.test1
    Policy TypeJenis kebijakan otorisasi.Custom Authorization Service
    Custom Authorization ServiceLayanan otorisasi eksternal yang akan digunakan.grpcextauth-test(GRPC)
    NamespaceNamespace tempat kebijakan berlaku. Atur di tab Workload Scope.default
    Effective ScopeApakah kebijakan berlaku untuk layanan tertentu atau seluruh namespace.Service
    WorkloadBeban kerja target untuk kebijakan ini.httpbin
    Request Matching RulesKondisi permintaan yang memicu pemeriksaan otorisasi. Aktifkan Paths di bagian Add Request Target./headers

    Dengan konfigurasi ini, hanya permintaan ke path /headers pada layanan httpbin yang menjalani pemeriksaan otorisasi eksternal. Permintaan ke path lain (seperti /ip) tidak terpengaruh.

Langkah 5: Verifikasi alur otorisasi

Uji pengaturan dengan mengirim permintaan dari pod sleep ke layanan httpbin. Tiga skenario berikut mengonfirmasi bahwa otorisasi berfungsi dengan benar.

Skenario 1: Permintaan ke path yang tidak dilindungi

Kirim permintaan ke /ip, yang tidak tercakup oleh kebijakan otorisasi:

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"

Output yang diharapkan:

200

Kode status 200 mengonfirmasi bahwa pemeriksaan otorisasi eksternal tidak dipicu untuk path ini.

Skenario 2: Permintaan ditolak oleh layanan otorisasi

Kirim permintaan ke /headers dengan header x-ext-authz: deny:

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

Output yang diharapkan:

denied by ext_authz for not found header `x-ext-authz: allow` in the request

Permintaan mencapai layanan otorisasi eksternal, tetapi layanan tersebut menolaknya karena header x-ext-authz: allow yang diperlukan tidak ada.

Skenario 3: Permintaan diizinkan oleh layanan otorisasi

Kirim permintaan ke /headers dengan header x-ext-authz: allow:

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

Output yang diharapkan:

{
  "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"
  }
}

Header X-Ext-Authz-Check-Result: allowed dalam respons mengonfirmasi bahwa layanan otorisasi menyetujui permintaan tersebut. Respons ini juga menyertakan identitas SPIFFE dari klien (sleep) dan server (httpbin), yang menunjukkan bahwa mutual TLS aktif antara layanan-layanan tersebut.

Ketiga skenario ini mengonfirmasi bahwa kebijakan otorisasi berfungsi sesuai harapan: hanya permintaan ke /headers dengan header x-ext-authz: allow yang diizinkan.

Lihat juga