All Products
Search
Document Center

Alibaba Cloud Service Mesh:Implementasikan otorisasi kustom menggunakan protokol HTTP

Last Updated:Mar 20, 2026

Service Mesh (ASM) mendukung otorisasi eksternal melalui filter Envoy ext_authz. Alih-alih menyematkan logika otorisasi di setiap microservice, Anda mendelegasikan keputusan akses ke layanan otorisasi eksternal terpusat. Pendekatan ini memisahkan otorisasi dari kode aplikasi dan memungkinkan penerapan kontrol akses yang konsisten di seluruh mesh.

Tutorial ini memandu Anda melalui seluruh proses penyiapan: men-deploy layanan otorisasi eksternal contoh, mendaftarkannya ke ASM, membuat kebijakan otorisasi, dan memverifikasi perilaku end-to-end. Layanan contoh hanya menyetujui permintaan yang menyertakan header x-ext-authz: allow.

Cara kerja

Ketika klien mengirim permintaan ke layanan yang dilindungi, sidecar Envoy mencegat permintaan tersebut dan meneruskannya ke layanan otorisasi eksternal. Layanan otorisasi memeriksa atribut permintaan—header, path, dan metode—lalu mengembalikan keputusan allow atau deny. Envoy kemudian meneruskan permintaan ke layanan upstream atau mengembalikan error kepada pemanggil.

Client  -->  Envoy sidecar  -->  ext-authz service
                  |                      |
                  |<-- allow/deny -------+
                  |
         allow --> upstream service
         deny  --> 403 Forbidden to caller

Rincian perilaku:

  • Pemeriksaan otorisasi hanya dipicu untuk permintaan yang sesuai dengan aturan dalam kebijakan otorisasi. Misalnya, Anda dapat membatasi pemeriksaan hanya untuk path tertentu.

  • Permintaan yang tidak sesuai dengan aturan apa pun dilewatkan tanpa pemeriksaan otorisasi.

  • Jika layanan otorisasi eksternal tidak tersedia, ASM secara default menolak semua permintaan yang sesuai (fail-closed). Anda dapat mengonfigurasi perilaku fail-open jika diperlukan.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Langkah 1: Deploy layanan otorisasi eksternal

Deploy layanan ext-authz di kluster ACK. Layanan ini mematuhi spesifikasi API otorisasi eksternal Istio dan mendukung protokol HTTP maupun gRPC.

Catatan

Anda dapat menggunakan layanan contoh berikut atau membuat sendiri berdasarkan kode sumber di GitHub.

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

    Lihat ext-authz.yaml

       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
  2. Terapkan manifes:

       kubectl apply -f ext-authz.yaml
  3. Verifikasi bahwa Pod sedang berjalan: Output yang diharapkan:

       kubectl logs "$(kubectl get pod -l app=ext-authz -n default -o jsonpath={.items..metadata.name})" -n default -c ext-authz
       NAME                         READY   STATUS    RESTARTS   AGE
       ext-authz-6b5db88f86-2m7c6   2/2     Running   0          79m
  4. Konfirmasi bahwa layanan otorisasi berhasil dimulai: Output yang diharapkan:

       kubectl logs "$(kubectl get pod -l app=ext-authz -n default -o jsonpath={.items..metadata.name})" -n default -c ext-authz
       2023/12/20 08:15:39 Starting gRPC server at [::]:9000
       2023/12/20 08:15:39 Starting HTTP server at [::]:8000
  5. Catat titik akhir HTTP: ext-authz.default.svc.cluster.local:8000. Nilai ini diperlukan saat mendaftarkan layanan ke ASM pada langkah berikutnya. Untuk mengonfirmasi port, buka Konsol ACK. Navigasi ke Clusters > *kluster Anda* > Network > Services, klik ext-authz, lalu periksa bagian Service Address.

Langkah 2: Deploy aplikasi contoh

Deploy aplikasi httpbin dan sleep untuk menguji perilaku otorisasi.

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

    Lihat httpbin.yaml

       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. Terapkan manifes:

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

    Lihat sleep.yaml

       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. Terapkan manifes:

       kubectl apply -f sleep.yaml

