Service Mesh (ASM) mendukung layanan otorisasi kustom berbasis protokol HTTP dan gRPC. Layanan otorisasi berbasis gRPC menerima pesan CheckRequest gRPC dari Envoy, memeriksa atribut permintaan, dan mengembalikan keputusan allow atau deny. Panduan ini memandu Anda melalui implementasi layanan tersebut dan pendaftarannya ke ASM.
Untuk arsitektur keseluruhan layanan otorisasi kustom, lihat Mengembangkan layanan otorisasi kustom berbasis HTTP.
Berbeda dengan layanan otorisasi kustom berbasis HTTP, layanan berbasis gRPC tidak memiliki konfigurasi terkait header. Semua header permintaan langsung disematkan dalam pesan CheckRequest gRPC dari Envoy.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster Container Service for Kubernetes (ACK) yang sedang berjalan dan terhubung ke ASM
Lingkungan pengembangan Go yang telah dikonfigurasi di lokal
Pemahaman tentang API otorisasi eksternal Envoy
Implementasikan server otorisasi
ASM kompatibel dengan Istio open-source. Istio menyediakan implementasi referensi yang mencakup otorisasi kustom berbasis HTTP maupun gRPC. Logika khusus gRPC berada dalam struktur extAuthzServerV3:
type extAuthzServerV3 struct{}
func (s *extAuthzServerV3) Check(_ context.Context, request *authv3.CheckRequest) (*authv3.CheckResponse, error)
func (s *extAuthzServerV3) allow(request *authv3.CheckRequest) *authv3.CheckResponse
func (s *extAuthzServerV3) deny(request *authv3.CheckRequest) *authv3.CheckResponse
func (s *extAuthzServerV3) logRequest(allow string, request *authv3.CheckRequest)Struktur ini mengimplementasikan antarmuka AuthorizationServer Envoy, yang hanya memerlukan satu metode:
type AuthorizationServer interface {
// Melakukan pemeriksaan otorisasi berdasarkan atribut yang terkait dengan
// permintaan masuk, dan mengembalikan status `OK` atau bukan `OK`.
Check(context.Context, *CheckRequest) (*CheckResponse, error)
}Logika otorisasi inti
Metode Check mengekstraksi atribut permintaan, mengevaluasinya, dan mengembalikan respons allow atau deny:
// Check mengimplementasikan permintaan pemeriksaan gRPC v3.
func (s *extAuthzServerV3) Check(_ context.Context, request *authv3.CheckRequest) (*authv3.CheckResponse, error) {
attrs := request.GetAttributes()
// Menentukan apakah permintaan diizinkan atau ditolak.
allow := false
checkHeaderValue, contains := attrs.GetRequest().GetHttp().GetHeaders()[checkHeader]
if contains {
allow = checkHeaderValue == allowedValue
} else {
allow = attrs.Source != nil && strings.HasSuffix(attrs.Source.Principal, "/sa/"+*serviceAccount)
}
if allow {
return s.allow(request), nil
}
return s.deny(request), nil
}Keputusan mengikuti dua jalur:
Pemeriksaan berbasis header — Jika permintaan berisi header
checkHeader, layanan membandingkan nilainya denganallowedValue. Kecocokan memberikan akses.Fallback berbasis identitas — Jika header tidak ada, layanan memeriksa apakah identitas sumber (
attrs.Source.Principal) diakhiri dengan/sa/<serviceAccount>. Hal ini mengizinkan permintaan dari akun layanan Kubernetes tertentu.
Referensi bidang CheckRequest
Untuk daftar lengkap bidang dalam authv3.CheckRequest, lihat:
Versi API
Envoy telah menghentikan API v2. Implementasikan hanya API gRPC v3 seperti yang ditunjukkan pada signature metode Check di atas.
Daftarkan dan terapkan layanan otorisasi
Setelah Anda men-deploy layanan otorisasi ke kluster ACK Anda:
Buka Konsol ASM dan buka halaman Define Custom Authorization Service.
Daftarkan layanan otorisasi berbasis gRPC.
Buat kebijakan otorisasi yang menentukan proxy mesh mana yang menggunakan layanan otorisasi tersebut.
Untuk langkah-langkah detail, lihat Menerapkan otorisasi kustom menggunakan protokol gRPC.
Langkah berikutnya
Menerapkan otorisasi kustom menggunakan protokol gRPC — Penyiapan dan konfigurasi end-to-end.
Mengembangkan layanan otorisasi kustom berbasis HTTP — Pendekatan alternatif menggunakan HTTP alih-alih gRPC.