Service Mesh (ASM) ile özel bir yetkilendirme hizmetini ağın yetkilendirme iş akışına HTTP veya gRPC protokolü üzerinden entegre edebilirsiniz. Bu konuda, ağ proxy'sinin bir isteğe izin verilip verilmeyeceğine karar vermek için çağırdığı özel HTTP tabanlı yetkilendirme hizmetinin nasıl geliştirileceği açıklanmaktadır.
Arka plan bilgileri
Service Mesh (ASM), yetkilendirme kurallarını uygulamadan önce isteğin kimliğini doğrular:
Ağ geçidine gelen istekler — İsteklerin kimliğini doğrulamak için ağ geçidinde JWT kimlik doğrulaması (RequestAuthentication) yapılandırın.
Ağ içindeki istekler — Ağ tarafından verilen mTLS sertifikaları varsayılan olarak istek kimliklerini doğrular.
İsteğin kimliği doğrulandıktan sonra isteğin davranışını kısıtlamak için yetkilendirme ilkesi (AuthorizationPolicy) kullanabilirsiniz. ASM bu standart yeteneklere ek olarak bir isteğe izin verilip verilmeyeceğine karar veren özel bir yetkilendirme hizmetiyle entegrasyonu destekler.
Çalışma mantığı
Özel HTTP tabanlı bir yetkilendirme hizmeti entegre ettiğinizde ağ proxy'si (ağ geçidi veya sidecar) alınan isteğin bilgilerini içeren bir HTTP yetkilendirme isteği oluşturur. Ardından ağ proxy'si bu yetkilendirme isteğini isteğe izin verilip verilmeyeceğine karar veren özel yetkilendirme hizmetine gönderir.
Özel yetkilendirme hizmetinin döndürdüğü durum kodu sonucu belirler:
200 durum kodu isteğin kontrolü geçtiğini ve isteğe izin verildiğini gösterir.
5xx durum kodu özel yetkilendirme hizmetinde bir anormallik olduğunu gösterir. Bu durumda yapılandırmanıza göre isteğe izin verilir veya istek reddedilir.
Diğer tüm durum kodları isteğin kontrolü başarısız olduğunu ve isteğin reddedildiğini gösterir.
Özel HTTP tabanlı yetkilendirme hizmetini geliştirme
ASM açık kaynaklı Istio hizmet ağı ile uyumludur ve Istio topluluğu özel bir yetkilendirme hizmetinin örnek uygulamasını sunar. Bu örnek hem HTTP hem de gRPC protokolleri için özel yetkilendirme hizmetlerini uygular. Aşağıdaki alıntı ServeHTTP işlevinde bulunan HTTP mantığını göstermektedir:
// ServeHTTP implements the HTTP check request.
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))
}
}
ServeHTTP işlevi checkHeader değişkeni tarafından belirtilen istek üstbilgisini okur. Üstbilginin değeri allowedValue değerine eşitse işlev 200 döndürür ve isteğe izin verilir. Diğer tüm durumlarda işlev 403 döndürür ve istek reddedilir.
Yukarıdaki kod örnek uygulamadan bir alıntıdır. ExtAuthzServer türü, returnIfNotTooLong işlevi ve checkHeader, allowedValue, resultHeader, overrideHeader ile receivedHeader gibi tanımlayıcılar örneğin diğer bölümlerinde tanımlanmıştır.
Bu yetkilendirme hizmeti checkHeader değişkenine karşılık gelen üstbilgiyi kullanır. Bu nedenle özel yetkilendirme hizmetini ağa aktarırken Carry origin header within auth request yapılandırma öğesini ayarlamanız gerekir. Aksi takdirde beklenen sonucu alamazsınız.
Özel yetkilendirme hizmetini ağ ile entegre etme
Geliştirdiğiniz özel yetkilendirme hizmetini Container Service for Kubernetes (ACK) kümenize dağıtın ve ardından hizmeti ASM konsolunda ASM örneğinizle ilişkilendirin. Bu konu yalnızca geliştirmeyi kapsamaktadır. Özel yetkilendirme hizmetini ağa aktarmaya ilişkin eksiksiz adımlar için bkz. HTTP protokolünü kullanarak özel yetkilendirme uygulama.
Hizmeti ilişkilendirdikten sonra yetkilendirme hizmetini kullanan ağ proxy'lerini bir yetkilendirme ilkesinde belirtin. Yetkilendirme ilkesi yapılandırması için bkz. HTTP protokolünü kullanarak özel yetkilendirme uygulama.