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

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

最終更新日:Jan 13, 2025

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

背景情報

ASM では、ゲートウェイで JWT ベースの要求認証を構成して、要求 ID を認証できます。JWT は JSON Web Token の略です。ASM インスタンスでは、デフォルトで相互 TLS (mTLS) 証明書を使用して要求の ID を認証します。要求の ID を確認した後、承認ポリシーを使用して要求の動作を制限できます。前述の標準機能に加えて、ASM はカスタム承認サービスもサポートしています。次の図は、カスタム承認サービスの全体的なプロセスを示しています。

HTTP を使用してカスタム承認サービスに接続するようにデータを構成すると、メッシュプロキシ (ゲートウェイまたはサイドカープロキシ) は受信したリクエスト情報を HTTP ベースの認証リクエストに記入し、そのリクエストをカスタム承認サービスに送信します。カスタム承認サービスは、リクエストを許可するかどうかを決定します。

  • カスタム承認サービスがステータスコード 200 を返した場合、リクエストは検証に合格し、許可される必要があります。

  • カスタム承認サービスがステータスコード 5xx を返した場合、承認サービスは異常です。リクエストは、構成に基づいて許可または拒否されます。

  • 別のステータスコードが返された場合、検証は失敗し、リクエストは拒否される必要があります。

構成の概要

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

HTTP ベースのカスタム承認サービスを開発する

ASM はオープンソースの Istio と互換性があります。オープンソースの Istio は、カスタム承認サービスの開発例を提供しています。このトピックで説明されている HTTP ベースのカスタム承認サービスの主要なロジックは、ServeHTTP 関数で定義されています。

// ServeHTTP は HTTP チェックリクエストを実装します。
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))
	}
}

ご覧のとおり、この関数はリクエストのヘッダーをチェックします。ヘッダーの値が allowedValue の場合、ステータスコード 200 が返され、リクエストが許可されたことを示します。それ以外の場合、ステータスコード 403 が返され、リクエストが拒否されたことを示します。

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

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

重要

この承認サービスでは、checkHeader 変数に対応するヘッダーが使用されます。したがって、カスタム承認サービスを ASM インスタンスにインポートする際に、[認証リクエスト内に元のヘッダーを保持する] パラメーターを構成する必要があります。そうしないと、対応するレスポンスを取得できません。