すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:gRPC ベースのカスタム認証サービスを開発する

最終更新日:Jan 13, 2025

Service Mesh (ASM) は、包括的な認証と承認の構成をサポートしています。 HTTP および gRPC ベースのカスタム認証サービスや認証プロセスなど、柔軟な拡張機能を提供します。このトピックでは、gRPC ベースのカスタム認証サービスを開発する方法について説明します。

背景情報

カスタム認証サービスのアーキテクチャについては、HTTP ベースのカスタム認証サービスを開発する で説明されています。 HTTP ベースのカスタム認証サービスとは異なり、gRPC ベースのカスタム認証サービスが受信するメッセージは HTTP リクエストではなく、Envoy 固有の gRPC メッセージです。カスタム認証サービスは、Envoy から提供された情報に基づいて、リクエストを許可するかどうかを決定します。

構成の概要

ASM コンソールで、カスタム認証サービスの定義ページでカスタム認証サービスを登録できます。登録後、認証ポリシーで認証サービスを使用するメッシュプロキシを指定できます。詳細については、gRPC プロトコルを使用してカスタム認証サービスに接続する をご参照ください。

HTTP ベースのカスタム認証サービスと比較して、gRPC ベースのカスタム認証サービスにはヘッダー関連の構成がありません。すべてのヘッダーは、gRPC ベースの認証リクエストから直接取得できます。

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 API を実装しています。

type AuthorizationServer interface {
	// 受信リクエストに関連付けられた属性に基づいて認証チェックを実行し、ステータス `OK` または `OK` 以外を返します。
	Check(context.Context, *CheckRequest) (*CheckResponse, error)
}

主なロジックは Check 関数によって実装されます。

// Check は gRPC v3 チェックリクエストを実装します。
func (s *extAuthzServerV3) Check(_ context.Context, request *authv3.CheckRequest) (*authv3.CheckResponse, error) {
	attrs := request.GetAttributes()

	// リクエストを許可するか拒否するかを決定します。
	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
}

Check 関数はリクエストのヘッダーをチェックし、ヘッダー値が allowedValue の場合、allow 関数の結果を返します。このヘッダーが存在しない場合、Check 関数は attrs.Source.Principal の値がプリセット値かどうかをチェックします。

authv3.CheckRequest のフィールドの詳細については、Envoy Proto または Envoy go-control-plane の説明をご参照ください。

Istio によって提供されるサンプルコードには、extAuthzServerV2 構造体も含まれています。 Envoy は V2 関連の API を廃止しています。 Check 関数の宣言で説明されている V3 gRPC API のみを実装する必要があります。

カスタム認証サービスを構成する

前の手順で開発したカスタム認証サービスを ACK クラスタにデプロイした後、カスタム認証サービスにアクセスできます。詳細については、gRPC プロトコルを使用してカスタム認証を実装する をご参照ください。