複数のアプリケーションが Service Mesh (ASM) のイングレスゲートウェイを共有する場合、通常、各アプリケーションは独自の認証ロジックを実装するため、作業が重複し、セキュリティリスクが増大します。OAuth 2.0 上に構築された ID レイヤーである OpenID Connect (OIDC) は、ゲートウェイレベルでのシングルサインオン (SSO) を可能にします。ユーザーが一度ログインすると、ゲートウェイは検証済みの JSON Web トークン (JWT) を、コードの変更なしにすべてのバックエンドアプリケーションに転送します。
仕組み
ユーザーがイングレスゲートウェイにリクエストを送信します。
ゲートウェイは有効なセッションクッキーを確認します。存在しない場合、ユーザーを ID プロバイダー (IdP) のログインページにリダイレクトします。
認証後、IdP は認証コードとともにユーザーをゲートウェイのコールバック URL (
/oauth2/callback) にリダイレクトします。ゲートウェイはコードをトークンと交換し、セッションクッキーを設定し、
Authorizationヘッダーに JWT を含めてリクエストをバックエンドに転送します。バックエンドは JWT ペイロードからユーザー ID を読み取ります。IdP への直接の呼び出しは不要です。
前提条件
開始する前に、以下を確認してください。
ASM インスタンスにデプロイされたアプリケーション。詳細については、「ASM インスタンスに関連付けられたクラスターにアプリケーションをデプロイする」をご参照ください。
ターゲットの名前空間で自動サイドカープロキシ注入が有効になっていること。詳細については、「サイドカープロキシ注入ポリシーの設定」をご参照ください。
ASM インスタンスにイングレスゲートウェイが作成され、その IP アドレスが記録されていること。詳細については、「イングレスゲートウェイの作成」および「Istio リソースを使用してトラフィックをサービスの異なるバージョンにルーティングする」のステップ 3 のサブステップ 1 をご参照ください。
IdP が設定されていること。詳細については、「Alibaba Cloud IDaaS と ASM を統合してシングルサインオンを実装する」の「ステップ 1」および「ステップ 2」をご参照ください。
IdP の設定後、OIDC 設定のために以下の値を収集します。
リダイレクト URI: http://<ingress-gateway-ip>/oauth2/callback
発行者 URL: https://eiam-api-cn-hangzhou.aliyuncs.com/v2/<idaas-instance-id>/app_<app-id>/oidc
クライアント ID: <your-client-id>
クライアントシークレット: <your-client-secret>リダイレクト URI は、ご利用の IdP に登録されたコールバック URL と完全に一致する必要があります。不一致があると、IdP がコールバックリクエストを拒否するため、認証が失敗します。
以下の手順では、ID プロバイダーとして Alibaba Cloud IDentity as a Service (IDaaS) を使用します。Keycloak などのセルフマネージド OIDC IdP を使用する場合は、「Keycloak と ASM を統合してシングルサインオンを実装する」をご参照ください。
OIDC 設定の構成
ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、対象の ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [イングレスゲートウェイ] を選択します。
[イングレスゲートウェイ] ページで、対象のイングレスゲートウェイをクリックします。左側のナビゲーションウィンドウで、[ゲートウェイセキュリティ] > [OIDC シングルサインオン] を選択します。
[OIDC 設定] ステップで、[ゲートウェイ OIDC シングルサインオンを有効にする] をオンにし、以下のパラメーターを設定します。
説明利用可能なエンドポイントとサポートされているスコープを検出するには、ご利用の IdP の well-known 設定エンドポイントにクエリを実行します。
curl <your-issuer-url>/.well-known/openid-configuration | jqパラメーター 説明 リダイレクトアドレス OIDC コールバックのプロトコルとアドレス。この例では、[イングレスゲートウェイの IP アドレスを使用] と [http] を選択します。 コールバックアドレス 認証後に IdP がユーザーをリダイレクトする完全な URL。 OIDC 発行者 URL OIDC 発行者を識別し、認証するために使用される URL。ゲートウェイはこの URL からディスカバリエンドポイントを導出し、IdP の公開鍵とエンドポイントをフェッチします。 クライアント ID アプリケーションを登録したときに IdP によって割り当てられたクライアント ID。 クライアントシークレット IdP によって割り当てられたクライアントシークレット。 Cookie シークレット セキュアなセッションクッキーのためのシード文字列。Base64 でエンコードできます。 Cookie の有効期限 セッションクッキーが有効である期間。 0に設定すると、クッキーは有効期限が切れません。Cookie の更新間隔 セッションクッキーが更新される頻度。自動更新を無効にする場合は 0に設定します。スコープ IdP にリクエストする OIDC スコープ (例: openid、email、profile)。IdP は指定されたスコープをサポートしている必要があります。
[次へ] をクリックします。
パスのマッチングルールの構成
[マッチングルール] ステップで、OIDC 認証を必要とするリクエストパスを設定します。この例では、[一致した場合に認証] を選択し、パスを
/productpageに設定します。/productpageへのリクエストは認証のために IdP にリダイレクトされますが、他のパスへのリクエストは OIDC チェックなしで通過します。パラメーター 説明 一致モード パスルールの適用方法を制御します。有効な値: [一致した場合に認証] -- 指定されたパスへのリクエストは認証が必要です。[一致した場合に認証をバイパス] -- 指定されたパスへのリクエストは認証をスキップします。 マッチングルールの追加 [パス] スイッチをオンにし、パスを指定します。この例では、パスを /productpageに設定します。[送信] をクリックします。[完了] ステップで、OIDC ベースの SSO が設定されたことが確認されます。ページには、ウィザードによって生成されたネイティブの Istio セキュリティリソースが表示されます。[YAML] をクリックして、リソースの設定を確認します。
設定の確認
ブラウザを開き、
http://<ingress-gateway-ip>/productpageにアクセスします。<ingress-gateway-ip>をご利用のイングレスゲートウェイの IP アドレスに置き換えます。設定が正しければ、ブラウザは IdP のログインページにリダイレクトされます。認証後、ブラウザはリダイレクトされ、アプリケーションページが表示されます。
ログアウトの設定
完全な SSO ログアウトには、ゲートウェイのセッションクッキーのクリアと IdP セッションの終了という 2 つのアクションが必要です。
| アクション | トリガー方法 |
|---|---|
| ゲートウェイのセッションクッキーをクリアする | http://<ingress-gateway-ip>/oauth2/sign_out にアクセスします。ゲートウェイは自動的にセッションクッキーをクリアします。 |
| IdP セッションを終了する | ご利用の IdP によって公開されているログアウト URI にアクセスします。 |
シングルステップログアウト (ASM v1.18.147 以降)
ASM v1.18.147 以降では、OIDC 設定ページで IdP ログアウトエンドポイントを設定することにより、両方のアクションを組み合わせることができます。
OIDC 設定ページに IdP ログアウトエンドポイントの URL を入力します。
/oauth2/sign_outパスを [一致した場合に認証をバイパス] に設定するマッチングルールを追加し、サインアウトパスが認証を必要としないようにします。
この設定後、/oauth2/sign_out にアクセスすると、セッションクッキーがクリアされ、1 つのステップで IdP ログアウトエンドポイントにリダイレクトされます。IDaaS のシングルログアウトの詳細については、「SLO」をご参照ください。
よくある質問
アプリケーションで OIDC 認証を処理する必要がありますか?
いいえ。イングレスゲートウェイが OIDC フロー全体を処理します。ご利用のアプリケーションは、IdP によって発行された JWT を含む Authorization ヘッダー付きの各リクエストを受け取ります。ゲートウェイはこのトークンをすでに検証済みのため、アプリケーションはそれを直接解析して sub、email、またはカスタムクレームなどのユーザー情報を抽出できます。IdP への追加の呼び出しは不要です。
セッションクッキーは何のために使用されますか?
ゲートウェイは、各ユーザーの認証状態を追跡するためにセッションクッキーを使用します。ご利用のアプリケーションはこのクッキーを安全に無視できます。ユーザー ID にアクセスするには、代わりに Authorization ヘッダーから JWT を読み取ってください。
IdP から拡張ユーザー属性を取得するにはどうすればよいですか?
追加の ASM 設定は不要です。拡張属性は、ご利用の IdP の実装に依存します。Alibaba Cloud IDaaS については、「OIDC id_token 拡張フィールドのルール」をご参照ください。
参照
IDaaS ドキュメントの「一般設定」、「SSO の設定」、「OIDC SSO 設定」、および「OIDC id_token 拡張フィールドのルール」
SLO -- Alibaba Cloud IDaaS のグローバルログアウト