Service Mesh (ASM)支援完善的認證、授權配置,還提供了靈活的擴充能力,支援對接HTTP協議和gRPC協議的自訂授權服務,並接入網格的鑒權流程。本文介紹如何開發一個基於HTTP協議的自訂授權服務。
背景資訊
在開發基於HTTP協議的自訂授權服務中介紹了自訂授權服務的架構。與HTTP協議自訂授權服務不同,gRPC協議自訂授權服務收到的訊息並不是一個HTTP請求,而是一個Envoy專用的gRPC訊息。您需要做的就是從Envoy提供的資訊中判斷是否允許存取請求。
配置介紹
ASM支援使用介面關聯一個自訂授權服務,關聯之後您可以在授權策略中配置要使用鑒權服務的網格代理。具體操作,請參見使用gRPC協議對接自訂授權服務。
gRPC協議的自訂授權服務配置比較少,和HTTP協議的自訂授權服務相比沒有Header相關配置。您可以直接從gRPC的鑒權請求中拿到所有Header。
開發gRPC自訂授權服務
ASM相容開源Istio服務網格,Istio社區提供了自訂授權服務的開發樣本。這部分代碼中同時實現了HTTP和gRPC兩種協議的自訂授權服務。本文涉及的gRPC部分主要邏輯在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)
這個結構體主要實現了AuthorizationServer
介面,介面定義如下:
type AuthorizationServer interface {
// Performs authorization check based on the attributes associated with the
// incoming request, and returns status `OK` or not `OK`.
Check(context.Context, *CheckRequest) (*CheckResponse, error)
}
主要的邏輯在自行實現的Check函數中:
// Check implements gRPC v3 check request.
func (s *extAuthzServerV3) Check(_ context.Context, request *authv3.CheckRequest) (*authv3.CheckResponse, error) {
attrs := request.GetAttributes()
// Determine whether to allow or deny the request.
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
}
可以看出,此函數判斷了一個請求的header,如果這個header的值是allowedValue
就返回allow函數的結果;如果沒有這個header,則檢查attrs.Source.Principal
的值是否是一個預先配置好的值。
關於authv3.CheckRequest
中各個欄位的詳細含義,請參見Envoy Proto或Envoy的go-control-plane說明。
Istio提供的範例程式碼中還包含了一個extAuthzServerV2
結構體。Envoy已經棄用了V2相關的API,您當前只需要實現這裡提到的V3版本的gRPC介面即可。
配置自訂授權服務
在ACK叢集中部署上一步開發的自訂授權服務後,您可以開始自訂授權服務的接入。具體操作,請參見接入gRPC協議的自訂授權服務。