Service Mesh (ASM) memungkinkan Anda mengintegrasikan layanan otorisasi kustom ke dalam alur kerja otorisasi mesh melalui protokol HTTP atau gRPC. Topik ini menjelaskan cara mengembangkan layanan otorisasi kustom berbasis HTTP yang dipanggil oleh proxy mesh untuk menentukan apakah suatu permintaan diizinkan.
Informasi latar belakang
Service Mesh (ASM) mengotentikasi identitas permintaan sebelum menerapkan aturan otorisasi:
Permintaan yang tiba di gateway — Konfigurasikan otentikasi JWT (RequestAuthentication) pada gateway untuk mengotentikasi identitas permintaan.
Permintaan di dalam mesh — Identitas permintaan secara default diautentikasi menggunakan sertifikat mTLS yang dikeluarkan oleh mesh.
Setelah identitas permintaan dikonfirmasi, Anda dapat menggunakan kebijakan otorisasi (AuthorizationPolicy) untuk membatasi perilaku permintaan tersebut. Selain kemampuan standar ini, ASM mendukung integrasi dengan layanan otorisasi kustom guna menentukan apakah suatu permintaan diizinkan.
Cara kerja
Saat Anda mengintegrasikan layanan otorisasi kustom berbasis HTTP, proxy mesh (gateway atau sidecar) mengisi permintaan otorisasi HTTP dengan informasi dari permintaan yang diterima, lalu mengirimnya ke layanan otorisasi kustom untuk menentukan apakah permintaan tersebut diizinkan.
Kode status yang dikembalikan oleh layanan otorisasi kustom menentukan hasilnya:
Kode status 200 menunjukkan bahwa permintaan lolos pemeriksaan dan diizinkan.
Kode status 5xx menunjukkan bahwa layanan otorisasi kustom mengalami anomali. Dalam kasus ini, permintaan diizinkan atau ditolak sesuai konfigurasi Anda.
Kode status lainnya menunjukkan bahwa permintaan gagal dalam pemeriksaan dan ditolak.
Kembangkan layanan otorisasi kustom berbasis HTTP
ASM kompatibel dengan service mesh Istio open source, dan komunitas Istio menyediakan implementasi contoh layanan otorisasi kustom. Contoh tersebut mendukung protokol HTTP maupun gRPC. Cuplikan berikut menunjukkan logika HTTP dalam fungsi ServeHTTP:
// ServeHTTP mengimplementasikan permintaan pemeriksaan HTTP.
func (s *ExtAuthzServer) ServeHTTP(response http.ResponseWriter, request *http.Request) {
body, err := io.ReadAll(request.Body)
if err != nil {
log.Printf("[HTTP] read body failed: %v", err)
}
l := fmt.Sprintf("%s %s%s, headers: %v, body: [%s]\n", request.Method, request.Host, request.URL, request.Header, returnIfNotTooLong(string(body)))
if allowedValue == request.Header.Get(checkHeader) {
log.Printf("[HTTP][allowed]: %s", l)
response.Header().Set(resultHeader, resultAllowed)
response.Header().Set(overrideHeader, request.Header.Get(overrideHeader))
response.Header().Set(receivedHeader, l)
response.WriteHeader(http.StatusOK)
} else {
log.Printf("[HTTP][denied]: %s", l)
response.Header().Set(resultHeader, resultDenied)
response.Header().Set(overrideHeader, request.Header.Get(overrideHeader))
response.Header().Set(receivedHeader, l)
response.WriteHeader(http.StatusForbidden)
_, _ = response.Write([]byte(denyBody))
}
}Fungsi ServeHTTP membaca header permintaan yang ditentukan oleh variabel checkHeader. Jika nilainya sama dengan allowedValue, fungsi mengembalikan kode 200 dan permintaan diizinkan; jika tidak, fungsi mengembalikan kode 403 dan permintaan ditolak.
Kode di atas merupakan cuplikan dari implementasi contoh. Tipe ExtAuthzServer, fungsi returnIfNotTooLong, serta pengenal seperti checkHeader, allowedValue, resultHeader, overrideHeader, dan receivedHeader didefinisikan di bagian lain contoh tersebut.
Layanan otorisasi ini menggunakan header yang sesuai dengan variabel checkHeader. Oleh karena itu, Anda harus mengonfigurasi item konfigurasi Carry origin header within auth request saat mengimpor layanan otorisasi kustom ke dalam mesh. Jika tidak, hasil yang diharapkan tidak akan tercapai.
Integrasikan layanan otorisasi kustom dengan mesh
Deploy layanan otorisasi kustom yang telah Anda kembangkan ke kluster Container Service for Kubernetes (ACK), lalu kaitkan layanan tersebut dengan instans ASM Anda di Konsol ASM. Topik ini hanya mencakup pengembangan. Untuk langkah-langkah lengkap mengimpor layanan otorisasi kustom ke dalam mesh, lihat Implement custom authorization by using the HTTP protocol.
Setelah layanan dikaitkan, tentukan proxy mesh yang menggunakan layanan otorisasi tersebut dalam kebijakan otorisasi. Untuk panduan konfigurasi kebijakan otorisasi, lihat Implement custom authorization by using the HTTP protocol.