Langkah 3: Daftarkan layanan otorisasi ke ASM

Daftarkan layanan ext-authz agar ASM dapat mengarahkan pemeriksaan otorisasi ke layanan tersebut.

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

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

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

Parameter wajib

Parameter

Nilai untuk tutorial ini

Deskripsi

Protocol

HTTP

Protokol yang digunakan oleh layanan otorisasi.

Name

test4http

Nama untuk mengidentifikasi layanan otorisasi di ASM.

Service Address

ext-authz.default.svc.cluster.local

Nama domain lengkap (fully qualified domain name) dari layanan otorisasi. Format: <Service name>.<Namespace>.svc.<Cluster domain>.

Port(1 - 65535)

8000

Port HTTP dari layanan otorisasi.

Timeout(second)

10

Waktu maksimum dalam detik bagi layanan otorisasi untuk merespons. Permintaan yang melebihi timeout ini dianggap gagal.

Parameter opsional

Parameter

Description

Skip authentication while authorization service is unavailable

Mengontrol perilaku fail-open atau fail-closed. Jika diaktifkan, ASM mengizinkan permintaan saat layanan otorisasi tidak dapat dijangkau (fail-open). Jika dinonaktifkan (nilai default), ASM menolak permintaan (fail-closed). Evaluasi implikasi keamanan sebelum mengaktifkan fail-open di lingkungan produksi.

Error code returned by asm proxy while Auth-Service is not available

Kode kesalahan HTTP kustom yang dikembalikan saat layanan otorisasi tidak tersedia. Opsi ini hanya tersedia jika Skip authentication while authorization service is unavailable dinonaktifkan.

Carry origin header within auth request

Meneruskan header permintaan klien tertentu ke layanan otorisasi. Tentukan satu atau beberapa kunci header. ASM menyertakan header yang sesuai dari permintaan klien dalam pemeriksaan otorisasi. Hanya berlaku untuk protokol HTTP.

Add a header in the authentication request

Menambahkan header tambahan (pasangan kunci-nilai) ke permintaan otorisasi. Jika kunci header tersebut sudah ada dalam permintaan klien, ASM akan menimpa nilai aslinya. Hanya berlaku untuk protokol HTTP.

Overwrite Header when authentication fails

Setelah pemeriksaan otorisasi berhasil, timpa header tertentu dalam permintaan klien dengan header dari tanggapan otorisasi sebelum meneruskan ke layanan hulu. Hanya berlaku untuk protokol HTTP.

Overwrite Header when authentication fails

Setelah pemeriksaan otorisasi gagal, timpa header tertentu dalam tanggapan yang dikirim ke pemanggil dengan header dari tanggapan otorisasi. Hanya berlaku untuk protokol HTTP.

Carry origin request body within auth request

Menyertakan badan permintaan klien dalam permintaan otorisasi, hingga panjang maksimum tertentu. Jika Allow send incomplete message to Auth-Service juga diaktifkan, ASM memotong badan permintaan hingga panjang yang ditentukan.

Konfigurasi untuk tutorial ini

Konfigurasikan parameter opsional berikut untuk tutorial ini. Biarkan semua parameter opsional lainnya tetap dinonaktifkan.

  • Carry origin header within auth request: Aktifkan dan tambahkan x-ext-authz.

    Catatan

    Header x-ext-authz diteruskan ke layanan otorisasi sehingga dapat memeriksa nilainya dan membuat keputusan allow atau deny.

    Carry headers within an authentication request

  • Overwrite Header when authentication passes: Aktifkan opsi ini dan tambahkan x-ext-authz-check-result.

    Overwrite headers when authentication passes

  • Overwrite Header when authentication fails: Aktifkan dan tambahkan x-ext-authz-check-result.

    Overwrite headers when authentication fails

