Service Mesh (ASM) mendukung konfigurasi otentikasi dan otorisasi yang komprehensif serta menyediakan kemampuan ekstensi fleksibel seperti layanan otorisasi kustom berbasis HTTP dan gRPC. Topik ini menjelaskan cara mengembangkan layanan otorisasi kustom berbasis HTTP.
Informasi latar belakang
ASM memungkinkan Anda mengonfigurasi otentikasi permintaan berbasis JWT pada gateway untuk mengotentikasi identitas permintaan. JWT adalah singkatan dari JSON Web Token. Secara default, sertifikat mTLS (mutual TLS) digunakan untuk mengotentikasi identitas permintaan dalam instance ASM. Setelah identitas permintaan dikonfirmasi, Anda dapat menggunakan kebijakan otorisasi untuk membatasi perilaku permintaan tersebut. Selain kemampuan standar tersebut, ASM juga mendukung layanan otorisasi kustom. Gambar berikut menunjukkan proses keseluruhan dari layanan otorisasi kustom.
Jika Anda mengonfigurasi data untuk menggunakan HTTP guna terhubung ke layanan otorisasi kustom, proxy mesh (gateway atau proxy sidecar) akan mengisi informasi permintaan yang diterima dalam permintaan otentikasi berbasis HTTP dan mengirimkan permintaan tersebut ke layanan otorisasi kustom. Layanan otorisasi kustom kemudian menentukan apakah permintaan tersebut diizinkan.
Jika layanan otorisasi kustom mengembalikan kode status 200, permintaan lolos verifikasi dan harus diizinkan.
Jika layanan otorisasi kustom mengembalikan kode status 5xx, layanan otorisasi mengalami masalah. Permintaan diizinkan atau ditolak berdasarkan konfigurasi Anda.
Jika kode status lain dikembalikan, verifikasi gagal dan permintaan harus ditolak.
Pengenalan konfigurasi
Di Konsol ASM, Anda dapat mendaftarkan layanan otorisasi kustom di halaman Tentukan Layanan Otorisasi Kustom. Setelah pendaftaran, Anda dapat menentukan proxy mesh yang akan menggunakan layanan otorisasi dalam kebijakan otorisasi. Untuk informasi lebih lanjut, lihat Gunakan Protokol HTTP untuk Terhubung ke Layanan Otorisasi Kustom.
Mengembangkan layanan otorisasi kustom berbasis HTTP
ASM kompatibel dengan Istio open source. Istio open source menyediakan contoh pengembangan layanan otorisasi kustom. Bagian kode ini mengimplementasikan layanan otorisasi kustom untuk protokol HTTP dan gRPC. Logika utama layanan otorisasi kustom berbasis HTTP yang disebutkan dalam topik ini didefinisikan dalam fungsi ServeHTTP:
// ServeHTTP mengimplementasikan permintaan pengecekan HTTP.
func (s *ExtAuthzServer) ServeHTTP(response http.ResponseWriter, request *http.Request) {
body, err := io.ReadAll(request.Body)
if err != nil {
log.Printf("[HTTP] membaca body gagal: %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][diizinkan]: %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][ditolak]: %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))
}
}Seperti yang Anda lihat, fungsi ini memeriksa header permintaan. Jika nilai header adalah allowedValue, kode status 200 dikembalikan, yang menunjukkan bahwa permintaan diizinkan. Sebaliknya, kode status 403 dikembalikan, yang menunjukkan bahwa permintaan ditolak.
Konfigurasikan layanan otorisasi kustom
Setelah Anda menerapkan layanan otorisasi kustom yang dikembangkan pada langkah sebelumnya di kluster ACK, Anda dapat mengakses layanan otorisasi kustom. Untuk informasi lebih lanjut, lihat Implementasikan Otorisasi Kustom Menggunakan Protokol HTTP.
Header yang sesuai dengan variabel checkHeader digunakan dalam layanan otorisasi ini. Oleh karena itu, Anda harus mengonfigurasi parameter Carry origin header within auth request saat mengimpor layanan otorisasi kustom ke instance ASM. Jika tidak, respons yang sesuai tidak dapat diperoleh.