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 インスタンスにインポートする際に、[認証リクエスト内に元のヘッダーを保持する] パラメーターを構成する必要があります。そうしないと、対応するレスポンスを取得できません。