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 callerRincian 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:
Kluster Container Service for Kubernetes (ACK) yang ditambahkan ke instans ASM Anda. Untuk informasi lebih lanjut, lihat The cluster is added to the ASM instance.
kubectl yang terhubung ke kluster ACK. Untuk informasi lebih lanjut, lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster
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.
Anda dapat menggunakan layanan contoh berikut atau membuat sendiri berdasarkan kode sumber di GitHub.
Buat file bernama
ext-authz.yamldengan konten berikut:Terapkan manifes:
kubectl apply -f ext-authz.yamlVerifikasi 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-authzNAME READY STATUS RESTARTS AGE ext-authz-6b5db88f86-2m7c6 2/2 Running 0 79mKonfirmasi 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-authz2023/12/20 08:15:39 Starting gRPC server at [::]:9000 2023/12/20 08:15:39 Starting HTTP server at [::]:8000Catat 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.
Buat file bernama
httpbin.yamldengan konten berikut:Terapkan manifes:
kubectl apply -f httpbin.yamlBuat file bernama
sleep.yamldengan konten berikut: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.
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > 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.
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 |
| Nama untuk mengidentifikasi layanan otorisasi di ASM. |
Service Address |
| Nama domain lengkap (fully qualified domain name) dari layanan otorisasi. Format: |
Port(1 - 65535) |
| Port HTTP dari layanan otorisasi. |
Timeout(second) |
| 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.CatatanHeader
x-ext-authzditeruskan ke layanan otorisasi sehingga dapat memeriksa nilainya dan membuat keputusan allow atau deny.
Overwrite Header when authentication passes: Aktifkan opsi ini dan tambahkan
x-ext-authz-check-result.
Overwrite Header when authentication fails: Aktifkan dan tambahkan
x-ext-authz-check-result.
Langkah 4: Buat kebijakan otorisasi
Buat kebijakan otorisasi yang menentukan permintaan mana yang memerlukan pemeriksaan otorisasi.
Di Konsol ASM, navigasi ke instans ASM Anda dan pilih Mesh Security Center > AuthorizationPolicy. Klik Create.
Konfigurasikan parameter berikut lalu klik Create.
Parameter
Nilai untuk tutorial ini
Deskripsi
Name
test1Nama 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
defaultPada tab Workload Scope, pilih namespace tempat workload target berjalan.
Effective Scope
Service
Terapkan kebijakan pada level layanan.
Workload
httpbinWorkload yang akan dilindungi dengan pemeriksaan otorisasi.
Request Matching Rules
Paths:
/headersDi 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 -iHasil 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 requestPath /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" -sHasil 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.yamlJuga hapus layanan otorisasi dan kebijakan dari Konsol ASM:
Navigasi ke Mesh Security Center > AuthorizationPolicy, pilih kebijakan
test1, lalu hapus.Navigasi ke Mesh Security Center > Custom Authorization Service, pilih
test4http, lalu hapus.
Langkah selanjutnya
Kembangkan layanan otorisasi kustom berbasis HTTP: Bangun layanan otorisasi siap produksi yang disesuaikan dengan logika bisnis Anda.
Kembangkan layanan otorisasi kustom berbasis gRPC: Gunakan gRPC alih-alih HTTP untuk pemeriksaan otorisasi dengan latensi lebih rendah.
Implementasikan otorisasi kustom menggunakan protokol gRPC: Konfigurasikan ASM untuk menggunakan layanan otorisasi eksternal berbasis gRPC.
Gunakan kebijakan otorisasi untuk mengontrol traffic akses dari layanan di instans ASM ke website eksternal: Kelola traffic outbound dari layanan di instans ASM Anda ke website eksternal.
Gunakan kebijakan otorisasi untuk mengontrol traffic akses dari layanan di instans ASM ke database eksternal: Kelola traffic outbound dari layanan di instans ASM Anda ke database eksternal.
Gunakan fitur audit operasi KubeAPI di ASM: Catat dan lacak operasi harian pengguna berbeda di instans ASM Anda.
Konfigurasikan alert audit untuk operasi resource ASM: Pantau dan beri alert atas perubahan konfigurasi ASM.