Langkah 4: Buat kebijakan otorisasi

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

  1. Di Konsol ASM, navigasi ke instans ASM Anda dan pilih Mesh Security Center > AuthorizationPolicy. Klik Create.

  2. Konfigurasikan parameter berikut lalu klik Create.

    Parameter

    Nilai untuk tutorial ini

    Deskripsi

    Name

    test1

    Nama untuk mengidentifikasi kebijakan otorisasi.

    Policy Type

    Custom Authorization Service

    Mendelegasikan otorisasi ke layanan otorisasi eksternal yang didaftarkan di Langkah 3.

    Custom Authorization Service

    httpextauth-test4http(HTTP)

    Layanan otorisasi yang didaftarkan di Langkah 3.

    Namespace

    default

    Pada tab Workload Scope, pilih namespace tempat workload target berjalan.

    Effective Scope

    Service

    Terapkan kebijakan pada level layanan.

    Workload

    httpbin

    Workload yang akan dilindungi dengan pemeriksaan otorisasi.

    Request Matching Rules

    Paths: /headers

    Di bawah Add Request Target, aktifkan Paths dan atur nilainya ke /headers. Hanya permintaan ke path ini yang memicu otorisasi.

Langkah 5: Verifikasi perilaku otorisasi

Jalankan tiga kasus uji dari Pod sleep untuk memastikan otorisasi berfungsi sesuai harapan.

Uji 1: Permintaan ke path yang tidak dilindungi

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"

Hasil yang diharapkan: 200

Path /ip tidak sesuai dengan aturan /headers dalam kebijakan otorisasi, sehingga permintaan dilewatkan tanpa pemeriksaan otorisasi.

Uji 2: Permintaan ke path yang dilindungi dengan header 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 -i

Hasil yang diharapkan: 403 Forbidden

HTTP/1.1 403 Forbidden
x-ext-authz-check-result: denied
...
denied by ext_authz for not found header `x-ext-authz: allow` in the request

Path /headers sesuai dengan kebijakan otorisasi, sehingga permintaan diteruskan ke layanan ext-authz. Karena nilai header adalah deny dan bukan allow, otorisasi gagal. Header x-ext-authz-check-result: denied mengonfirmasi penolakan tersebut, sesuai konfigurasi di Langkah 3.

Uji 3: Permintaan ke path yang dilindungi dengan header 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

Hasil yang diharapkan: 200 dengan respons JSON

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.default:8000",
    "User-Agent": "curl/8.5.0",
    "X-Ext-Authz": "allow",
    "X-Ext-Authz-Check-Result": "allowed",
    ...
  }
}

Pemeriksaan otorisasi berhasil. Header X-Ext-Authz-Check-Result: allowed mengonfirmasi bahwa layanan ext-authz menyetujui permintaan tersebut.

Pertimbangan keamanan dan operasional

  • Fail-open vs. fail-closed: Secara default, ASM menolak permintaan ketika layanan otorisasi tidak tersedia (fail-closed). Untuk beralih ke mode fail-open, aktifkan Skip authentication while authorization service is unavailable dalam konfigurasi layanan otorisasi. Evaluasi dampak keamanan sebelum mengaktifkan fail-open di lingkungan produksi—konfigurasi fail-open memungkinkan permintaan tanpa autentikasi ketika layanan otorisasi down.

  • Urutan filter: Tempatkan pemeriksaan otorisasi di awal pipeline pemrosesan permintaan. Jika filter lain (seperti filter Lua) mengubah routing setelah pemeriksaan otorisasi, permintaan bisa melewati otorisasi. Untuk informasi lebih lanjut tentang risiko ini, lihat dokumentasi Envoy ext_authz.

  • Penyesuaian timeout: Atur timeout otorisasi berdasarkan latensi yang diharapkan dari layanan otorisasi Anda. Timeout yang terlalu singkat dapat menyebabkan penolakan palsu saat beban tinggi.

Pembersihan

Hapus resource yang dibuat dalam tutorial ini:

kubectl delete -f ext-authz.yaml
kubectl delete -f httpbin.yaml
kubectl delete -f sleep.yaml

Juga hapus layanan otorisasi dan kebijakan dari Konsol ASM:

  1. Navigasi ke Mesh Security Center > AuthorizationPolicy, pilih kebijakan test1, lalu hapus.

  2. Navigasi ke Mesh Security Center > Custom Authorization Service, pilih test4http, lalu hapus.

Langkah selanjutnya