全部產品
Search
文件中心

Alibaba Cloud Service Mesh:開發基於gRPC協議的自訂授權服務

更新時間:Sep 04, 2024

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函數的結果;如果沒有這個函數,則檢查attrs.Source.Principal的值是否是一個預先配置好的值。

關於authv3.CheckRequest中各個欄位的詳細含義,請參見Envoy Proto或Envoy的go-control-plane說明。

Istio提供的範例程式碼中還包含了一個extAuthzServerV2結構體。Envoy已經棄用了V2相關的API,您當前只需要實現這裡提到的V3版本的gRPC介面即可。

配置自訂授權服務

在ACK叢集中部署上一步開發的自訂授權服務後,您可以開始自訂授權服務的接入。具體操作,請參見接入gRPC協議的自訂授權服務